src/EventSubscriber/Finance/Quotation/WorkAwardScheduler.php line 41

  1. <?php
  2. namespace App\EventSubscriber\Finance\Quotation;
  3. use App\Doctrine\Type\Scheduler\TaskStatus;
  4. use App\Doctrine\Type\Scheduler\TaskType;
  5. use App\Entity\Expediting\ShippingPlan;
  6. use App\Entity\Sales\WorkOrder;
  7. use App\Event\Expediting\FreightDatasheetImportEvent;
  8. use App\Event\Expediting\ShippingPlanCreationEvent;
  9. use App\Event\Sales\WorkOrderCancelationEvent;
  10. use App\Event\Sales\WorkOrderReopeningEvent;
  11. use App\EventSubscriber\TasksCancelerTrait;
  12. use App\Repository\Common\CompanyRepository;
  13. use App\Repository\Scheduler\TaskRepository;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  17. readonly class WorkAwardScheduler implements EventSubscriberInterface
  18. {
  19.     use TasksCancelerTrait;
  20.     public function __construct(
  21.         private TaskRepository           $taskRepository,
  22.         private CompanyRepository        $companyRepository,
  23.         private EntityManagerInterface   $entityManager,
  24.         private EventDispatcherInterface $eventDispatcher,
  25.     ) {}
  26.     public static function getSubscribedEvents(): array
  27.     {
  28.         return [
  29.             ShippingPlanCreationEvent::IDENTIFIER => ['handleShippingPlan'10],
  30.             FreightDatasheetImportEvent::IDENTIFIER => ['handleDatasheetImport'10],
  31.             WorkOrderCancelationEvent::IDENTIFIER => ['handleCancelation', -90],
  32.             WorkOrderReopeningEvent::IDENTIFIER => ['handleReopening'10],
  33.         ];
  34.     }
  35.     public function handleShippingPlan(ShippingPlanCreationEvent $event): void
  36.     {
  37.         $shippingPlan $event->getShippingPlan();
  38.         $workOrder $shippingPlan->getWorkOrder();
  39.         if (!$workOrder instanceof WorkOrder) {
  40.             return;
  41.         }
  42.         $freightDatasheetImportTask $this->taskRepository->getFreightDatasheetImportTask($workOrder);
  43.         if (TaskStatus::COMPLETED === $freightDatasheetImportTask->getStatus()) {
  44.             $this->process($workOrder);
  45.         }
  46.     }
  47.     public function handleDatasheetImport(FreightDatasheetImportEvent $event): void
  48.     {
  49.         /** @var WorkOrder $workOrder */
  50.         $workOrder $this->entityManager->getRepository(WorkOrder::class)->findOneBy([
  51.             'reference' => $event->getDatasheet()->workOrderReference,
  52.         ]);
  53.         $shipmentPlanningTask $this->taskRepository->getShipmentPlanningTask($workOrder);
  54.         if (TaskStatus::COMPLETED === $shipmentPlanningTask->getStatus()) {
  55.             $this->process($workOrder);
  56.         }
  57.     }
  58.     private function process(WorkOrder $workOrder): void
  59.     {
  60.         // By now, we know for sure a shipping plan was created
  61.         $shippingPlan $workOrder->getShippingPlans()->last();
  62.         $workAwardTask $this->taskRepository->getWorkAwardTask($shippingPlancreateIfNulltrue);
  63.         $this->entityManager->persist($workAwardTask);
  64.         $this->entityManager->flush();
  65.     }
  66.     public function handleCancelation(WorkOrderCancelationEvent $event): void
  67.     {
  68.         $shippingPlan $event->getWorkOrder()->getShippingPlans()?->last();
  69.         if (!$shippingPlan instanceof ShippingPlan) {
  70.             return;
  71.         }
  72.         $workAwardTask $this->taskRepository->getWorkAwardTask($shippingPlan);
  73.         $this->cancelTasks([$workAwardTask]);
  74.         $this->entityManager->flush();
  75.     }
  76.     public function handleReopening(WorkOrderReopeningEvent $event): void
  77.     {
  78.         $shippingPlan $event->getWorkOrder()->getShippingPlans()?->last();
  79.         if (!$shippingPlan instanceof ShippingPlan) {
  80.             return;
  81.         }
  82.         $canceledWorkAwardTask $this->taskRepository->findOneBy([
  83.             'entity' => WorkOrder::class,
  84.             'entityId' => $event->getWorkOrder()->getId(),
  85.             'type' => TaskType::TRANSPORT_AGENT_SELECTION,
  86.             'status' => TaskStatus::CANCELED,
  87.         ]);
  88.         if (null === $canceledWorkAwardTask) {
  89.             return;
  90.         }
  91.         // No need to check if any planned or completed tasks exists as they are kept untouched in that case
  92.         $workAwardTask $this->taskRepository->getWorkAwardTask($shippingPlancreateIfNulltrue);
  93.         $this->entityManager->persist($workAwardTask);
  94.         $this->entityManager->flush();
  95.     }
  96. }