File tree Expand file tree Collapse file tree 2 files changed +40
-4
lines changed
Model/ResourceModel/Order/Handler
Test/Unit/Model/ResourceModel/Order/Handler Expand file tree Collapse file tree 2 files changed +40
-4
lines changed Original file line number Diff line number Diff line change 77namespace Magento \Sales \Model \ResourceModel \Order \Handler ;
88
99use Magento \Sales \Model \Order ;
10+ use Magento \Sales \Model \Order \Invoice ;
1011
1112/**
1213 * Checking order status and adjusting order status before saving
@@ -27,7 +28,11 @@ public function check(Order $order)
2728 ->setStatus ($ order ->getConfig ()->getStateDefaultStatus (Order::STATE_PROCESSING ));
2829 $ currentState = Order::STATE_PROCESSING ;
2930 }
30- if ($ order ->isCanceled () || $ order ->canUnhold () || $ order ->canInvoice ()) {
31+ if ($ order ->isCanceled () ||
32+ $ order ->canUnhold () ||
33+ $ order ->canInvoice () ||
34+ ($ this ->orderHasOpenInvoices ($ order ) && (int ) $ order ->getTotalDue () > 0 )
35+ ) {
3136 return $ this ;
3237 }
3338
@@ -62,6 +67,24 @@ private function checkForCompleteState(Order $order, ?string $currentState): boo
6267 return false ;
6368 }
6469
70+ /**
71+ * Check if order has unpaid invoices
72+ *
73+ * @param Order $order
74+ * @return bool
75+ */
76+ private function orderHasOpenInvoices (Order $ order ): bool
77+ {
78+ /** @var Invoice $invoice */
79+ foreach ($ order ->getInvoiceCollection ()->getItems () as $ invoice ) {
80+ if ($ invoice ->getState () == Invoice::STATE_OPEN ) {
81+ return true ;
82+ }
83+ }
84+
85+ return false ;
86+ }
87+
6588 /**
6689 * Check if order can be automatically switched to closed state
6790 *
Original file line number Diff line number Diff line change 88namespace Magento \Sales \Test \Unit \Model \ResourceModel \Order \Handler ;
99
1010use Magento \Sales \Model \Order ;
11- use Magento \Sales \Model \Order \Address ;
1211use Magento \Sales \Model \Order \Item ;
13- use Magento \Sales \Model \ResourceModel \ Order \Address \ Collection ;
12+ use Magento \Sales \Model \Order \Invoice ;
1413use Magento \Sales \Model \ResourceModel \Order \Handler \State ;
14+ use Magento \Sales \Model \ResourceModel \Order \Invoice \Collection as InvoiceCollection ;
1515use PHPUnit \Framework \MockObject \MockObject ;
1616use PHPUnit \Framework \TestCase ;
1717
@@ -47,14 +47,27 @@ protected function setUp(): void
4747 'getIsNotVirtual ' ,
4848 'getStatus ' ,
4949 'getAllItems ' ,
50- 'getTotalQtyOrdered '
50+ 'getInvoiceCollection ' ,
51+ 'getTotalQtyOrdered ' ,
52+ 'getTotalDue '
5153 ]
5254 )
5355 ->disableOriginalConstructor ()
5456 ->getMock ();
5557 $ this ->orderMock ->expects ($ this ->any ())
5658 ->method ('getConfig ' )
5759 ->willReturnSelf ();
60+ $ invoice = $ this ->createMock (Invoice::class);
61+ $ invoice ->expects ($ this ->any ())
62+ ->method ('getState ' )
63+ ->willReturn (Invoice::STATE_PAID );
64+ $ invoiceCollection = $ this ->createMock (InvoiceCollection::class);
65+ $ invoiceCollection ->expects ($ this ->any ())
66+ ->method ('getItems ' )
67+ ->willReturn ([$ invoice ]);
68+ $ this ->orderMock ->expects ($ this ->any ())
69+ ->method ('getInvoiceCollection ' )
70+ ->willReturn ($ invoiceCollection );
5871 $ this ->state = new State ();
5972 }
6073
You can’t perform that action at this time.
0 commit comments