From 290d305b8a9438494e680086518fa6134176d494 Mon Sep 17 00:00:00 2001 From: "nils.baczynski@fatchip.de" Date: Mon, 20 Jan 2025 16:42:53 +0100 Subject: [PATCH] request Adyen cancellation when finalizeOrder fails due to stock exceptions --- src/Model/Order.php | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/Model/Order.php b/src/Model/Order.php index b14a505..93c3e90 100644 --- a/src/Model/Order.php +++ b/src/Model/Order.php @@ -12,6 +12,8 @@ use Doctrine\DBAL\Query\QueryBuilder; use OxidEsales\Eshop\Application\Model\Payment as EshopModelPayment; use OxidEsales\Eshop\Application\Model\Basket; +use OxidEsales\Eshop\Core\Exception\ArticleInputException; +use OxidEsales\Eshop\Core\Exception\NoArticleException; use OxidEsales\Eshop\Core\Registry; use OxidEsales\EshopCommunity\Internal\Framework\Database\QueryBuilderFactoryInterface; use OxidSolutionCatalysts\Adyen\Service\OrderIsAdyenCapturePossibleService; @@ -21,6 +23,7 @@ use OxidSolutionCatalysts\Adyen\Service\PaymentCapture; use OxidSolutionCatalysts\Adyen\Service\PaymentRefund; use OxidSolutionCatalysts\Adyen\Service\Module as ModuleService; +use OxidSolutionCatalysts\Adyen\Service\SessionSettings; use OxidSolutionCatalysts\Adyen\Traits\DataGetter; use OxidSolutionCatalysts\Adyen\Traits\ServiceContainer; @@ -91,7 +94,16 @@ public function isAdyenOrderPaid(): bool */ public function finalizeOrder(Basket $basket, $user, $recalcOrder = false) { - $result = parent::finalizeOrder($basket, $user, $recalcOrder); + try { + $result = parent::finalizeOrder($basket, $user, $recalcOrder); + } catch (NoArticleException $oEx) { + $this->removeAdyenPaymentFromSession(); + throw $oEx; + } catch (ArticleInputException $oEx) { + $this->removeAdyenPaymentFromSession(); + throw $oEx; + } + $moduleService = $this->getServiceFromContainer(ModuleService::class); if ($moduleService->isAdyenPayment($this->getAdyenStringData('oxpaymenttype'))) { $pspReference = $this->getAdyenPSPReference(); @@ -469,4 +481,21 @@ public function setAdyenHistoryEntry( $adyenHistory->setAdyenAction($action); return (bool) $adyenHistory->save(); } + + protected function removeAdyenPaymentFromSession(): void + { + $session = $this->getServiceFromContainer(SessionSettings::class); + + // cancel authorization + $pspReference = $session->getPspReference(); + $reference = $session->getOrderReference(); + if ($pspReference && $reference) { + $paymentService = $this->getServiceFromContainer(PaymentCancel::class); + $paymentService->doAdyenCancel( + $pspReference, + $reference + ); + $session->deletePaymentSession(); + } + } }