Newer
Older
TillQliro / Model / QliroOrder / Builder / UpdateRequestBuilder.php
@Jonas Jonsson Jonas Jonsson on 2 Apr 2024 4 KB Initial
<?php
/**
 * Copyright © Qliro AB. All rights reserved.
 * See LICENSE.txt for license details.
 */

namespace Qliro\QliroOne\Model\QliroOrder\Builder;

use Magento\Catalog\Model\Product\Type;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Quote\Api\Data\CartInterface;
use Qliro\QliroOne\Api\Data\QliroOrderUpdateRequestInterfaceFactory;
use Qliro\QliroOne\Model\Config;
use \Qliro\QliroOne\Model\QliroOrder\Builder\OrderItemsBuilder;
/**
 * QliroOne Order update request builder class
 */
class UpdateRequestBuilder
{
    /**
     * @var \Magento\Quote\Model\Quote
     */
    private $quote;

    /**
     * @var \Qliro\QliroOne\Model\Config
     */
    private $qliroConfig;

    /**
     * @var \Magento\Framework\App\Config\ScopeConfigInterface
     */
    private $scopeConfig;

    /**
     * @var \Qliro\QliroOne\Api\Data\QliroOrderUpdateRequestInterfaceFactory
     */
    private $updateRequestFactory;

    /**
     * @var \Qliro\QliroOne\Model\QliroOrder\Builder\OrderItemsBuilder
     */
    private $orderItemsBuilder;

    /**
     * @var \Qliro\QliroOne\Model\QliroOrder\Builder\ShippingMethodsBuilder
     */
    private $shippingMethodsBuilder;

    /**
     * @var ShippingConfigBuilder
     */
    private $shippingConfigBuilder;

    /**
     * Inject dependencies
     *
     * @param \Qliro\QliroOne\Api\Data\QliroOrderUpdateRequestInterfaceFactory $updateRequestFactory
     * @param \Qliro\QliroOne\Model\Config $qliroConfig
     * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
     * @param \Qliro\QliroOne\Model\QliroOrder\Builder\OrderItemsBuilder $orderItemsBuilder
     * @param \Qliro\QliroOne\Model\QliroOrder\Builder\ShippingMethodsBuilder $shippingMethodsBuilder
     * @param ShippingConfigBuilder $shippingConfigBuilder
     */
    public function __construct(
        QliroOrderUpdateRequestInterfaceFactory $updateRequestFactory,
        Config $qliroConfig,
        ScopeConfigInterface $scopeConfig,
        OrderItemsBuilder $orderItemsBuilder,
        ShippingMethodsBuilder $shippingMethodsBuilder,
        ShippingConfigBuilder $shippingConfigBuilder
    ) {
        $this->qliroConfig = $qliroConfig;
        $this->scopeConfig = $scopeConfig;
        $this->updateRequestFactory = $updateRequestFactory;
        $this->orderItemsBuilder = $orderItemsBuilder;
        $this->shippingMethodsBuilder = $shippingMethodsBuilder;
        $this->shippingConfigBuilder = $shippingConfigBuilder;
    }

    /**
     * Set quote for data extraction
     *
     * @param \Magento\Quote\Api\Data\CartInterface $quote
     * @return $this
     */
    public function setQuote(CartInterface $quote)
    {
        $this->quote = $quote;

        return $this;
    }

    /**
     * Generate a QliroOne order update request object
     *
     * @return \Qliro\QliroOne\Api\Data\QliroOrderUpdateRequestInterface
     */
    public function create()
    {
        if (empty($this->quote)) {
            throw new \LogicException('Quote entity is not set.');
        }

        $updateRequest = $this->prepareUpdateRequest();

        $orderItems = $this->orderItemsBuilder->setQuote($this->quote)->create();

        $updateRequest->setOrderItems($orderItems);
        $shippingMethods = $this->shippingMethodsBuilder->setQuote($this->quote)->create();
        $updateRequest->setAvailableShippingMethods($shippingMethods->getAvailableShippingMethods());

        $shippingConfig = $this->shippingConfigBuilder->setQuote($this->quote)->create();
        if ($shippingConfig) {
            $updateRequest->setShippingConfiguration($shippingConfig);
        }

        return $updateRequest;
    }

    /**
     * @return \Qliro\QliroOne\Api\Data\QliroOrderUpdateRequestInterface
     */
    private function prepareUpdateRequest()
    {
        /** @var \Qliro\QliroOne\Api\Data\QliroOrderUpdateRequestInterface $qliroOrderUpdateRequest */
        $qliroOrderUpdateRequest = $this->updateRequestFactory->create();
        $qliroOrderUpdateRequest->setRequireIdentityVerification($this->qliroConfig->requireIdentityVerification());
        foreach ($this->quote->getItems() as $item) {
            if ($item->getProductType() == Type::TYPE_VIRTUAL && !$item->getParentItemId()) {
                $qliroOrderUpdateRequest->setRequireIdentityVerification(1);
            }
        }

        return $qliroOrderUpdateRequest;
    }
}