diff --git a/src/Model/Callback/Entity/Delivery/PackageItem.php b/src/Model/Callback/Entity/Delivery/PackageItem.php index e033c2998..3b8a1d679 100644 --- a/src/Model/Callback/Entity/Delivery/PackageItem.php +++ b/src/Model/Callback/Entity/Delivery/PackageItem.php @@ -107,6 +107,14 @@ class PackageItem */ public $markingCodes; + /** + * @var \RetailCrm\Api\Model\Entity\MarkingObject[] + * + * @JMS\Type("array") + * @JMS\SerializedName("markingObjects") + */ + public $markingObjects; + /** * @var array * diff --git a/src/Model/Entity/MarkingObject.php b/src/Model/Entity/MarkingObject.php new file mode 100644 index 000000000..97c3fef9f --- /dev/null +++ b/src/Model/Entity/MarkingObject.php @@ -0,0 +1,37 @@ +") + * @JMS\SerializedName("markingObjects") + */ + public $markingObjects; + /** * @var int * diff --git a/tests/src/Model/Callback/Entity/Delivery/PackageItemTest.php b/tests/src/Model/Callback/Entity/Delivery/PackageItemTest.php new file mode 100644 index 000000000..073de8070 --- /dev/null +++ b/tests/src/Model/Callback/Entity/Delivery/PackageItemTest.php @@ -0,0 +1,130 @@ +fromArray( + ['markingCodes' => ['legacy-code']], + PackageItem::class + ); + + self::assertNull($packageItem->markingObjects); + self::assertSame(['legacy-code'], $packageItem->markingCodes); + } + + public function testDeserializeEmptyMarkingObjects(): void + { + /** @var PackageItem $packageItem */ + $packageItem = SerializerFactory::create()->fromArray( + [ + 'markingObjects' => [], + 'markingCodes' => ['legacy-code'], + ], + PackageItem::class + ); + + self::assertSame([], $packageItem->markingObjects); + self::assertSame(['legacy-code'], $packageItem->markingCodes); + } + + public function testDeserializeNullMarkingObjects(): void + { + /** @var PackageItem $packageItem */ + $packageItem = SerializerFactory::create()->fromArray( + [ + 'markingObjects' => null, + 'markingCodes' => ['legacy-code'], + ], + PackageItem::class + ); + + self::assertNull($packageItem->markingObjects); + self::assertSame(['legacy-code'], $packageItem->markingCodes); + } + + /** + * @param array> $markingObjects + * + * @dataProvider markingObjectsProvider + */ + public function testDeserializeMarkingObjects(array $markingObjects): void + { + /** @var PackageItem $packageItem */ + $packageItem = SerializerFactory::create()->fromArray( + [ + 'markingObjects' => $markingObjects, + 'markingCodes' => ['legacy-code'], + ], + PackageItem::class + ); + + self::assertCount(count($markingObjects), $packageItem->markingObjects); + + foreach ($markingObjects as $index => $expected) { + self::assertInstanceOf(MarkingObject::class, $packageItem->markingObjects[$index]); + self::assertSame($expected['code'], $packageItem->markingObjects[$index]->code); + self::assertSame($expected['provider'], $packageItem->markingObjects[$index]->provider); + } + + self::assertSame(['legacy-code'], $packageItem->markingCodes); + } + + /** + * @return array>>> + */ + public function markingObjectsProvider(): array + { + return [ + 'one marking object' => [ + [ + [ + 'code' => 'chestny-znak-code', + 'provider' => 'chestny_znak', + ], + ], + ], + 'multiple marking objects' => [ + [ + [ + 'code' => '1234567890123456', + 'provider' => 'giis_dmdk', + ], + [ + 'code' => 'chestny-znak-code', + 'provider' => 'chestny_znak', + ], + ], + ], + 'unknown provider' => [ + [ + [ + 'code' => 'future-provider-code', + 'provider' => 'future_provider', + ], + ], + ], + ]; + } +} diff --git a/tests/src/Model/Callback/Entity/Delivery/RequestProperty/RequestSaveTest.php b/tests/src/Model/Callback/Entity/Delivery/RequestProperty/RequestSaveTest.php new file mode 100644 index 000000000..af8b9e13f --- /dev/null +++ b/tests/src/Model/Callback/Entity/Delivery/RequestProperty/RequestSaveTest.php @@ -0,0 +1,56 @@ +fromArray( + [ + 'packages' => [ + [ + 'items' => [ + [ + 'markingObjects' => [ + [ + 'code' => '1234567890123456', + 'provider' => 'giis_dmdk', + ], + ], + 'markingCodes' => ['legacy-code'], + ], + ], + ], + ], + ], + RequestSave::class + ); + + $packageItem = $request->packages[0]->items[0]; + + self::assertInstanceOf(MarkingObject::class, $packageItem->markingObjects[0]); + self::assertSame('1234567890123456', $packageItem->markingObjects[0]->code); + self::assertSame('giis_dmdk', $packageItem->markingObjects[0]->provider); + self::assertSame(['legacy-code'], $packageItem->markingCodes); + } +} diff --git a/tests/src/Model/Entity/Orders/Items/OrderProductTest.php b/tests/src/Model/Entity/Orders/Items/OrderProductTest.php new file mode 100644 index 000000000..7c08c3a1f --- /dev/null +++ b/tests/src/Model/Entity/Orders/Items/OrderProductTest.php @@ -0,0 +1,76 @@ + [ + [ + 'code' => 'chestny-znak-code', + 'provider' => 'chestny_znak', + ], + [ + 'code' => '1234567890123456', + 'provider' => 'giis_dmdk', + ], + ], + ]; + + /** @var OrderProduct $orderProduct */ + $orderProduct = $serializer->fromArray($data, OrderProduct::class); + + self::assertCount(2, $orderProduct->markingObjects); + self::assertContainsOnlyInstancesOf(MarkingObject::class, $orderProduct->markingObjects); + self::assertSame('chestny-znak-code', $orderProduct->markingObjects[0]->code); + self::assertSame('chestny_znak', $orderProduct->markingObjects[0]->provider); + self::assertSame('1234567890123456', $orderProduct->markingObjects[1]->code); + self::assertSame('giis_dmdk', $orderProduct->markingObjects[1]->provider); + self::assertSame($data, $serializer->toArray($orderProduct)); + } + + public function testLegacyMarkingCodesRoundTrip(): void + { + $serializer = SerializerFactory::create(); + $data = ['markingCodes' => ['legacy-code']]; + + /** @var OrderProduct $orderProduct */ + $orderProduct = $serializer->fromArray($data, OrderProduct::class); + + self::assertNull($orderProduct->markingObjects); + self::assertSame($data, $serializer->toArray($orderProduct)); + } + + public function testEmptyMarkingObjectsRoundTrip(): void + { + $serializer = SerializerFactory::create(); + $data = ['markingObjects' => []]; + + /** @var OrderProduct $orderProduct */ + $orderProduct = $serializer->fromArray($data, OrderProduct::class); + + self::assertSame([], $orderProduct->markingObjects); + self::assertSame($data, $serializer->toArray($orderProduct)); + } +} diff --git a/tests/src/ResourceGroup/OrdersTest.php b/tests/src/ResourceGroup/OrdersTest.php index c2b59e2b0..d2584927f 100644 --- a/tests/src/ResourceGroup/OrdersTest.php +++ b/tests/src/ResourceGroup/OrdersTest.php @@ -20,6 +20,7 @@ use RetailCrm\Api\Enum\RequestMethod; use RetailCrm\Api\Model\Entity\Delivery\SerializedEntityOrder; use RetailCrm\Api\Model\Entity\FixExternalRow; +use RetailCrm\Api\Model\Entity\MarkingObject; use RetailCrm\Api\Model\Entity\Orders\Delivery\OrderDeliveryAddress; use RetailCrm\Api\Model\Entity\Orders\Delivery\SerializedOrderDelivery; use RetailCrm\Api\Model\Entity\Orders\Items\AbstractDiscount; @@ -833,6 +834,12 @@ public function testCreate(): void "items": [ { "markingCodes": [], + "markingObjects": [ + { + "code": "1234567890123456", + "provider": "giis_dmdk" + } + ], "id": 11308, "priceType": { "code": "base" @@ -904,6 +911,7 @@ public function testCreate(): void $deliveryAddress = new OrderDeliveryAddress(); $offer = new Offer(); $item = new OrderProduct(); + $markingObject = new MarkingObject(); $payment->type = 'bank-card'; $payment->status = 'paid'; @@ -933,6 +941,10 @@ public function testCreate(): void $item->purchasePrice = 60; $item->discounts = [new AbstractDiscount(DiscountType::MANUAL_PRODUCT, 1)]; + $markingObject->code = '1234567890123456'; + $markingObject->provider = 'giis_dmdk'; + $item->markingObjects = [$markingObject]; + $order->delivery = $delivery; $order->items = [$item]; $order->payments = [$payment]; @@ -964,6 +976,20 @@ public function testCreate(): void $request->order = $order; $request->site = 'moysklad'; + $encodedRequest = static::encodeFormArray($request); + $encodedOrder = json_decode($encodedRequest['order'], true, 512, JSON_THROW_ON_ERROR); + + self::assertSame( + [ + [ + 'code' => '1234567890123456', + 'provider' => 'giis_dmdk', + ], + ], + $encodedOrder['items'][0]['markingObjects'] + ); + self::assertArrayNotHasKey('markingCodes', $encodedOrder['items'][0]); + $mock = static::createApiMockBuilder('orders/create'); $mock->matchMethod(RequestMethod::POST) ->matchBody(static::encodeForm($request))