29 lines
940 B
PHP
29 lines
940 B
PHP
<?php
|
|
declare(strict_types=1);
|
|
namespace Esun\Customer\Observer;
|
|
|
|
use Magento\Framework\Event\Observer;
|
|
use Magento\Framework\Event\ObserverInterface;
|
|
use Magento\Sales\Model\Order;
|
|
|
|
class MarkCompleteOrderShipped implements ObserverInterface
|
|
{
|
|
public function execute(Observer $observer): void
|
|
{
|
|
$order = $observer->getEvent()->getOrder();
|
|
if (!$order instanceof Order || $order->getState() !== Order::STATE_COMPLETE
|
|
|| in_array((string)$order->getStatus(), ['shipped', 'received'], true)) {
|
|
return;
|
|
}
|
|
$ordered = 0.0;
|
|
$shipped = 0.0;
|
|
foreach ($order->getAllVisibleItems() as $item) {
|
|
$ordered += max(0.0, (float)$item->getQtyOrdered() - (float)$item->getQtyCanceled());
|
|
$shipped += (float)$item->getQtyShipped();
|
|
}
|
|
if ($ordered > 0 && $shipped >= $ordered) {
|
|
$order->setStatus('shipped');
|
|
}
|
|
}
|
|
}
|