@@ -54,6 +54,7 @@ protected function runTransaction(SoapClient $soapClient, array $data): stdClass
54
54
unset($ data ['paymentOrderKey ' ]);
55
55
56
56
$ captureResponse = $ soapClient ->__soapCall ('capture ' , [$ data ]);
57
+ $ this ->modifyCaptureResponseToSuccessfulWhenAlreadyCaptured ($ captureResponse , $ statusResponse );
57
58
58
59
return $ this ->mergeResponses ($ statusResponse , $ captureResponse );
59
60
}
@@ -116,6 +117,38 @@ private function isPaymentCaptured(stdClass $payment): bool
116
117
return isset ($ payment ->authorization ->capture );
117
118
}
118
119
120
+ /**
121
+ * Modifies a erroneous capture response to successful when the payments are already captured.
122
+ *
123
+ * This is required to facilitate the same workflow for both directly captured payment methods (like iDeal)
124
+ * and delayed captured payment methods (like ELV).
125
+ *
126
+ * @param stdClass $captureResponse
127
+ * @param stdClass $statusResponse
128
+ */
129
+ private function modifyCaptureResponseToSuccessfulWhenAlreadyCaptured (
130
+ stdClass $ captureResponse ,
131
+ stdClass $ statusResponse
132
+ ): void {
133
+ if (isset ($ captureResponse ->captureSuccess )) {
134
+ return ;
135
+ }
136
+
137
+ if (isset ($ statusResponse ->statusSuccess ) === false ) {
138
+ return ;
139
+ }
140
+
141
+ $ statusResponseApproximateTotals = $ statusResponse ->statusSuccess ->report ->approximateTotals ;
142
+ if ($ statusResponseApproximateTotals ->totalRegistered !== $ statusResponseApproximateTotals ->totalCaptured ) {
143
+ return ;
144
+ }
145
+
146
+ $ captureResponse ->captureSuccess = new stdClass ();
147
+ $ captureResponse ->captureSuccess ->success = new stdClass ();
148
+ $ captureResponse ->captureSuccess ->success ->code = 'SUCCESS ' ;
149
+ $ captureResponse ->captureSuccess ->success ->_ = $ captureResponse ->captureErrors ->error ->_ ;
150
+ }
151
+
119
152
/**
120
153
* Returns an stdClass with the multiple responses.
121
154
*
0 commit comments