diff --git a/Controller/Index/Push.php b/Controller/Index/Push.php index 498e0da81cd..d142b6c0e11 100755 --- a/Controller/Index/Push.php +++ b/Controller/Index/Push.php @@ -192,7 +192,7 @@ public function execute() $quote = $this->quoteRepository->get($transactionId); // create order if it doesn't exists already. - $order = $this->orderHelper->fetchOrder($transactionId); + $order = $this->orderHelper->fetchOrderByQuoteId($transactionId); if ($order === null || $order->isEmpty()) { $transactionData = $this->_paymentHelper->getDataFromResponse($pushResponse); $this->_paymentHelper->saveHeidelpayTransaction($pushResponse, $transactionData, 'PUSH'); diff --git a/Controller/Index/Redirect.php b/Controller/Index/Redirect.php index b2a2447bcb2..c0ee513e661 100755 --- a/Controller/Index/Redirect.php +++ b/Controller/Index/Redirect.php @@ -4,6 +4,7 @@ use Exception; use Heidelpay\Gateway\Controller\HgwAbstract; +use Heidelpay\Gateway\Helper\Order as OrderHelper; use Heidelpay\Gateway\Helper\Payment as HeidelpayHelper; use Heidelpay\Gateway\Model\ResourceModel\Transaction\CollectionFactory; use Heidelpay\Gateway\Model\Transaction as HeidelpayTransaction; @@ -50,6 +51,9 @@ class Redirect extends HgwAbstract /** @var CollectionFactory */ private $transactionCollectionFactory; + /** @var OrderHelper */ + private $orderHelper; + /** * heidelpay Redirect constructor. * @@ -69,6 +73,7 @@ class Redirect extends HgwAbstract * @param Encryptor $encryptor * @param Url $customerUrl * @param CollectionFactory $transactionCollectionFactory + * @param OrderHelper $orderHelper */ public function __construct( Context $context, @@ -86,7 +91,8 @@ public function __construct( OrderCommentSender $orderCommentSender, Encryptor $encryptor, Url $customerUrl, - CollectionFactory $transactionCollectionFactory + CollectionFactory $transactionCollectionFactory, + OrderHelper $orderHelper ) { parent::__construct( $context, @@ -107,6 +113,7 @@ public function __construct( ); $this->transactionCollectionFactory = $transactionCollectionFactory; + $this->orderHelper = $orderHelper; } /** @@ -156,7 +163,8 @@ public function execute() /** @var Order $order */ $order = null; try { - $order = $this->_orderFactory->create()->loadByAttribute('quote_id', $quoteId); + $this->_logger->warning('Load order by QuoteId: ' . $quoteId); + $order = $this->orderHelper->fetchOrderByQuoteId($quoteId); } catch (Exception $e) { $this->_logger->error( 'Heidelpay - Redirect: Cannot receive order.' . $e->getMessage() diff --git a/Helper/Order.php b/Helper/Order.php index a3966665f3d..466df6feac2 100644 --- a/Helper/Order.php +++ b/Helper/Order.php @@ -5,6 +5,8 @@ use Magento\Framework\App\Helper\AbstractHelper; use Magento\Framework\App\Helper\Context; +use Magento\Framework\Data\Collection; +use Magento\Framework\DataObject; use Magento\Sales\Helper\Data as SalesHelper; use Magento\Sales\Model\Order as MagentoOrder; use Magento\Sales\Model\Order\Email\Sender\InvoiceSender; @@ -117,15 +119,31 @@ public function handleOrderMail($order) } /** - * @param $transactionId - * @return MagentoOrder + * Returns the last Order to the quote with the given quoteId or an empty order object. + * + * @param $quoteId + * @return MagentoOrder|DataObject */ - public function fetchOrder($transactionId) + public function fetchOrderByQuoteId($quoteId) { - $criteria = $this->searchCriteriaBuilder->addFilter('quote_id', $transactionId)->create(); + $orderList = $this->fetchOrdersByQuoteId($quoteId); + + return $orderList->getLastItem(); + } + + /** + * @param $quoteId + * @return Collection + */ + protected function fetchOrdersByQuoteId($quoteId): Collection + { + $criteria = $this->searchCriteriaBuilder->addFilter('quote_id', $quoteId)->create(); /** @var Collection $orderList */ $orderList = $this->orderRepository->getList($criteria); + return $orderList; + } + return $orderList->getFirstItem(); } diff --git a/Helper/Payment.php b/Helper/Payment.php index 3c5b6c159a8..1e9b6c532ef 100755 --- a/Helper/Payment.php +++ b/Helper/Payment.php @@ -389,9 +389,10 @@ public function handleOrderCreation($quote, $context = null) $this->lockManager->lock($lockName); try{ /** @var Order $order */ - $order = $this->orderHelper->fetchOrder($quote->getId()); - // Ensure to use the currency of the quote. - if ($order === null || $order->isEmpty()) { + $order = $this->orderHelper->fetchOrderByQuoteId($quote->getId()); + + if ($order === null || $order->isEmpty() || $order->isCanceled()) { + // Ensure to use the currency of the quote. $quote->getStore()->setCurrentCurrencyCode($quote->getQuoteCurrencyCode()); $quote->collectTotals(); // in case of guest checkout, set some customer related data. diff --git a/Test/Integration/Controller/Index/PushHandlingTest.php b/Test/Integration/Controller/Index/PushHandlingTest.php index 937ed4fef18..eaa4f755ace 100644 --- a/Test/Integration/Controller/Index/PushHandlingTest.php +++ b/Test/Integration/Controller/Index/PushHandlingTest.php @@ -114,7 +114,7 @@ public function PushCreatesNewTransaction($paymentCode, $paymentMethod) $this->assertQuoteActive($quote->getId(), false); /** @var Order $order */ - $fetchedOrder = $this->orderHelper->fetchOrder($quote->getId()); + $fetchedOrder = $this->orderHelper->fetchOrderByQuoteId($quote->getId()); $this->assertFalse($fetchedOrder->isEmpty(), 'Order creation failed: Order is empty'); $uniqueId = $xml->Transaction->Identification->UniqueID; @@ -200,7 +200,7 @@ public function CreateNoOrderFromInvalidTransactionTypes($paymentCode, $paymentM $this->assertQuoteActive($quote->getId(), true); /** @var Order $order */ - $fetchedOrder = $this->orderHelper->fetchOrder($quote->getId()); + $fetchedOrder = $this->orderHelper->fetchOrderByQuoteId($quote->getId()); $this->assertTrue($fetchedOrder->isEmpty(), 'No Order should be created here'); // Check Transaction @@ -322,7 +322,7 @@ private function assertMagentoTransactionExists($uniqueId) private function assertQuoteHasNoOrder(Quote $quote) { /** @var Order $fetchedOrder */ - $fetchedOrder = $this->orderHelper->fetchOrder($quote->getId()); + $fetchedOrder = $this->orderHelper->fetchOrderByQuoteId($quote->getId()); $this->assertTrue($fetchedOrder->isEmpty()); $this->assertNotNull($quote); }