1
1
<?php
2
2
/**
3
- * Copyright © Magento, Inc. All rights reserved.
4
- * See COPYING.txt for license details .
3
+ * Copyright 2025 Adobe
4
+ * All Rights Reserved .
5
5
*/
6
6
declare (strict_types=1 );
7
7
8
8
namespace Magento \OrderCancellation \Model ;
9
9
10
10
use Magento \Framework \Escaper ;
11
11
use Magento \Framework \Exception \LocalizedException ;
12
- use Magento \Sales \Api \Data \OrderPaymentInterface ;
12
+ use Magento \Sales \Api \Data \OrderInterface ;
13
13
use Magento \Sales \Api \OrderRepositoryInterface ;
14
14
use Magento \Sales \Exception \CouldNotRefundException ;
15
15
use Magento \Sales \Exception \DocumentValidationException ;
16
16
use Magento \Sales \Model \Order ;
17
+ use Magento \Sales \Model \Order \Email \Sender \OrderCommentSender ;
17
18
use Magento \Sales \Model \RefundInvoice ;
18
19
use Magento \Sales \Model \RefundOrder ;
19
- use Magento \Sales \Model \Order \Email \Sender \OrderCommentSender ;
20
20
21
21
/**
22
- * Cancels an order including online or offline payment refund and updates status accordingly.
22
+ * To cancel an order including online or offline payment refund and updates status accordingly.
23
23
*/
24
24
class CancelOrder
25
25
{
26
26
private const EMAIL_NOTIFICATION_SUCCESS = "Order cancellation notification email was sent. " ;
27
-
28
27
private const EMAIL_NOTIFICATION_ERROR = "Email notification failed. " ;
29
28
30
29
/**
31
- * @var OrderCommentSender
32
- */
33
- private OrderCommentSender $ sender ;
34
-
35
- /**
36
- * @var RefundInvoice
37
- */
38
- private RefundInvoice $ refundInvoice ;
39
-
40
- /**
41
- * @var RefundOrder
42
- */
43
- private RefundOrder $ refundOrder ;
44
-
45
- /**
46
- * @var OrderRepositoryInterface
47
- */
48
- private OrderRepositoryInterface $ orderRepository ;
49
-
50
- /**
51
- * @var Escaper
52
- */
53
- private Escaper $ escaper ;
54
-
55
- /**
30
+ * CancelOrder constructor
31
+ *
56
32
* @param RefundInvoice $refundInvoice
57
33
* @param RefundOrder $refundOrder
58
34
* @param OrderRepositoryInterface $orderRepository
59
35
* @param Escaper $escaper
60
36
* @param OrderCommentSender $sender
61
37
*/
62
38
public function __construct (
63
- RefundInvoice $ refundInvoice ,
64
- RefundOrder $ refundOrder ,
65
- OrderRepositoryInterface $ orderRepository ,
66
- Escaper $ escaper ,
67
- OrderCommentSender $ sender
39
+ private readonly RefundInvoice $ refundInvoice ,
40
+ private readonly RefundOrder $ refundOrder ,
41
+ private readonly OrderRepositoryInterface $ orderRepository ,
42
+ private readonly Escaper $ escaper ,
43
+ private readonly OrderCommentSender $ sender
68
44
) {
69
- $ this ->refundInvoice = $ refundInvoice ;
70
- $ this ->refundOrder = $ refundOrder ;
71
- $ this ->orderRepository = $ orderRepository ;
72
- $ this ->escaper = $ escaper ;
73
- $ this ->sender = $ sender ;
74
45
}
75
46
76
47
/**
77
- * Cancels and refund an order, if applicable.
48
+ * To cancel an order and if applicable process a refund
78
49
*
79
50
* @param Order $order
80
51
* @param string $reason
@@ -87,42 +58,64 @@ public function execute(
87
58
Order $ order ,
88
59
string $ reason
89
60
): Order {
90
- /** @var OrderPaymentInterface $payment */
91
61
$ payment = $ order ->getPayment ();
92
- if ($ payment ->getAmountPaid () === null ) {
93
- $ order ->cancel ();
62
+
63
+ if ($ payment ->getAmountPaid () !== null ) {
64
+ $ order = $ payment ->getMethodInstance ()->isOffline ()
65
+ ? $ this ->handleOfflinePayment ($ order )
66
+ : $ this ->handleOnlinePayment ($ order );
94
67
} else {
95
- if ($ payment ->getMethodInstance ()->isOffline ()) {
96
- $ this ->refundOrder ->execute ($ order ->getEntityId ());
97
- // for partially invoiced orders we need to cancel after doing the refund
98
- // so not invoiced items are cancelled and the whole order is set to cancelled
99
- $ order = $ this ->orderRepository ->get ($ order ->getId ());
100
- $ order ->cancel ();
101
- } else {
102
- /** @var Order\Invoice $invoice */
103
- foreach ($ order ->getInvoiceCollection () as $ invoice ) {
104
- $ this ->refundInvoice ->execute ($ invoice ->getEntityId ());
105
- }
106
- // in this case order needs to be re-instantiated
107
- $ order = $ this ->orderRepository ->get ($ order ->getId ());
108
- }
68
+ $ order ->cancel ();
109
69
}
110
70
111
- $ result = $ this ->sender ->send (
112
- $ order ,
113
- true ,
114
- __ ("Order %1 was cancelled " , $ order ->getRealOrderId ())
115
- );
116
- $ order ->addCommentToStatusHistory (
117
- $ result ?
118
- __ ("%1 " , CancelOrder::EMAIL_NOTIFICATION_SUCCESS ) : __ ("%1 " , CancelOrder::EMAIL_NOTIFICATION_ERROR )
119
- );
71
+ return $ this ->updateOrderComments ($ order , $ reason );
72
+ }
73
+
74
+ /**
75
+ * Update order comments
76
+ *
77
+ * @param OrderInterface $order
78
+ * @param string $reason
79
+ * @return OrderInterface
80
+ */
81
+ public function updateOrderComments (OrderInterface $ order , string $ reason ): OrderInterface
82
+ {
83
+ $ result = $ this ->sender ->send ($ order , true , __ ("Order %1 was cancelled " , $ order ->getRealOrderId ()));
120
84
121
85
$ order ->addCommentToStatusHistory (
122
- $ this ->escaper ->escapeHtml ($ reason ),
123
- $ order ->getStatus ()
86
+ __ ("%1 " , $ result ? self ::EMAIL_NOTIFICATION_SUCCESS : self ::EMAIL_NOTIFICATION_ERROR ),
87
+ $ order ->getStatus (),
88
+ true
124
89
);
125
90
91
+ $ order ->addCommentToStatusHistory ($ this ->escaper ->escapeHtml ($ reason ), $ order ->getStatus (), true );
92
+
126
93
return $ this ->orderRepository ->save ($ order );
127
94
}
95
+
96
+ /**
97
+ * Handle order with offline payment
98
+ *
99
+ * @param OrderInterface $order
100
+ * @return OrderInterface
101
+ */
102
+ private function handleOfflinePayment (OrderInterface $ order ): OrderInterface
103
+ {
104
+ $ this ->refundOrder ->execute ($ order ->getEntityId ());
105
+ return $ this ->orderRepository ->get ($ order ->getEntityId ())->cancel ();
106
+ }
107
+
108
+ /**
109
+ * Handle order with online payment
110
+ *
111
+ * @param OrderInterface $order
112
+ * @return OrderInterface
113
+ */
114
+ private function handleOnlinePayment (OrderInterface $ order ): OrderInterface
115
+ {
116
+ foreach ($ order ->getInvoiceCollection () as $ invoice ) {
117
+ $ this ->refundInvoice ->execute ($ invoice ->getEntityId ());
118
+ }
119
+ return $ this ->orderRepository ->get ($ order ->getEntityId ());
120
+ }
128
121
}
0 commit comments