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

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

use Qliro\QliroOne\Api\Admin\Builder\OrderItemHandlerInterface;
use Qliro\QliroOne\Api\Data\QliroOrderItemInterface;
use Qliro\QliroOne\Api\Data\QliroOrderItemInterfaceFactory;
use Qliro\QliroOne\Helper\Data as QliroHelper;

/**
 * Invoice Fee Handler class for order items builder
 */
class InvoiceFeeHandler implements OrderItemHandlerInterface
{
    const MERCHANT_REFERENCE_CODE_FIELD = 'merchant_reference_code';
    const MERCHANT_REFERENCE_DESCRIPTION_FIELD = 'merchant_reference_description';

    /**
     * @var \Qliro\QliroOne\Api\Data\QliroOrderItemInterfaceFactory
     */
    private $qliroOrderItemFactory;

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

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

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

    /**
     * Handle specific type of order items and add them to the QliroOne order items list
     *
     * @param \Qliro\QliroOne\Api\Data\QliroOrderItemInterface[] $orderItems
     * @param \Magento\Sales\Model\Order $order
     * @return \Qliro\QliroOne\Api\Data\QliroOrderItemInterface[]
     */
    public function handle($orderItems, $order)
    {
        // @todo Handle invoiced and refunded fee
        if (!$order->getFirstCaptureFlag()) {
            return $orderItems;
        }
        $merchantReference = $order->getPayment()->getAdditionalInformation(self::MERCHANT_REFERENCE_CODE_FIELD);
        $description = $order->getPayment()->getAdditionalInformation(self::MERCHANT_REFERENCE_DESCRIPTION_FIELD);
        $inclTax = (float)$order->getQlirooneFee();
        $exclTax = $inclTax - (float)$order->getQlirooneFeeTax();

        $formattedInclAmount = $this->qliroHelper->formatPrice($inclTax);
        $formattedExclAmount = $this->qliroHelper->formatPrice($exclTax);

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

            $qliroOrderItem->setMerchantReference($merchantReference);
            $qliroOrderItem->setDescription($description);
            $qliroOrderItem->setType(QliroOrderItemInterface::TYPE_FEE);
            $qliroOrderItem->setQuantity(1);
            $qliroOrderItem->setPricePerItemIncVat($formattedInclAmount);
            $qliroOrderItem->setPricePerItemExVat($formattedExclAmount);

            $orderItems[] = $qliroOrderItem;
        }

        return $orderItems;
    }
}