Skip to content

Commit 3168f8c

Browse files
authored
Restore cart when order is placed (#75)
1 parent 5eb4ec4 commit 3168f8c

File tree

3 files changed

+48
-18
lines changed

3 files changed

+48
-18
lines changed

Moyasar/Mysr/Controller/Order/Update.php

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,36 @@
66
use Magento\Framework\App\Action\Context;
77
use Magento\Framework\App\Action\HttpPostActionInterface;
88
use Magento\Framework\Controller\ResultFactory;
9+
use Magento\Framework\Event\ManagerInterface;
10+
use Magento\Framework\Exception\NoSuchEntityException;
11+
use Magento\Quote\Model\QuoteRepository;
912
use Magento\Sales\Model\Order;
1013
use Moyasar\Mysr\Helper\MoyasarHelper;
14+
use Psr\Log\LoggerInterface;
1115

1216
class Update implements HttpPostActionInterface
1317
{
1418
protected $context;
1519
protected $checkoutSession;
1620
protected $helper;
21+
protected $quoteRepository;
22+
protected $eventManager;
23+
protected $logger;
1724

18-
public function __construct(Context $context, Session $checkoutSession, MoyasarHelper $helper)
19-
{
25+
public function __construct(
26+
Context $context,
27+
Session $checkoutSession,
28+
MoyasarHelper $helper,
29+
QuoteRepository $quoteRepository,
30+
ManagerInterface $eventManager,
31+
LoggerInterface $logger
32+
) {
2033
$this->context = $context;
2134
$this->checkoutSession = $checkoutSession;
2235
$this->helper = $helper;
36+
$this->quoteRepository = $quoteRepository;
37+
$this->eventManager = $eventManager;
38+
$this->logger = $logger;
2339
}
2440

2541
public function execute()
@@ -33,6 +49,9 @@ public function execute()
3349
$order->setState(Order::STATE_PENDING_PAYMENT);
3450
$order->save();
3551

52+
// Restore quote to keep cart when the user returns after a failed 3DS attempt
53+
$this->restoreQuote($order);
54+
3655
return $this->context
3756
->getResultFactory()
3857
->create(ResultFactory::TYPE_JSON)
@@ -55,4 +74,25 @@ private function lastOrder()
5574

5675
return $order;
5776
}
77+
78+
/**
79+
* @param Order $order
80+
* @return bool
81+
*/
82+
public function restoreQuote($order)
83+
{
84+
try {
85+
$quote = $this->quoteRepository->get($order->getQuoteId());
86+
$quote->setIsActive(1)->setReservedOrderId(null);
87+
$this->quoteRepository->save($quote);
88+
$this->checkoutSession->replaceQuote($quote)->unsLastRealOrderId();
89+
$this->eventManager->dispatch('restore_quote', ['order' => $order, 'quote' => $quote]);
90+
return true;
91+
} catch (NoSuchEntityException $e) {
92+
$this->logger->critical($e);
93+
}
94+
95+
return false;
96+
}
5897
}
98+

Moyasar/Mysr/Controller/Redirect/Response.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ private function processPaymentFail($payment, $order)
126126
$message .= ': ' . $sourceMessage;
127127
}
128128

129-
$this->checkoutSession->restoreQuote();
130129
$this->messageManager->addErrorMessage($message);
131130

132131
$order->registerCancellation($message);
@@ -144,7 +143,6 @@ private function processUnMatchingInfoFail($payment, $order, $errors)
144143
$payment_id = $payment['id'];
145144
array_unshift($errors, __('Un-matching payment details %payment_id.', ['payment_id' => $payment['id']]));
146145

147-
$this->checkoutSession->restoreQuote();
148146
$order->registerCancellation(implode("\n", $errors));
149147
$order->getPayment()->setCcStatus('failed');
150148
$order->save();

Moyasar/Mysr/view/frontend/web/js/view/payment/method-renderer/moyasar_payments.js

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@ define(
1515
'Magento_Checkout/js/model/quote',
1616
'Moyasar_Mysr/js/model/cancel-order',
1717
'Moyasar_Mysr/js/model/extract-api-errors',
18-
'Moyasar_Mysr/js/model/currency-helper',
19-
'Magento_Checkout/js/model/cart/totals-processor/default',
20-
'Magento_Checkout/js/model/cart/cache',
21-
'ko',
18+
'Moyasar_Mysr/js/model/currency-helper'
2219
],
2320
function (
2421
Component,
@@ -36,11 +33,7 @@ define(
3633
quoteModel,
3734
sendCancelOrder,
3835
extractApiErrors,
39-
currencyHelper,
40-
defaultTotal,
41-
cartCache,
42-
ko
43-
36+
currencyHelper
4437
) {
4538
'use strict';
4639
return Component.extend({
@@ -82,7 +75,7 @@ define(
8275
var config = window.checkoutConfig.moyasar_payments;
8376

8477
MoyasarForm.init({
85-
element: '.mysr-form',
78+
element: this.buildShadowRoot($('.mysr-form')[0]),
8679
amount: currencyHelper.to_minor(this.getAmount(), this.getCurrency()),
8780
currency: this.getCurrency(),
8881
description: 'Order for: ' + this.getCustomerEmail(),
@@ -111,10 +104,9 @@ define(
111104
return quoteModel.guestEmail ? quoteModel.guestEmail : window.checkoutConfig.customerData.email;
112105
},
113106
getAmount: function () {
114-
var basetotal = (quote.totals()['base_grand_total']) * 100;
115-
var total = (Math.round(basetotal).toFixed(2)) / 100 ;
116-
return total;
117-
// return Math.round(quote.totals()['base_grand_total']).toFixed(2);
107+
var totals = quote.totals();
108+
var baseTotal = currencyHelper.to_minor(totals['base_grand_total'], totals['base_currency_code']);
109+
return (Math.round(baseTotal).toFixed(0)) / 100;
118110
},
119111
getCurrency: function () {
120112
var totals = quote.getTotals()();

0 commit comments

Comments
 (0)