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'); } } }