1313use OxidEsales \EshopCommunity \Application \Model \User ;
1414use OxidEsales \EshopCommunity \Core \Field ;
1515use OxidSolutionCatalysts \PayPal \Model \PayPalOrder ;
16+ use OxidSolutionCatalysts \PayPal \Service \ModuleSettings ;
1617use OxidSolutionCatalysts \PayPal \Service \Payment as PaymentService ;
1718use OxidSolutionCatalysts \PayPal \Traits \JsonTrait ;
1819use OxidSolutionCatalysts \PayPal \Traits \ServiceContainer ;
@@ -69,6 +70,7 @@ public function patchShopOrder(): void
6970 $ cancelSession = !$ sessionShopOrderId || $ shopOrderId !== $ sessionShopOrderId ;
7071
7172 $ paymentService = $ this ->getServiceFromContainer (PaymentService::class);
73+ $ moduleSettings = $ this ->getServiceFromContainer (ModuleSettings::class);
7274
7375 /** @var \OxidEsales\EshopCommunity\Application\Model\User $oUser */
7476 $ oUser = oxNew (User::class);
@@ -87,18 +89,36 @@ public function patchShopOrder(): void
8789 $ paymentsId = (string ) $ oOrder ->getFieldData ('oxpaymenttype ' );
8890 /** @var PayPalApiOrder $payPalOrder */
8991 $ payPalOrder = $ paymentService ->fetchOrderFields ($ payPalOrderId , '' );
90- if ($ oOrder ->isPayPalOrderCompleted ($ payPalOrder )) {
91- $ oOrder ->markOrderPaid ();
92- $ transactionId = (string )$ payPalOrder ->purchase_units [0 ]->payments ->captures [0 ]->id ;
93- $ oOrder ->setTransId ($ transactionId );
94- $ paymentService ->trackPayPalOrder (
95- $ shopOrderId ,
96- $ payPalOrderId ,
97- $ paymentsId ,
98- PayPalApiOrder::STATUS_COMPLETED ,
99- $ transactionId
100- );
101- } else {
92+ $ captureStrategy = $ moduleSettings ->getPayPalStandardCaptureStrategy ();
93+
94+ try {
95+ if ($ captureStrategy === 'directly ' ){
96+ if ($ oOrder ->isPayPalOrderCompleted ($ payPalOrder )) {
97+ $ oOrder ->markOrderPaid ();
98+ $ transactionId = (string )$ payPalOrder ->purchase_units [0 ]->payments ->captures [0 ]->id ;
99+ $ oOrder ->setTransId ($ transactionId );
100+ $ paymentService ->trackPayPalOrder (
101+ $ shopOrderId ,
102+ $ payPalOrderId ,
103+ $ paymentsId ,
104+ PayPalApiOrder::STATUS_COMPLETED ,
105+ $ transactionId
106+ );
107+ }
108+ }
109+
110+ //capture after shipment or manual
111+ if ($ captureStrategy !== 'directly ' ){
112+ $ oOrder ->setOrderStatus ('NOT_FINISHED ' );
113+ //prepare capture tracking
114+ $ paymentService ->trackPayPalOrder (
115+ $ oOrder ->getId (),
116+ $ payPalOrderId ,
117+ $ paymentsId ,
118+ PayPalApiOrder::STATUS_APPROVED
119+ );
120+ }
121+ } catch (\Exception $ e ){
102122 $ this ->outputJson ([
103123 'status ' => 'error ' ,
104124 'message ' => 'Order completion error. ' , //@TODO improve errors messages
0 commit comments