src/EventSubscriber/Expediting/ExpeditablesLabelsScheduler.php line 53

  1. <?php
  2. namespace App\EventSubscriber\Expediting;
  3. use App\Doctrine\Type\Expediting\ExpeditingStatus;
  4. use App\Doctrine\Type\Scheduler\TaskStatus;
  5. use App\Entity\Sales\WorkOrder;
  6. use App\Event\Purchasing\OrderDatasheetImportEvent;
  7. use App\Event\Sales\WorkOrderCancelationEvent;
  8. use App\Event\Sales\WorkOrderCreationEvent;
  9. use App\Event\Sales\WorkOrderEventInterface;
  10. use App\Event\Sales\WorkOrderReopeningEvent;
  11. use App\EventSubscriber\TasksCancelerTrait;
  12. use App\Repository\Scheduler\TaskRepository;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. readonly class ExpeditablesLabelsScheduler implements EventSubscriberInterface
  16. {
  17.     use TasksCancelerTrait;
  18.     public function __construct(
  19.         private EntityManagerInterface $entityManager,
  20.         private TaskRepository         $taskRepository,
  21.     ) {}
  22.     public static function getSubscribedEvents(): array
  23.     {
  24.         return [
  25.             WorkOrderCreationEvent::IDENTIFIER => ['handleScheduling'0],
  26.             WorkOrderReopeningEvent::IDENTIFIER => ['handleScheduling'0],
  27.             WorkOrderCancelationEvent::IDENTIFIER => ['handleCancelation'0],
  28.             OrderDatasheetImportEvent::IDENTIFIER => ['handleOrdersDatasheet'0],
  29.         ];
  30.     }
  31.     public function handleScheduling(WorkOrderEventInterface $event): void
  32.     {
  33.         $workOrder $event->getWorkOrder();
  34.         foreach ($workOrder->getFreights() as $freight) {
  35.             $purchaseOrderDatasheetImportTask $this->taskRepository->getPurchaseOrderDatasheetImportTask(order$freight->getOrder());
  36.             if (TaskStatus::COMPLETED !== $purchaseOrderDatasheetImportTask?->getStatus()) {
  37.                 return;
  38.             }
  39.         }
  40.         // Only scheduling labels issuance if all datasheets are imported
  41.         $this->scheduleStickers($workOrder);
  42.         $this->entityManager->flush();
  43.     }
  44.     public function handleCancelation(WorkOrderCancelationEvent $event): void
  45.     {
  46.         $expeditablesLabelsIssuanceTask $this->taskRepository->getExpeditablesLabelsIssuanceTask(workOrder$event->getWorkOrder());
  47.         $this->cancelTasks([$expeditablesLabelsIssuanceTask]);
  48.         $this->entityManager->flush();
  49.     }
  50.     public function handleOrdersDatasheet(OrderDatasheetImportEvent $event): void
  51.     {
  52.         $order $event->getOrder();
  53.         foreach ($order->getFreights() as $freight) {
  54.             $this->scheduleStickers($freight->getWorkOrder());
  55.         }
  56.         $this->entityManager->flush();
  57.     }
  58.     public function scheduleStickers(WorkOrder $workOrder): void
  59.     {
  60.         foreach ($workOrder->getItems() as $item) {
  61.             if (!in_array($item->getStatus(), [ExpeditingStatus::PLANNEDExpeditingStatus::READYExpeditingStatus::AUTHORIZEDExpeditingStatus::BOOKED])) {
  62.                 return;
  63.             }
  64.         }
  65.         // Only schedule issuance if items ware not collected or already received at facility
  66.         $expeditablesLabelsIssuanceTask $this->taskRepository->getExpeditablesLabelsIssuanceTask(workOrder$workOrdercreateIfNulltrue);
  67.         $this->entityManager->persist($expeditablesLabelsIssuanceTask);
  68.     }
  69. }