Your IP : 216.73.216.97


Current Path : /var/www/clients/client3/web2/web/vendor/klarna/module-ordermanagement/Observer/
Upload File :
Current File : /var/www/clients/client3/web2/web/vendor/klarna/module-ordermanagement/Observer/CancelOrder.php

<?php
/**
 * This file is part of the Klarna Order Management module
 *
 * (c) Klarna Bank AB (publ)
 *
 * For the full copyright and license information, please view the NOTICE
 * and LICENSE files that were distributed with this source code.
 */

namespace Klarna\Ordermanagement\Observer;

use Klarna\Core\Api\OrderRepositoryInterface;
use Klarna\Core\Helper\KlarnaConfig;
use Klarna\Ordermanagement\Api\ApiInterface;
use Klarna\Ordermanagement\Model\Api\Factory;
use Klarna\Ordermanagement\Model\Api\Ordermanagement;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Quote\Model\Quote;
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Store\Api\Data\StoreInterface;
use Psr\Log\LoggerInterface;
use Magento\Store\Model\StoreManagerInterface;

/**
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 */
class CancelOrder implements ObserverInterface
{
    /**
     * @var LoggerInterface
     */
    private $log;

    /**
     * @var Ordermanagement
     */
    private $orderManagement;

    /**
     * @var KlarnaConfig
     */
    private $helper;

    /**
     * @var Factory
     */
    private $omFactory;

    /**
     * @var OrderRepositoryInterface
     */
    private $orderRepository;

    /**
     * @var \Magento\Quote\Model\ResourceModel\Quote
     */
    private $quoteResourceModel;

    /**
     * @var \Magento\Sales\Api\OrderRepositoryInterface
     */
    private $mageOrderRepository;

    /**
     * @var \Magento\Store\Model\StoreManagerInterface
     */
    private $storeManager;

    /**
     * @param LoggerInterface          $log
     * @param Ordermanagement          $om
     * @param KlarnaConfig             $helper
     * @param Factory                  $omFactory
     * @param OrderRepositoryInterface $orderRepository
     */
    public function __construct(
        LoggerInterface $log,
        Ordermanagement $orderManagement,
        KlarnaConfig $helper,
        Factory $omFactory,
        OrderRepositoryInterface $orderRepository,
        \Magento\Quote\Model\ResourceModel\Quote $quoteResourceModel,
        \Magento\Sales\Api\OrderRepositoryInterface $mageOrderRepository,
        StoreManagerInterface $storeManager
    ) {
        $this->log = $log;
        $this->orderManagement = $orderManagement;
        $this->helper = $helper;
        $this->omFactory = $omFactory;
        $this->orderRepository = $orderRepository;
        $this->quoteResourceModel = $quoteResourceModel;
        $this->mageOrderRepository = $mageOrderRepository;
        $this->storeManager = $storeManager;
    }

    /**
     * @param Observer $observer
     * @return void
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function execute(Observer $observer)
    {
        $checkout_id = $observer->getKlarnaOrderId();

        $store = $this->getStore($observer);

        if ($checkout_id === null) {
            return;
        }

        $korder = $this->orderRepository->getByKlarnaOrderId($checkout_id);
        if (!$korder->getId() && !$this->helper->isDelayedPushNotification($store)) {
            // If no order exists and API does not have a delay before the push notices,
            // don't cancel.  It's likely the push happened too quickly.  See
            // LogOrderPushNotification observer
            $this->log->debug('Delaying canceling order as delayed push is enabled');
            return;
        }

        $this->cancelOrderWithKlarna($observer->getMethodCode(), $observer->getReason(), $checkout_id, $korder, $store);
        $this->cancelOrderWithMagento($observer->getOrder(), $observer->getQuote());
    }

    /**
     * @param Observer $observer
     * @return StoreInterface
     */
    private function getStore(Observer $observer)
    {
        $order = $observer->getOrder();
        if ($order) {
            return $order->getStore();
        }
        $quote = $observer->getQuote();
        if ($quote) {
            return $quote->getStore();
        }
        return $this->storeManager->getStore();
    }

    /**
     * @param string         $methodCode
     * @param string         $reason
     * @param string         $checkoutId
     * @param OrderInterface $korder
     * @param StoreInterface $store
     * @return void
     */
    private function cancelOrderWithKlarna($methodCode, $reason, $checkoutId, $korder, StoreInterface $store = null)
    {
        try {
            $this->getOmApi($methodCode, $store);
            $order = $this->orderManagement->getPlacedKlarnaOrder($checkoutId);
            $klarnaId = $order->getReservation();
            if (!$klarnaId) {
                $klarnaId = $checkoutId;
            }
            if ($order->getStatus() !== 'CANCELED') {
                $mageOrder = $this->mageOrderRepository->get($korder->getOrderId());
                $this->orderManagement->cancel($klarnaId, $mageOrder);
                $this->log->debug('Canceled order with Klarna - ' . $reason);
            }
        } catch (\Exception $e) {
            $this->log->error($e);
        }
    }

    /**
     * Get api class
     *
     * @param string         $methodCode
     * @param StoreInterface $store
     * @return ApiInterface
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    private function getOmApi($methodCode, StoreInterface $store = null)
    {
        $om_class = $this->helper->getOrderMangagementClass($store);
        /** @var ApiInterface $om */
        $this->orderManagement = $this->omFactory->create($om_class);
        $this->orderManagement->resetForStore($store, $methodCode);
        return $this->orderManagement;
    }

    /**
     * @param OrderInterface $mageOrder
     * @param Quote          $quote
     */
    private function cancelOrderWithMagento(OrderInterface $mageOrder = null, Quote $quote = null)
    {
        try {
            $debug_message = 'Magento order object not available to cancel';
            if ($mageOrder) {
                $mageOrder->cancel();
                $debug_message = 'Canceled order in Magento';
            }
            $this->log->debug($debug_message);
            if ($quote) {
                $quote->setReservedOrderId(null);
                $quote->setIsActive(1);
                // STFU and just save the quote
                $this->quoteResourceModel->save($quote->collectTotals());
            }
        } catch (\Exception $e) {
            $this->log->error($e);
        }
    }
}