1
1
<?php
2
2
3
3
use Mollie \Api \Resources \Payment ;
4
+ use Mollie_Mpm_Model_Adminhtml_System_Config_Source_InvoiceMoment as InvoiceMoment ;
4
5
5
6
/**
6
7
* Copyright (c) 2012-2019, Mollie B.V.
@@ -200,13 +201,18 @@ public function processTransaction(Mage_Sales_Model_Order $order, $type = 'webho
200
201
/**
201
202
* Check if last payment was canceled, failed or expired and redirect customer to cart for retry.
202
203
*/
203
- $ lastPayment = isset ($ mollieOrder ->_embedded ->payments ) ? end ($ mollieOrder ->_embedded ->payments ) : null ;
204
- $ lastPaymentStatus = isset ($ lastPayment ) ? $ lastPayment ->status : null ;
204
+ $ lastPaymentStatus = $ this ->mollieHelper ->getLastRelevantStatus ($ mollieOrder );
205
205
if ($ lastPaymentStatus == 'canceled ' || $ lastPaymentStatus == 'failed ' || $ lastPaymentStatus == 'expired ' ) {
206
206
$ order ->getPayment ()->setAdditionalInformation ('payment_status ' , $ lastPaymentStatus )->save ();
207
207
$ this ->mollieHelper ->registerCancellation ($ order , $ status );
208
208
$ msg = array ('success ' => false , 'status ' => $ lastPaymentStatus , 'order_id ' => $ orderId , 'type ' => $ type );
209
209
$ this ->mollieHelper ->addTolog ('success ' , $ msg );
210
+
211
+ $ methodCode = $ this ->mollieHelper ->getMethodCode ($ order );
212
+ if ($ lastPaymentStatus != 'canceled ' && ($ methodCode == 'klarnapaylater ' || $ methodCode == 'klarnasliceit ' )) {
213
+ throw new Mollie_Mpm_Exceptions_KlarnaException ;
214
+ }
215
+
210
216
return $ msg ;
211
217
}
212
218
@@ -246,16 +252,20 @@ public function processTransaction(Mage_Sales_Model_Order $order, $type = 'webho
246
252
/**
247
253
* Create pending invoice, as order has not been paid.
248
254
*/
249
- /** @var Mage_Sales_Model_Service_Order $service */
250
- $ invoice = $ order ->prepareInvoice ();
251
- $ invoice ->setRequestedCaptureCase (Mage_Sales_Model_Order_Invoice::NOT_CAPTURE );
252
- $ invoice ->setTransactionId ($ transactionId );
253
- $ invoice ->register ();
254
-
255
- Mage::getModel ('core/resource_transaction ' )
256
- ->addObject ($ invoice )
257
- ->addObject ($ invoice ->getOrder ())
258
- ->save ();
255
+ if ($ this ->mollieHelper ->isInvoiceMomentOnAuthorize ($ order )) {
256
+ /** @var Mage_Sales_Model_Service_Order $service */
257
+ $ invoice = $ order ->prepareInvoice ();
258
+ $ invoice ->setRequestedCaptureCase (Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE );
259
+ $ invoice ->setTransactionId ($ transactionId );
260
+ $ invoice ->register ();
261
+
262
+ $ invoice ->setState ($ this ->mollieHelper ->getInvoiceMomentPaidStatus ($ order ));
263
+
264
+ Mage::getModel ('core/resource_transaction ' )
265
+ ->addObject ($ invoice )
266
+ ->addObject ($ invoice ->getOrder ())
267
+ ->save ();
268
+ }
259
269
}
260
270
261
271
$ order ->setState (Mage_Sales_Model_Order::STATE_PROCESSING )->save ();
@@ -273,8 +283,9 @@ public function processTransaction(Mage_Sales_Model_Order $order, $type = 'webho
273
283
}
274
284
275
285
/** @var Mage_Sales_Model_Order_Invoice $invoice */
276
- $ invoice = $ payment ->getCreatedInvoice ();
277
- $ sendInvoice = $ this ->mollieHelper ->sendInvoice ($ storeId );
286
+ $ invoice = isset ($ invoice ) ? $ invoice : $ payment ->getCreatedInvoice ();
287
+ $ sendInvoice = $ this ->mollieHelper ->sendInvoice ($ storeId ) &&
288
+ $ this ->mollieHelper ->getInvoiceMoment ($ order ) == \Mollie_Mpm_Model_Adminhtml_System_Config_Source_InvoiceMoment::ON_AUTHORIZE_PAID_BEFORE_SHIPMENT ;
278
289
279
290
if (!$ order ->getEmailSent ()) {
280
291
try {
@@ -432,7 +443,6 @@ public function cancelOrder(Mage_Sales_Model_Order $order)
432
443
public function createShipment (Mage_Sales_Model_Order_Shipment $ shipment , Mage_Sales_Model_Order $ order )
433
444
{
434
445
$ shipAll = false ;
435
- $ orderId = $ order ->getId ();
436
446
437
447
$ transactionId = $ order ->getMollieTransactionId ();
438
448
if (empty ($ transactionId )) {
@@ -496,16 +506,32 @@ public function createShipment(Mage_Sales_Model_Order_Shipment $shipment, Mage_S
496
506
* Check if Transactions needs to be captures (eg. Klarna methods)
497
507
*/
498
508
$ payment = $ order ->getPayment ();
509
+
499
510
/** @var Mage_Sales_Model_Order_Invoice $invoice */
500
- $ invoice = $ order ->getInvoiceCollection ()->getLastItem ();
501
- if ($ invoice && $ invoice ->getState () == 1 ) {
502
- $ payment ->registerCaptureNotification ($ order ->getBaseGrandTotal (), true );
511
+ $ invoice = $ this ->createPartialInvoice ($ shipment , $ transactionId );
512
+
513
+ /**
514
+ * If there is no invoice created try to receive the last invoice.
515
+ */
516
+ if (!$ invoice ) {
517
+ $ invoice = $ order ->getInvoiceCollection ()->getLastItem ();
518
+ }
519
+
520
+ if ($ invoice && $ invoice ->getState () == Mage_Sales_Model_Order_Invoice::STATE_OPEN ) {
521
+ $ captureAmount = $ this ->getCaptureAmount ($ order , $ invoice );
522
+ $ payment ->setTransactionId ($ transactionId );
523
+ $ payment ->registerCaptureNotification ($ captureAmount , true );
524
+
503
525
$ order ->save ();
504
526
$ sendInvoice = $ this ->mollieHelper ->sendInvoice ($ order ->getStoreId ());
505
527
if ($ invoice && !$ invoice ->getEmailSent () && $ sendInvoice ) {
506
528
$ invoice ->setEmailSent (true )->sendEmail ()->save ();
507
529
}
508
530
}
531
+
532
+ if ($ shipAll ) {
533
+ $ this ->markOrderAsCompleted ($ order );
534
+ }
509
535
} catch (\Exception $ e ) {
510
536
$ this ->mollieHelper ->addTolog ('error ' , $ e ->getMessage ());
511
537
Mage::throwException ($ this ->mollieHelper ->__ ('Mollie API: %s ' , $ e ->getMessage ()));
@@ -782,4 +808,63 @@ private function itemsAreShippable(\Mollie\Api\Resources\Order $mollieOrder, $or
782
808
}
783
809
return true ;
784
810
}
811
+
812
+ private function createPartialInvoice (Mage_Sales_Model_Order_Shipment $ shipment , $ transactionId )
813
+ {
814
+ $ order = $ shipment ->getOrder ();
815
+ $ payment = $ order ->getPayment ();
816
+
817
+ if (
818
+ !in_array ($ payment ->getMethod (), array ('mollie_klarnapaylater ' , 'mollie_klarnasliceit ' )) ||
819
+ $ this ->mollieHelper ->getInvoiceMoment ($ order ) != 'shipment '
820
+ ) {
821
+ return null ;
822
+ }
823
+
824
+ $ quantities = [];
825
+ /** @var Mage_Sales_Model_Order_Shipment_Item $item */
826
+ foreach ($ shipment ->getAllItems () as $ item ) {
827
+ $ quantities [$ item ->getOrderItemId ()] = $ item ->getQty ();
828
+ }
829
+
830
+ $ invoice = $ order ->prepareInvoice ($ quantities );
831
+ $ invoice ->setRequestedCaptureCase (Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE );
832
+ $ invoice ->setTransactionId ($ transactionId );
833
+ $ invoice ->register ();
834
+
835
+ $ invoice ->setState (Mage_Sales_Model_Order_Invoice::STATE_PAID );
836
+ $ invoice ->save ();
837
+
838
+ $ sendInvoice = $ this ->mollieHelper ->sendInvoice ($ order ->getStoreId ());
839
+ if ($ invoice && !$ invoice ->getEmailSent () && $ sendInvoice ) {
840
+ $ invoice ->setEmailSent (true )->sendEmail ()->save ();
841
+ }
842
+
843
+ return $ invoice ;
844
+ }
845
+
846
+ private function getCaptureAmount (Mage_Sales_Model_Order $ order , Mage_Sales_Model_Order_Invoice $ invoice = null )
847
+ {
848
+ if ($ invoice ) {
849
+ return $ invoice ->getBaseGrandTotal ();
850
+ }
851
+
852
+ $ payment = $ order ->getPayment ();
853
+ if ($ invoice = $ payment ->getCreatedInvoice ()) {
854
+ return $ invoice ->getBaseGrandTotal ();
855
+ }
856
+
857
+ return $ order ->getBaseGrandTotal ();
858
+ }
859
+
860
+ private function markOrderAsCompleted (Mage_Sales_Model_Order $ order )
861
+ {
862
+ $ methodCode = $ this ->mollieHelper ->getMethodCode ($ order );
863
+ if ($ methodCode != 'klarnapaylater ' && $ methodCode != 'klarnasliceit ' ) {
864
+ return ;
865
+ }
866
+
867
+ $ order ->addStatusToHistory (Mage_Sales_Model_Order::STATE_COMPLETE );
868
+ $ order ->save ();
869
+ }
785
870
}
0 commit comments