CreditmemoAdjustmentProcessor.php 2.92 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 75 76 77 78 79 80 81 82 83 84 85 86 87
<?php
/**
 * @copyright  Vertex. All rights reserved.  https://www.vertexinc.com/
 * @author     Mediotype                     https://www.mediotype.com/
 */

namespace Vertex\Tax\Model\Api\Data\InvoiceRequestBuilder;

use Magento\Sales\Api\Data\CreditmemoInterface;
use Vertex\Data\LineItemInterfaceFactory;
use Vertex\Services\Invoice\RequestInterface;
use Vertex\Tax\Model\Config;
use Vertex\Tax\Model\Repository\TaxClassNameRepository;

/**
 * Processes positive and negative adjustments added to a creditmemo
 */
class CreditmemoAdjustmentProcessor implements CreditmemoProcessorInterface
{
    /** @var TaxClassNameRepository */
    private $classNameRepository;

    /** @var Config */
    private $config;

    /** @var LineItemInterfaceFactory */
    private $lineItemFactory;

    /**
     * @param LineItemInterfaceFactory $lineItemFactory
     * @param Config $config
     * @param TaxClassNameRepository $classNameRepository
     */
    public function __construct(
        LineItemInterfaceFactory $lineItemFactory,
        Config $config,
        TaxClassNameRepository $classNameRepository
    ) {
        $this->lineItemFactory = $lineItemFactory;
        $this->config = $config;
        $this->classNameRepository = $classNameRepository;
    }

    /**
     * @inheritdoc
     */
    public function process(RequestInterface $request, CreditmemoInterface $creditmemo)
    {
        $lineItems = $request->getLineItems();

        $adjustmentPositive = $creditmemo->getBaseAdjustmentPositive(); // additional refund
        $adjustmentNegative = $creditmemo->getBaseAdjustmentNegative(); // fee

        if ($adjustmentPositive > 0) {
            $lineItem = $this->lineItemFactory->create();
            $lineItem->setUnitPrice(-1 * $adjustmentPositive);
            $lineItem->setExtendedPrice(-1 * $adjustmentPositive);
            $lineItem->setQuantity(1);
            $lineItem->setProductCode($this->config->getCreditmemoAdjustmentPositiveCode($creditmemo->getStoreId()));
            $lineItem->setProductClass(
                $this->classNameRepository->getById(
                    $this->config->getCreditmemoAdjustmentPositiveClass($creditmemo->getStoreId())
                )
            );

            $lineItems[] = $lineItem;
        }

        if ($adjustmentNegative > 0) {
            $lineItem = $this->lineItemFactory->create();
            $lineItem->setUnitPrice($adjustmentNegative);
            $lineItem->setExtendedPrice($adjustmentNegative);
            $lineItem->setQuantity(1);
            $lineItem->setProductCode($this->config->getCreditmemoAdjustmentFeeCode($creditmemo->getStoreId()));
            $lineItem->setProductClass(
                $this->classNameRepository->getById(
                    $this->config->getCreditmemoAdjustmentFeeClass($creditmemo->getStoreId())
                )
            );

            $lineItems[] = $lineItem;
        }

        $request->setLineItems($lineItems);
        return $request;
    }
}