Skip to content

Commit 89adeba

Browse files
committed
Merge branch 'ACP2E-3045' of https://github.com/adobe-commerce-tier-4/magento2ce into PR-VK-2024-06-10-CE
2 parents aadc74a + f75c1b1 commit 89adeba

File tree

2 files changed

+40
-4
lines changed
  • app/code/Magento/Sales

2 files changed

+40
-4
lines changed

app/code/Magento/Sales/Model/ResourceModel/Order/Handler/State.php

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
namespace Magento\Sales\Model\ResourceModel\Order\Handler;
88

99
use 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
*

app/code/Magento/Sales/Test/Unit/Model/ResourceModel/Order/Handler/StateTest.php

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
namespace Magento\Sales\Test\Unit\Model\ResourceModel\Order\Handler;
99

1010
use Magento\Sales\Model\Order;
11-
use Magento\Sales\Model\Order\Address;
1211
use Magento\Sales\Model\Order\Item;
13-
use Magento\Sales\Model\ResourceModel\Order\Address\Collection;
12+
use Magento\Sales\Model\Order\Invoice;
1413
use Magento\Sales\Model\ResourceModel\Order\Handler\State;
14+
use Magento\Sales\Model\ResourceModel\Order\Invoice\Collection as InvoiceCollection;
1515
use PHPUnit\Framework\MockObject\MockObject;
1616
use 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

0 commit comments

Comments
 (0)