src/EventSubscriber/Expediting/ShipmentScheduler.php line 31

  1. <?php
  2. namespace App\EventSubscriber\Expediting;
  3. use App\Doctrine\Type\Expediting\ShipmentType;
  4. use App\Doctrine\Type\Expediting\ShippingSegmentStatus;
  5. use App\Doctrine\Type\Expediting\TransportMode;
  6. use App\Entity\Expediting\ShippingSegment;
  7. use App\Entity\Scheduler\Task;
  8. use App\Event\Expediting\ShipmentBookingEvent;
  9. use App\Event\Expediting\ShipmentStatusUpdateEvent;
  10. use App\Repository\Scheduler\TaskRepository;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. readonly class ShipmentScheduler implements EventSubscriberInterface
  14. {
  15.     public function __construct(
  16.         private EntityManagerInterface $entityManager,
  17.         private TaskRepository         $taskRepository,
  18.     ) {}
  19.     public static function getSubscribedEvents(): array
  20.     {
  21.         return [
  22.             ShipmentBookingEvent::IDENTIFIER => ['schedulePickup'90],
  23.             ShipmentStatusUpdateEvent::IDENTIFIER => ['scheduleArrival'90],
  24.         ];
  25.     }
  26.     public function schedulePickup(ShipmentBookingEvent $event): void
  27.     {
  28.         $segment $event->getShippingSegment();
  29.         $departureTask $this->getDepartureTask($segment);
  30.         $this->entityManager->persist($departureTask);
  31.         $this->entityManager->flush();
  32.     }
  33.     public function scheduleArrival(ShipmentStatusUpdateEvent $event): void
  34.     {
  35.         $segment $event->getShippingSegment();
  36.         if (ShippingSegmentStatus::STARTED !== $segment->getStatus()) {
  37.             return;
  38.         }
  39.         $arrivalTask $this->getArrivalTask($segment);
  40.         $this->entityManager->persist($arrivalTask);
  41.         $this->entityManager->flush();
  42.     }
  43.     private function getDepartureTask(ShippingSegment $segment): Task
  44.     {
  45.         if (in_array(ShipmentType::PICKUP$segment->getTypes())) {
  46.             return $this->taskRepository->getPickupTask($segmentcreateIfNulltrue);
  47.         }
  48.         return match ($segment->getTransportMode()) {
  49.             TransportMode::AIR => $this->taskRepository->getAirShipmentDepartureTask($segmentcreateIfNulltrue),
  50.             TransportMode::ROAD => $this->taskRepository->getRoadShipmentDepartureTask($segmentcreateIfNulltrue),
  51.             TransportMode::SEA => $this->taskRepository->getSeaShipmentDepartureTask($segmentcreateIfNulltrue),
  52.             TransportMode::TRAIN => $this->taskRepository->getTrainShipmentDepartureTask($segmentcreateIfNulltrue),
  53.         };
  54.     }
  55.     private function getArrivalTask(ShippingSegment $segment): Task
  56.     {
  57.         if (in_array(ShipmentType::HUB_DELIVERY$segment->getTypes())) {
  58.             return $this->taskRepository->getHubDeliveryTask($segmentcreateIfNulltrue);
  59.         }
  60.         return match ($segment->getTransportMode()) {
  61.             TransportMode::AIR => $this->taskRepository->getAirShipmentDeliveryTask($segmentcreateIfNulltrue),
  62.             TransportMode::ROAD => $this->taskRepository->getRoadShipmentDeliveryTask($segmentcreateIfNulltrue),
  63.             TransportMode::SEA => $this->taskRepository->getSeaShipmentDeliveryTask($segmentcreateIfNulltrue),
  64.             TransportMode::TRAIN => $this->taskRepository->getTrainShipmentDeliveryTask($segmentcreateIfNulltrue),
  65.         };
  66.     }
  67. }