1212
1313use Ratepay \RpayPayments \Components \Checkout \Service \DataValidationService ;
1414use Ratepay \RpayPayments \Components \PaymentHandler \AbstractPaymentHandler ;
15+ use Ratepay \RpayPayments \Core \Entity \Extension \OrderExtension ;
16+ use Ratepay \RpayPayments \Core \Entity \RatepayOrderDataEntity ;
1517use Ratepay \RpayPayments \Util \CriteriaHelper ;
18+ use Ratepay \RpayPayments \Util \MethodHelper ;
1619use Shopware \Core \Checkout \Order \Aggregate \OrderTransaction \OrderTransactionEntity ;
1720use Shopware \Core \Checkout \Order \OrderEntity ;
1821use Shopware \Core \Checkout \Payment \SalesChannel \AbstractHandlePaymentMethodRoute ;
1922use Shopware \Core \Checkout \Payment \SalesChannel \HandlePaymentMethodRouteResponse ;
2023use Shopware \Core \Framework \DataAbstractionLayer \EntityRepository ;
24+ use Shopware \Core \Framework \DataAbstractionLayer \Search \Criteria ;
2125use Shopware \Core \Framework \Validation \DataBag \DataBag ;
2226use Shopware \Core \System \SalesChannel \SalesChannelContext ;
2327use Symfony \Component \HttpFoundation \Request ;
28+ use Throwable ;
2429
2530class HandlePaymentMethodRoute extends AbstractHandlePaymentMethodRoute
2631{
2732 public function __construct (
2833 private readonly AbstractHandlePaymentMethodRoute $ innerService ,
2934 private readonly DataValidationService $ dataValidationService ,
30- private readonly EntityRepository $ orderRepository
35+ private readonly EntityRepository $ orderRepository ,
36+ private readonly EntityRepository $ ratepayDataRepository
3137 ) {
3238 }
3339
@@ -44,10 +50,11 @@ public function load(Request $request, SalesChannelContext $context): HandlePaym
4450 return $ this ->innerService ->load ($ request , $ context );
4551 }
4652
47- $ paymentHandlerIdentifier = null ;
48- if ($ request ->request ->getBoolean ('updatePayment ' )) {
49- $ orderId = $ request ->request ->get ('orderId ' );
53+ $ orderId = $ request ->request ->get ('orderId ' );
5054
55+ $ paymentHandlerIdentifier = null ;
56+ $ order = null ;
57+ if (!empty ($ orderId )) {
5158 /** @var OrderEntity|null $order */
5259 $ order = $ this ->orderRepository ->search (CriteriaHelper::getCriteriaForOrder ($ orderId ), $ context ->getContext ())->first ();
5360 if ($ order instanceof OrderEntity && ($ transaction = $ order ->getTransactions ()->last ()) instanceof OrderTransactionEntity) {
@@ -61,6 +68,29 @@ public function load(Request $request, SalesChannelContext $context): HandlePaym
6168 $ this ->dataValidationService ->validatePaymentData (new DataBag ($ request ->request ->all ()), $ context , $ order ?? null );
6269 }
6370
64- return $ this ->innerService ->load ($ request , $ context );
71+ $ result = $ this ->innerService ->load ($ request , $ context );
72+
73+ $ ratepayData = $ order ?->getExtension(OrderExtension::EXTENSION_NAME );
74+ if ($ ratepayData instanceof RatepayOrderDataEntity) {
75+ $ orderCriteria = (new Criteria ([$ orderId ]))
76+ ->addAssociation ('transactions.paymentMethod ' );
77+
78+ /** @var OrderEntity $order */
79+ $ order = $ this ->orderRepository ->search ($ orderCriteria , $ context ->getContext ())->first ();
80+ if (!MethodHelper::isRatepayOrder ($ order )) {
81+ // if it is not a ratepay order anymore, we delete existing ratepay-data
82+ try {
83+ $ this ->ratepayDataRepository ->delete ([[
84+ RatepayOrderDataEntity::FIELD_ID => $ ratepayData ->getId (),
85+ ]], $ context ->getContext ());
86+ } catch (Throwable ) {
87+ // catch any exception but not handle it.
88+ // we won't break behaviour of third-party payment methods if deletion fails.
89+ // it is not so bad if we keep the ratepay-data in the database.
90+ }
91+ }
92+ }
93+
94+ return $ result ;
6595 }
6696}
0 commit comments