11<?php
22/**
3- * Copyright © Magento, Inc. All rights reserved.
4- * See COPYING.txt for license details .
3+ * Copyright 2025 Adobe
4+ * All Rights Reserved .
55 */
66declare (strict_types=1 );
77
88namespace Magento \OrderCancellation \Model ;
99
1010use Magento \Framework \Escaper ;
1111use Magento \Framework \Exception \LocalizedException ;
12- use Magento \Sales \Api \Data \OrderPaymentInterface ;
12+ use Magento \Sales \Api \Data \OrderInterface ;
1313use Magento \Sales \Api \OrderRepositoryInterface ;
1414use Magento \Sales \Exception \CouldNotRefundException ;
1515use Magento \Sales \Exception \DocumentValidationException ;
1616use Magento \Sales \Model \Order ;
17+ use Magento \Sales \Model \Order \Email \Sender \OrderCommentSender ;
1718use Magento \Sales \Model \RefundInvoice ;
1819use Magento \Sales \Model \RefundOrder ;
19- use Magento \Sales \Model \Order \Email \Sender \OrderCommentSender ;
2020
2121/**
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.
2323 */
2424class CancelOrder
2525{
2626 private const EMAIL_NOTIFICATION_SUCCESS = "Order cancellation notification email was sent. " ;
27-
2827 private const EMAIL_NOTIFICATION_ERROR = "Email notification failed. " ;
2928
3029 /**
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+ *
5632 * @param RefundInvoice $refundInvoice
5733 * @param RefundOrder $refundOrder
5834 * @param OrderRepositoryInterface $orderRepository
5935 * @param Escaper $escaper
6036 * @param OrderCommentSender $sender
6137 */
6238 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
6844 ) {
69- $ this ->refundInvoice = $ refundInvoice ;
70- $ this ->refundOrder = $ refundOrder ;
71- $ this ->orderRepository = $ orderRepository ;
72- $ this ->escaper = $ escaper ;
73- $ this ->sender = $ sender ;
7445 }
7546
7647 /**
77- * Cancels and refund an order, if applicable.
48+ * To cancel an order and if applicable process a refund
7849 *
7950 * @param Order $order
8051 * @param string $reason
@@ -87,42 +58,64 @@ public function execute(
8758 Order $ order ,
8859 string $ reason
8960 ): Order {
90- /** @var OrderPaymentInterface $payment */
9161 $ 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 );
9467 } 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 ();
10969 }
11070
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 ()));
12084
12185 $ 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
12489 );
12590
91+ $ order ->addCommentToStatusHistory ($ this ->escaper ->escapeHtml ($ reason ), $ order ->getStatus (), true );
92+
12693 return $ this ->orderRepository ->save ($ order );
12794 }
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+ }
128121}
0 commit comments