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

namespace Qliro\QliroOne\Model\QliroOrder\Builder\Handler;

use Magento\Framework\Event\ManagerInterface;
use Qliro\QliroOne\Api\Builder\OrderItemHandlerInterface;
use Qliro\QliroOne\Api\Data\QliroOrderItemInterface;
use Qliro\QliroOne\Api\Data\QliroOrderItemInterfaceFactory;
use Qliro\QliroOne\Helper\Data as QliroHelper;

/**
 * Applied Rules Handler class for order items builder
 */
class AppliedRulesHandler implements OrderItemHandlerInterface
{
    /**
     * @var \Qliro\QliroOne\Api\Data\QliroOrderItemInterfaceFactory
     */
    private $qliroOrderItemFactory;

    /**
     * @var \Qliro\QliroOne\Helper\Data
     */
    private $qliroHelper;

    /**
     * @var \Magento\Framework\Event\ManagerInterface
     */
    private $eventManager;

    /**
     * Inject dependencies
     *
     * @param \Qliro\QliroOne\Api\Data\QliroOrderItemInterfaceFactory $qliroOrderItemFactory
     * @param \Qliro\QliroOne\Helper\Data $qliroHelper
     * @param \Magento\Framework\Event\ManagerInterface $eventManager
     */
    public function __construct(
        QliroOrderItemInterfaceFactory $qliroOrderItemFactory,
        QliroHelper $qliroHelper,
        ManagerInterface $eventManager
    ) {

        $this->qliroOrderItemFactory = $qliroOrderItemFactory;
        $this->qliroHelper = $qliroHelper;
        $this->eventManager = $eventManager;
    }

    /**
     * Handle specific type of order items and add them to the QliroOne order items list
     *
     * @param \Qliro\QliroOne\Api\Data\QliroOrderItemInterface[] $orderItems
     * @param \Magento\Quote\Model\Quote $quote
     * @return \Qliro\QliroOne\Api\Data\QliroOrderItemInterface[]
     */
    public function handle($orderItems, $quote)
    {
        $arrayAppliedRules = sprintf('DSC_%s', \str_replace(',', '_', $quote->getAppliedRuleIds()));
        $discountAmount = $quote->getSubtotalWithDiscount() - $quote->getSubtotal();
        $formattedAmount = $this->qliroHelper->formatPrice($discountAmount);

        if ($discountAmount) {
            /** @var \Qliro\QliroOne\Api\Data\QliroOrderItemInterface $qliroOrderItem */
            $qliroOrderItem = $this->qliroOrderItemFactory->create();

            $qliroOrderItem->setMerchantReference($arrayAppliedRules);
            $qliroOrderItem->setDescription($arrayAppliedRules);
            $qliroOrderItem->setType(QliroOrderItemInterface::TYPE_DISCOUNT);
            $qliroOrderItem->setQuantity(1);
            $qliroOrderItem->setPricePerItemIncVat(\abs($formattedAmount));
            $qliroOrderItem->setPricePerItemExVat(\abs($formattedAmount));

            // Note that this event dispatch must be done for every implemented Handler
            $this->eventManager->dispatch(
                'qliroone_order_item_build_after',
                [
                    'quote' => $quote,
                    'container' => $qliroOrderItem,
                ]
            );

            if ($qliroOrderItem->getMerchantReference()) {
                $orderItems[] = $qliroOrderItem;
            }
        }

        return $orderItems;
    }
}