src/EventSubscriber/Expediting/ExpeditablesReadinessWatcher.php line 58

  1. <?php
  2. namespace App\EventSubscriber\Expediting;
  3. use App\Doctrine\Type\Expediting\ExpeditableStatus;
  4. use App\Doctrine\Type\Sales\WorkOrderStatus;
  5. use App\Entity\Sales\WorkOrder;
  6. use App\Event\Expediting\FreightDatasheetImportEvent;
  7. use App\Event\Expediting\FreightDocumentUploadEvent;
  8. use App\Event\Sales\WorkOrderApprovalEvent;
  9. use App\Event\Sales\WorkOrderCancelationEvent;
  10. use App\Event\Sales\WorkOrderReopeningEvent;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  14. readonly class ExpeditablesReadinessWatcher implements EventSubscriberInterface
  15. {
  16.     use ExpeditablesStatusUpdaterTrait;
  17.     use FreightDocumentUploadCheckerTrait;
  18.     public function __construct(
  19.         private readonly EntityManagerInterface   $entityManager,
  20.         private readonly EventDispatcherInterface $eventDispatcher,
  21.     ) {}
  22.     public static function getSubscribedEvents(): array
  23.     {
  24.         return [
  25.             FreightDatasheetImportEvent::IDENTIFIER => ['handleDatasheetImport', -10],
  26.             FreightDocumentUploadEvent::IDENTIFIER => ['handleDocumentUpload', -10],
  27.             WorkOrderApprovalEvent::IDENTIFIER => ['handleApproval', -10],
  28.             WorkOrderReopeningEvent::IDENTIFIER => ['handleReopening', -10],
  29.             WorkOrderCancelationEvent::IDENTIFIER => ['handleCancelation', -200],
  30.         ];
  31.     }
  32.     public function handleDatasheetImport(FreightDatasheetImportEvent $event): void
  33.     {
  34.         /** @var WorkOrder $workOrder */
  35.         $workOrder $this->entityManager->getRepository(WorkOrder::class)->findOneBy([
  36.             'reference' => $event->getDatasheet()->workOrderReference,
  37.         ]);
  38.         $this->process($workOrder);
  39.     }
  40.     public function handleDocumentUpload(FreightDocumentUploadEvent $event): void
  41.     {
  42.         $this->process($event->getFreight()->getWorkOrder());
  43.     }
  44.     public function handleApproval(WorkOrderApprovalEvent $event): void
  45.     {
  46.         $this->process($event->getWorkOrder());
  47.     }
  48.     public function handleReopening(WorkOrderReopeningEvent $event): void
  49.     {
  50.         $this->process($event->getWorkOrder());
  51.     }
  52.     public function handleCancelation(WorkOrderCancelationEvent $event): void
  53.     {
  54.         $this->updateExpeditables(packages$event->getWorkOrder()->getPackages(), statusExpeditableStatus::CANCELED);
  55.     }
  56.     private function process(WorkOrder $workOrder): void
  57.     {
  58.         $hasAuthorization $workOrder->getStatus() === WorkOrderStatus::APPROVED;
  59.         $hasDocuments true;
  60.         foreach ($workOrder->getFreights() as $freight) {
  61.             if (!$this->freightHasExpeditingDocuments($freight)) {
  62.                 $hasDocuments false;
  63.                 break;
  64.             }
  65.         }
  66.         if ($hasAuthorization && $hasDocuments) {
  67.             $this->updateExpeditables(packages$workOrder->getPackages(), statusExpeditableStatus::READY_FOR_PICKUP);
  68.         } elseif ($hasAuthorization) {
  69.             $this->updateExpeditables(packages$workOrder->getPackages(), statusExpeditableStatus::AWAITING_DOCUMENTS);
  70.         } elseif ($hasDocuments) {
  71.             $this->updateExpeditables(packages$workOrder->getPackages(), statusExpeditableStatus::AWAITING_AUTHORIZATION);
  72.         }
  73.     }
  74. }