ExtensionAttributesProcessor.php 2.48 KB
Newer Older
Ketan's avatar
Ketan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
declare(strict_types=1);

namespace Magento\Sales\Model\Order\ShipmentDocumentFactory;

use Magento\Framework\Reflection\ExtensionAttributesProcessor as AttributesProcessor;
use Magento\Sales\Api\Data\ShipmentCreationArgumentsExtensionInterface;
use Magento\Sales\Api\Data\ShipmentCreationArgumentsInterface;
use Magento\Sales\Api\Data\ShipmentExtensionFactory;
use Magento\Sales\Api\Data\ShipmentExtensionInterface;
use Magento\Sales\Api\Data\ShipmentInterface;

/**
 * Build and set extension attributes for shipment.
 */
class ExtensionAttributesProcessor
{
    /**
     * @var ShipmentExtensionFactory
     */
    private $shipmentExtensionFactory;

    /**
     * @var ExtensionAttributesProcessor
     */
    private $extensionAttributesProcessor;

    /**
     * @param ShipmentExtensionFactory $shipmentExtensionFactory
     * @param AttributesProcessor $extensionAttributesProcessor
     */
    public function __construct(
        ShipmentExtensionFactory $shipmentExtensionFactory,
        AttributesProcessor $extensionAttributesProcessor
    ) {
        $this->shipmentExtensionFactory = $shipmentExtensionFactory;
        $this->extensionAttributesProcessor = $extensionAttributesProcessor;
    }

    /**
     * @param ShipmentInterface $shipment
     * @param ShipmentCreationArgumentsInterface $arguments
     * @return void
     */
    public function execute(
        ShipmentInterface $shipment,
        ShipmentCreationArgumentsInterface $arguments
    ): void {
        $shipmentExtensionAttributes = [];
        if (null !== $shipment->getExtensionAttributes()) {
            $shipmentExtensionAttributes = $this->extensionAttributesProcessor->buildOutputDataArray(
                $shipment->getExtensionAttributes(),
                ShipmentExtensionInterface::class
            );
        }
        $argumentsExtensionAttributes = [];
        if (null !== $arguments->getExtensionAttributes()) {
            $argumentsExtensionAttributes = $this->extensionAttributesProcessor->buildOutputDataArray(
                $arguments->getExtensionAttributes(),
                ShipmentCreationArgumentsExtensionInterface::class
            );
        }

        $mergedExtensionAttributes = $this->shipmentExtensionFactory->create([
            'data' => array_merge($shipmentExtensionAttributes, $argumentsExtensionAttributes)
        ]);

        $shipment->setExtensionAttributes($mergedExtensionAttributes);
    }
}