| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- <?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;
- /**
- * Class CancelOrder
- *
- * @package Klarna\Ordermanagement\Observer
- * @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;
- /**
- * CancelOrder constructor.
- *
- * @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, $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 StoreInterface $store
- * @return void
- */
- private function cancelOrderWithKlarna($methodCode, $reason, $checkoutId, StoreInterface $store = null)
- {
- try {
- $this->getOmApi($methodCode, $store);
- $order = $this->orderManagement->getPlacedKlarnaOrder($checkoutId);
- $klarnaId = $order->getReservation();
- if (!$klarnaId) {
- $klarnaId = $checkoutId;
- }
- if ($order->getStatus() !== 'CANCELED') {
- $this->orderManagement->cancel($klarnaId);
- $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);
- }
- }
- }
|