src/EventSubscriber/StatusSubscriber.php line 160

  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Logger\CronLogger;
  4. use App\Entity\Order;
  5. use App\Entity\Shipment;
  6. use App\Event\OrderStatusChangedEvent;
  7. use App\Event\ReceivingOrderStatusChangedEvent;
  8. use App\Event\ReturnOrderStatusChangedEvent;
  9. use App\Event\ShipmentStatusChangedEvent;
  10. use App\Service\InventoryService;
  11. use App\Service\Logger\CronLoggerService;
  12. use App\Service\OrderService;
  13. use App\Service\ReturnOrderService;
  14. use App\Service\ShipmentLabelService;
  15. use App\Service\ShipmentService;
  16. use App\Service\ScanOrderService;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Exception;
  19. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  20. use App\EventSubscriber\Traits\OrderStatusHandlerTrait;
  21. class StatusSubscriber implements EventSubscriberInterface
  22. {
  23.     use OrderStatusHandlerTrait;
  24.     /**
  25.      * @param EntityManagerInterface $em
  26.      * @param OrderService $orderService
  27.      * @param ShipmentService $shipmentService
  28.      * @param ShipmentLabelService $shipmentLabelService
  29.      * @param InventoryService $inventoryService
  30.      * @param ReturnOrderService $returnOrderService
  31.      * @param ScanOrderService $orderScanningService
  32.      * @param CronLoggerService $cronLoggerService
  33.      */
  34.     public function __construct(
  35.         private readonly EntityManagerInterface $em,
  36.         private readonly OrderService           $orderService,
  37.         private readonly ShipmentService        $shipmentService,
  38.         private readonly ShipmentLabelService   $shipmentLabelService,
  39.         private readonly InventoryService       $inventoryService,
  40.         private readonly ReturnOrderService     $returnOrderService,
  41.         private readonly ScanOrderService       $orderScanningService,
  42.         private readonly CronLoggerService      $cronLoggerService
  43.     )
  44.     {
  45.     }
  46.     /**
  47.      * @return array
  48.      */
  49.     public static function getSubscribedEvents(): array
  50.     {
  51.         return [
  52.             ReceivingOrderStatusChangedEvent::class => ['receivingOrderStatusChangedAction'],
  53.             OrderStatusChangedEvent::class => ['orderStatusChangedAction'],
  54.             ShipmentStatusChangedEvent::class => ['shipmentStatusChangedAction'],
  55.             ReturnOrderStatusChangedEvent::class => ['returnOrderStatusChangedAction'],
  56.         ];
  57.     }
  58.     /**
  59.      * @throws Exception
  60.      */
  61.     public function receivingOrderStatusChangedAction(ReceivingOrderStatusChangedEvent $event)
  62.     {
  63.         $receivingOrder $event->getReceivingOrder();
  64.         if ($receivingOrder->isArrivedStatus()) {
  65.             foreach ($receivingOrder->getReceivingOrderItems() as $orderItem) {
  66.                 $this->inventoryService->refillProduct(
  67.                     $orderItem->getProduct(),
  68.                     $orderItem->getQuantity()
  69.                 );
  70.                 $this->orderService->activateNotEnoughReservationQuantityOrders($orderItem->getProduct());
  71.             }
  72.         }
  73.     }
  74.     /**
  75.      * @noinspection PhpUnused
  76.      * @throws Exception
  77.      */
  78.     public function orderStatusChangedAction(OrderStatusChangedEvent $event): void
  79.     {
  80.         $order $event->getOrder();
  81.         if ($order->isPendingStatus()) {
  82.             $this->inventoryService->orderProductsReservation($order);
  83.             return;
  84.         }
  85.         if ($order->isProcessingStatus()) {
  86.             $this->inventoryService->orderProductsReservation($order);
  87.             $this->moveOrderToPickingStatus($order);
  88.             return;
  89.         }
  90.         if ($order->isPickingStatus()) {
  91.             $this->handleChangedOrderStatusToPicking($order);
  92.             return;
  93.         }
  94.         if ($order->isCompletedStatus()) {
  95.             $this->handleChangedOrderStatusToCompleted($order);
  96.             return;
  97.         }
  98.         if ($order->isDeliveredStatus()) {
  99.             $this->shipmentService->fillOrderDeliveredAt($order);
  100.             foreach ($order->getShipments() as $shipment) {
  101.                 $this->shipmentService->changeStatus($shipmentShipment::STATUS_DELIVERED);
  102.             }
  103.             return;
  104.         }
  105.         if ($order->isReturnedStatus()) {
  106.             $this->handleChangedOrderStatusToReturned($order);
  107.             return;
  108.         }
  109.         if ($order->isUnsuccessfulStatus()
  110.             || $order->isCanceledStatus()
  111.             || $order->isDuplicateStatus()
  112.             || $order->isInvalidDeliveryDataStatus()
  113.         ) {
  114.             try {
  115.                 $this->inventoryService->cancelOrderProductsReservation($order);
  116.             } catch (\Exception $exception) {
  117.                 $this->cronLoggerService->addLog(
  118.                     CronLogger::COMMAND_INVENTORY_UPDATED,
  119.                     "Order #"
  120.                     $order->getId()
  121.                     . ": "
  122.                     $exception->getMessage()
  123.                     . ", stack trace: "
  124.                     $exception->getTraceAsString()
  125.                     . ", \ndebug trace: "
  126.                     json_encode(debug_backtrace()),
  127.                     CronLogger::STATUS_FAILED,
  128.                     $order->getShop(),
  129.                 );
  130.             }
  131.         }
  132.         if ($order->isInvalidDeliveryDataStatus()
  133.             && $order->getPreviousStatus()
  134.             && $order->getPreviousStatus() === Order::STATUS_PICKING
  135.         ) {
  136.             $this->rollBackAlreadyPickedOrder($order);
  137.         }
  138.     }
  139.     /**
  140.      * @throws Exception
  141.      */
  142.     public function shipmentStatusChangedAction(ShipmentStatusChangedEvent $event)
  143.     {
  144.         $shipment $event->getShipment();
  145.         $order $shipment->getOrder();
  146.         if ($shipment->isOnItsWayStatus()) {
  147.             $this->shipmentService->createShipmentProducts($shipment);
  148.             return;
  149.         }
  150.         if ($shipment->isAcceptedStatus()) {
  151.             $this->shipmentService->fillApiAcceptedAt($order);
  152.             return;
  153.         }
  154.         if ($shipment->isDeliveredStatus() && $order->isAllShipmentDelivered()) {
  155.             $this->orderService->changeStatus($orderOrder::STATUS_DELIVERED);
  156.             return;
  157.         }
  158.         if ($shipment->isReturnedStatus() && $order->isAllShipmentReturned()) {
  159.             $this->orderService->changeStatus($orderOrder::STATUS_RETURNED);
  160.             return;
  161.         }
  162.         if ($shipment->isUnsuccessfulStatus()) {
  163.             $this->orderService->changeStatus($orderOrder::STATUS_UNSUCCESSFUL);
  164.         }
  165.     }
  166.     /**
  167.      * @throws Exception
  168.      */
  169.     public function returnOrderStatusChangedAction(ReturnOrderStatusChangedEvent $event)
  170.     {
  171.         $returnOrder $event->getReturnOrder();
  172.         if ($returnOrder->isConfirmedStatus()) {
  173.             foreach ($returnOrder->getReturnOrderProducts() as $returnOrderProduct) {
  174.                 $this->inventoryService->refillProduct(
  175.                     $returnOrderProduct->getProduct(),
  176.                     $returnOrderProduct->getQuantity()
  177.                 );
  178.                 $this->orderService->activateNotEnoughReservationQuantityOrders($returnOrderProduct->getProduct());
  179.             }
  180.         }
  181.     }
  182. }