Skip to content
This repository has been archived by the owner on Apr 25, 2023. It is now read-only.

Commit

Permalink
Merge pull request #30 from sanmai/pr/fix-26
Browse files Browse the repository at this point in the history
Метод для получения ошибочный заказов в DeliveryResponse
  • Loading branch information
sanmai committed Feb 26, 2019
2 parents 8252228 + a046004 commit c2e0eff
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 0 deletions.
7 changes: 7 additions & 0 deletions README.md
Expand Up @@ -297,6 +297,13 @@ $response = $client->sendDeliveryRequest($request);

if ($response->hasErrors()) {
// обработка ошибок

foreach ($response->getErrors() as $order) {
// заказы с ошибками
$order->getMessage();
$order->getErrorCode();
$order->getNumber();
}
}

foreach ($response->getOrders() as $order) {
Expand Down
7 changes: 7 additions & 0 deletions examples/070_DeliveryRequest.php
Expand Up @@ -79,6 +79,13 @@

if ($response->hasErrors()) {
// обработка ошибок

foreach ($response->getErrors() as $order) {
// заказы с ошибками
$order->getMessage();
$order->getErrorCode();
$order->getNumber();
}
}

foreach ($response->getOrders() as $order) {
Expand Down
19 changes: 19 additions & 0 deletions src/Responses/DeliveryResponse.php
Expand Up @@ -86,6 +86,21 @@ public function getOrders()
return $this->completeOrders;
}

/**
* @JMS\Exclude
*
* @var \Traversable|Order[]
*/
private $failedOrders;

/**
* @return \Traversable|Order[]
*/
public function getErrors()
{
return $this->failedOrders;
}

/**
* @return DeliveryRequest[]
*/
Expand Down Expand Up @@ -114,6 +129,10 @@ private function filterOrders()
$this->completeOrders = fromArray($this->orders)->filter(function (Order $order) {
return (bool) $order->getDispatchNumber();
});

$this->failedOrders = fromArray($this->orders)->filter(function (Order $order) {
return $order->getNumber() && !$order->getDispatchNumber();
});
}

/**
Expand Down
38 changes: 38 additions & 0 deletions tests/Deserialization/DeliveryResponseTest.php
Expand Up @@ -67,6 +67,44 @@ public function test_duplicate_request()
}
}

public function test_failed_orders()
{
$response = $this->getSerializer()->deserialize(FixtureLoader::load('DeliveryRequestErrors.xml'), DeliveryResponse::class, 'xml');

/** @var $response DeliveryResponse */
$this->assertInstanceOf(DeliveryResponse::class, $response);

$this->assertCount(3, $response->getMessages());

foreach ($response->getMessages() as $message) {
$this->assertTrue($message->isError());
break;
}

$this->assertCount(2, $response->getErrors());

foreach ($response->getErrors() as $order) {
$this->assertSame('Отсутствие обязательного атрибута: PVZCODE', $order->getMessage());
$this->assertSame('ERR_NEED_ATTRIBUTE', $order->getErrorCode());
$this->assertSame('123456', $order->getNumber());
break;
}

$order = iterator_to_array($response->getErrors(), false)[1];

$this->assertSame('Почтовый индекс города получателя отсутствует в базе СДЭК: RecCityPostCode=999999', $order->getMessage());
$this->assertSame('ERR_RECCITYPOSTCODE', $order->getErrorCode());
$this->assertSame('234567', $order->getNumber());

$this->assertCount(1, $response->getOrders());

foreach ($response->getOrders() as $order) {
$this->assertSame('TEST-123456', $order->getNumber());
$this->assertSame('100001234', $order->getDispatchNumber());
break;
}
}

public function test_failing_request_with_failed_auth()
{
$response = $this->getSerializer()->deserialize(FixtureLoader::load('DeliveryRequestFailedAuth.xml'), DeliveryResponse::class, 'xml');
Expand Down
7 changes: 7 additions & 0 deletions tests/Fixtures/data/DeliveryRequestErrors.xml
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<response>
<Order Number="123456" ErrorCode="ERR_NEED_ATTRIBUTE" Msg="Отсутствие обязательного атрибута: PVZCODE"/>
<Order Number="234567" ErrorCode="ERR_RECCITYPOSTCODE" Msg="Почтовый индекс города получателя отсутствует в базе СДЭК: RecCityPostCode=999999"/>
<Order Number="TEST-123456" DispatchNumber="100001234" />
<Order Msg="Добавлено заказов 1"/>
</response>

0 comments on commit c2e0eff

Please sign in to comment.