444 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			444 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\Sales\Service\V1;
 | 
						|
 | 
						|
use Magento\Sales\Model\Order;
 | 
						|
use Magento\TestFramework\TestCase\WebapiAbstract;
 | 
						|
use Magento\Sales\Api\Data\OrderInterface;
 | 
						|
 | 
						|
/**
 | 
						|
 * Test order updating via webapi
 | 
						|
 */
 | 
						|
class OrderUpdateTest extends WebapiAbstract
 | 
						|
{
 | 
						|
    private const RESOURCE_PATH = '/V1/orders';
 | 
						|
 | 
						|
    private const SERVICE_NAME = 'salesOrderRepositoryV1';
 | 
						|
 | 
						|
    private const SERVICE_VERSION = 'V1';
 | 
						|
 | 
						|
    private const ORDER_INCREMENT_ID = '100000001';
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Magento\Framework\ObjectManagerInterface
 | 
						|
     */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritDoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Check order increment id after updating via webapi
 | 
						|
     *
 | 
						|
     * @magentoApiDataFixture Magento/Sales/_files/order.php
 | 
						|
     */
 | 
						|
    public function testOrderUpdate()
 | 
						|
    {
 | 
						|
        /** @var Order $order */
 | 
						|
        $order = $this->objectManager->get(Order::class)->loadByIncrementId(self::ORDER_INCREMENT_ID);
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => self::RESOURCE_PATH,
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => self::SERVICE_NAME,
 | 
						|
                'serviceVersion' => self::SERVICE_VERSION,
 | 
						|
                'operation' => self::SERVICE_NAME . 'save',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $result = $this->_webApiCall($serviceInfo, ['entity' => $this->getOrderData($order)]);
 | 
						|
        $this->assertGreaterThan(1, count($result));
 | 
						|
        /** @var Order $actualOrder */
 | 
						|
        $actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
 | 
						|
        $this->assertEquals(
 | 
						|
            $order->getData(OrderInterface::INCREMENT_ID),
 | 
						|
            $actualOrder->getData(OrderInterface::INCREMENT_ID)
 | 
						|
        );
 | 
						|
 | 
						|
        //Ship the order and check increment id.
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/order/' . $order->getId() . '/ship',
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => 'salesShipOrderV1',
 | 
						|
                'serviceVersion' => self::SERVICE_VERSION,
 | 
						|
                'operation' => 'salesShipOrderV1' . 'execute',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $shipmentId = $this->_webApiCall($serviceInfo, $this->getDataForShipment($order));
 | 
						|
        $this->assertNotEmpty($shipmentId);
 | 
						|
        $actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
 | 
						|
        $this->assertEquals(
 | 
						|
            $order->getData(OrderInterface::INCREMENT_ID),
 | 
						|
            $actualOrder->getData(OrderInterface::INCREMENT_ID)
 | 
						|
        );
 | 
						|
 | 
						|
        //Invoice the order and check increment id.
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/invoices',
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => 'salesInvoiceRepositoryV1',
 | 
						|
                'serviceVersion' => self::SERVICE_VERSION,
 | 
						|
                'operation' => 'salesInvoiceRepositoryV1' . 'save',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $result = $this->_webApiCall($serviceInfo, ['entity' => $this->getDataForInvoice($order)]);
 | 
						|
        $this->assertNotEmpty($result);
 | 
						|
        $actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
 | 
						|
        $this->assertEquals(
 | 
						|
            $order->getData(OrderInterface::INCREMENT_ID),
 | 
						|
            $actualOrder->getData(OrderInterface::INCREMENT_ID)
 | 
						|
        );
 | 
						|
 | 
						|
        //Create creditmemo for the order and check increment id.
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/creditmemo',
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => 'salesCreditmemoRepositoryV1',
 | 
						|
                'serviceVersion' => self::SERVICE_VERSION,
 | 
						|
                'operation' => 'salesCreditmemoRepositoryV1' . 'save',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $result = $this->_webApiCall($serviceInfo, ['entity' => $this->getDataForCreditmemo($order)]);
 | 
						|
        $this->assertNotEmpty($result);
 | 
						|
        $actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
 | 
						|
        $this->assertEquals(
 | 
						|
            $order->getData(OrderInterface::INCREMENT_ID),
 | 
						|
            $actualOrder->getData(OrderInterface::INCREMENT_ID)
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Check order increment id after updating via webapi
 | 
						|
     *
 | 
						|
     * @magentoApiDataFixture Magento/Sales/_files/order.php
 | 
						|
     */
 | 
						|
    public function testOrderStatusUpdate()
 | 
						|
    {
 | 
						|
        /** @var Order $order */
 | 
						|
        $order = $this->objectManager->get(Order::class)
 | 
						|
            ->loadByIncrementId(self::ORDER_INCREMENT_ID);
 | 
						|
 | 
						|
        $entityData = $this->getOrderData($order);
 | 
						|
        $entityData[OrderInterface::STATE] = 'complete';
 | 
						|
        $entityData[OrderInterface::STATUS] = 'complete';
 | 
						|
 | 
						|
        $requestData = ['entity' => $entityData];
 | 
						|
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/orders',
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => self::SERVICE_NAME,
 | 
						|
                'serviceVersion' => self::SERVICE_VERSION,
 | 
						|
                'operation' => self::SERVICE_NAME . 'save',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $result = $this->_webApiCall($serviceInfo, $requestData);
 | 
						|
        $this->assertGreaterThan(1, count($result));
 | 
						|
 | 
						|
        /** @var Order $actualOrder */
 | 
						|
        $actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
 | 
						|
        $this->assertEquals(
 | 
						|
            $order->getData(OrderInterface::INCREMENT_ID),
 | 
						|
            $actualOrder->getData(OrderInterface::INCREMENT_ID)
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Check order increment id after updating via webapi
 | 
						|
     *
 | 
						|
     * @magentoApiDataFixture Magento/Sales/_files/order.php
 | 
						|
     */
 | 
						|
    public function testOrderNoAttributesProvidedUpdate()
 | 
						|
    {
 | 
						|
        /** @var Order $order */
 | 
						|
        $order = $this->objectManager->get(Order::class)
 | 
						|
            ->loadByIncrementId(self::ORDER_INCREMENT_ID);
 | 
						|
 | 
						|
        $entityData = $this->getOrderData($order);
 | 
						|
        if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
 | 
						|
            $this->markTestSkipped("Soap calls are more strict and contains attributes.");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        $requestData = ['entity' => ['entity_id' => $entityData['entity_id']]];
 | 
						|
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/orders',
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => self::SERVICE_NAME,
 | 
						|
                'serviceVersion' => self::SERVICE_VERSION,
 | 
						|
                'operation' => self::SERVICE_NAME . 'save',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $result = $this->_webApiCall($serviceInfo, $requestData);
 | 
						|
        $this->assertGreaterThan(1, count($result));
 | 
						|
 | 
						|
        /** @var Order $actualOrder */
 | 
						|
        $actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
 | 
						|
        $this->assertEquals(
 | 
						|
            $order->getData(OrderInterface::INCREMENT_ID),
 | 
						|
            $actualOrder->getData(OrderInterface::INCREMENT_ID)
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Prepare order data for request
 | 
						|
     *
 | 
						|
     * @param Order $order
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    private function getOrderData(Order $order)
 | 
						|
    {
 | 
						|
        if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
 | 
						|
            $entityData = $order->getData();
 | 
						|
            unset($entityData[OrderInterface::INCREMENT_ID]);
 | 
						|
            $entityData[OrderInterface::STATE] = 'processing';
 | 
						|
            $entityData[OrderInterface::STATUS] = 'processing';
 | 
						|
 | 
						|
            $orderData = $order->getData();
 | 
						|
            $orderData['billing_address'] = $order->getBillingAddress()->getData();
 | 
						|
            $orderData['billing_address']['street'] = ['Street'];
 | 
						|
 | 
						|
            $orderItems = [];
 | 
						|
            foreach ($order->getItems() as $item) {
 | 
						|
                $orderItems[] = $item->getData();
 | 
						|
            }
 | 
						|
            $orderData['items'] = $orderItems;
 | 
						|
 | 
						|
            $shippingAddress = $order->getShippingAddress()->getData();
 | 
						|
            $orderData['extension_attributes']['shipping_assignments'] =
 | 
						|
                [
 | 
						|
                    [
 | 
						|
                        'shipping' => [
 | 
						|
                            'address' => $shippingAddress,
 | 
						|
                            'method' => 'flatrate_flatrate'
 | 
						|
                        ],
 | 
						|
                        'items' => $order->getItems(),
 | 
						|
                        'stock_id' => null,
 | 
						|
                    ]
 | 
						|
                ];
 | 
						|
        } else {
 | 
						|
            $orderData = [
 | 
						|
                OrderInterface::ENTITY_ID => $order->getId(),
 | 
						|
                OrderInterface::STATE => 'processing',
 | 
						|
                OrderInterface::STATUS => 'processing'
 | 
						|
            ];
 | 
						|
        }
 | 
						|
        return $orderData;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get data for invoice from order.
 | 
						|
     *
 | 
						|
     * @param Order $order
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    private function getDataForInvoice(Order $order): array
 | 
						|
    {
 | 
						|
        $orderItems = $order->getAllItems();
 | 
						|
        return [
 | 
						|
            'order_id' => $order->getId(),
 | 
						|
            'base_currency_code' => null,
 | 
						|
            'base_discount_amount' => null,
 | 
						|
            'base_grand_total' => null,
 | 
						|
            'base_discount_tax_compensation_amount' => null,
 | 
						|
            'base_shipping_amount' => null,
 | 
						|
            'base_shipping_discount_tax_compensation_amnt' => null,
 | 
						|
            'base_shipping_incl_tax' => null,
 | 
						|
            'base_shipping_tax_amount' => null,
 | 
						|
            'base_subtotal' => null,
 | 
						|
            'base_subtotal_incl_tax' => null,
 | 
						|
            'base_tax_amount' => null,
 | 
						|
            'base_total_refunded' => null,
 | 
						|
            'base_to_global_rate' => null,
 | 
						|
            'base_to_order_rate' => null,
 | 
						|
            'billing_address_id' => null,
 | 
						|
            'can_void_flag' => null,
 | 
						|
            'created_at' => null,
 | 
						|
            'discount_amount' => null,
 | 
						|
            'discount_description' => null,
 | 
						|
            'email_sent' => null,
 | 
						|
            'entity_id' => null,
 | 
						|
            'global_currency_code' => null,
 | 
						|
            'grand_total' => null,
 | 
						|
            'discount_tax_compensation_amount' => null,
 | 
						|
            'increment_id' => null,
 | 
						|
            'is_used_for_refund' => null,
 | 
						|
            'order_currency_code' => null,
 | 
						|
            'shipping_address_id' => null,
 | 
						|
            'shipping_amount' => null,
 | 
						|
            'shipping_discount_tax_compensation_amount' => null,
 | 
						|
            'shipping_incl_tax' => null,
 | 
						|
            'shipping_tax_amount' => null,
 | 
						|
            'state' => null,
 | 
						|
            'store_currency_code' => null,
 | 
						|
            'store_id' => null,
 | 
						|
            'store_to_base_rate' => null,
 | 
						|
            'store_to_order_rate' => null,
 | 
						|
            'subtotal' => null,
 | 
						|
            'subtotal_incl_tax' => null,
 | 
						|
            'tax_amount' => null,
 | 
						|
            'total_qty' => '1',
 | 
						|
            'transaction_id' => null,
 | 
						|
            'updated_at' => null,
 | 
						|
            'items' => [
 | 
						|
                [
 | 
						|
                    'orderItemId' => $orderItems[0]->getId(),
 | 
						|
                    'qty' => 2,
 | 
						|
                    'additionalData' => null,
 | 
						|
                    'baseCost' => null,
 | 
						|
                    'baseDiscountAmount' => null,
 | 
						|
                    'baseDiscountTaxCompensationAmount' => null,
 | 
						|
                    'basePrice' => null,
 | 
						|
                    'basePriceInclTax' => null,
 | 
						|
                    'baseRowTotal' => null,
 | 
						|
                    'baseRowTotalInclTax' => null,
 | 
						|
                    'baseTaxAmount' => null,
 | 
						|
                    'description' => null,
 | 
						|
                    'discountAmount' => null,
 | 
						|
                    'discountTaxCompensationAmount' => null,
 | 
						|
                    'name' => null,
 | 
						|
                    'entity_id' => null,
 | 
						|
                    'parentId' => null,
 | 
						|
                    'price' => null,
 | 
						|
                    'priceInclTax' => null,
 | 
						|
                    'productId' => null,
 | 
						|
                    'rowTotal' => null,
 | 
						|
                    'rowTotalInclTax' => null,
 | 
						|
                    'sku' => 'sku' . uniqid(),
 | 
						|
                    'taxAmount' => null,
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get data for creditmemo.
 | 
						|
     *
 | 
						|
     * @param Order $order
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    private function getDataForCreditmemo(Order $order): array
 | 
						|
    {
 | 
						|
        $orderItem = current($order->getAllItems());
 | 
						|
        $items = [
 | 
						|
            $orderItem->getId() => ['order_item_id' => $orderItem->getId(), 'qty' => $orderItem->getQtyInvoiced()],
 | 
						|
        ];
 | 
						|
        return [
 | 
						|
            'adjustment' => null,
 | 
						|
            'adjustment_negative' => null,
 | 
						|
            'adjustment_positive' => null,
 | 
						|
            'base_adjustment' => null,
 | 
						|
            'base_adjustment_negative' => null,
 | 
						|
            'base_adjustment_positive' => null,
 | 
						|
            'base_currency_code' => null,
 | 
						|
            'base_discount_amount' => null,
 | 
						|
            'base_grand_total' => null,
 | 
						|
            'base_discount_tax_compensation_amount' => null,
 | 
						|
            'base_shipping_amount' => null,
 | 
						|
            'base_shipping_discount_tax_compensation_amnt' => null,
 | 
						|
            'base_shipping_incl_tax' => null,
 | 
						|
            'base_shipping_tax_amount' => null,
 | 
						|
            'base_subtotal' => null,
 | 
						|
            'base_subtotal_incl_tax' => null,
 | 
						|
            'base_tax_amount' => null,
 | 
						|
            'base_to_global_rate' => null,
 | 
						|
            'base_to_order_rate' => null,
 | 
						|
            'billing_address_id' => null,
 | 
						|
            'created_at' => null,
 | 
						|
            'creditmemo_status' => null,
 | 
						|
            'discount_amount' => null,
 | 
						|
            'discount_description' => null,
 | 
						|
            'email_sent' => null,
 | 
						|
            'entity_id' => null,
 | 
						|
            'global_currency_code' => null,
 | 
						|
            'grand_total' => null,
 | 
						|
            'discount_tax_compensation_amount' => null,
 | 
						|
            'increment_id' => null,
 | 
						|
            'invoice_id' => null,
 | 
						|
            'order_currency_code' => null,
 | 
						|
            'order_id' => $order->getId(),
 | 
						|
            'shipping_address_id' => null,
 | 
						|
            'shipping_amount' => null,
 | 
						|
            'shipping_discount_tax_compensation_amount' => null,
 | 
						|
            'shipping_incl_tax' => null,
 | 
						|
            'shipping_tax_amount' => null,
 | 
						|
            'state' => null,
 | 
						|
            'store_currency_code' => null,
 | 
						|
            'store_id' => null,
 | 
						|
            'store_to_base_rate' => null,
 | 
						|
            'store_to_order_rate' => null,
 | 
						|
            'subtotal' => null,
 | 
						|
            'subtotal_incl_tax' => null,
 | 
						|
            'tax_amount' => null,
 | 
						|
            'transaction_id' => null,
 | 
						|
            'updated_at' => null,
 | 
						|
            'items' => $items,
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get data for shipment.
 | 
						|
     *
 | 
						|
     * @param Order $order
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    private function getDataForShipment(Order $order): array
 | 
						|
    {
 | 
						|
        $requestShipData = [
 | 
						|
            'orderId' => $order->getId(),
 | 
						|
            'items' => [],
 | 
						|
            'comment' => [
 | 
						|
                'comment' => 'Test Comment',
 | 
						|
                'is_visible_on_front' => 1,
 | 
						|
            ],
 | 
						|
            'tracks' => [
 | 
						|
                [
 | 
						|
                    'track_number' => 'TEST_TRACK_0001',
 | 
						|
                    'title' => 'Simple shipment track',
 | 
						|
                    'carrier_code' => 'UPS'
 | 
						|
                ]
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
 | 
						|
        foreach ($order->getAllItems() as $item) {
 | 
						|
            if ($item->getProductType() == 'simple') {
 | 
						|
                $requestShipData['items'][] = [
 | 
						|
                    'order_item_id' => $item->getItemId(),
 | 
						|
                    'qty' => $item->getQtyOrdered(),
 | 
						|
                ];
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $requestShipData;
 | 
						|
    }
 | 
						|
}
 |