src/EventSubscriber/Expediting/TransitDocumentUploadScheduler.php line 47
<?php
namespace App\EventSubscriber\Expediting;
use App\Doctrine\Type\Scheduler\TaskStatus;
use App\Entity\Expediting\Shipment;
use App\Event\Expediting\ShipmentStatusUpdateEvent;
use App\Event\Sales\TransitDocumentUploadEvent;
use App\Repository\Scheduler\TaskRepository;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
readonly class TransitDocumentUploadScheduler implements EventSubscriberInterface
{
public function __construct(
private EntityManagerInterface $entityManager,
private TaskRepository $taskRepository,
) {}
public static function getSubscribedEvents(): array
{
return [
ShipmentStatusUpdateEvent::IDENTIFIER => ['schedule', 0],
TransitDocumentUploadEvent::IDENTIFIER => ['process', 0],
];
}
public function schedule(ShipmentStatusUpdateEvent $event): void
{
$segment = $event->getShippingSegment();
$shippingPlan = $segment->getShippingPlan();
$shipment = $shippingPlan->getShipment();
// Todo : update this to detect when a transit document is required
if (!$shipment instanceof Shipment) {
return;
}
foreach ($shipment->getWorkOrders() as $workOrder) {
$transitDocumentUploadTask = $this->taskRepository->getTransitDocumentUploadTask($workOrder, createIfNull: true);
$this->entityManager->persist($transitDocumentUploadTask);
}
$this->entityManager->flush();
}
public function process(TransitDocumentUploadEvent $event): void
{
$workOrder = $event->getWorkOrder();
// Mark upload task as complete
$transitDocumentUploadTask = $this->taskRepository->getTransitDocumentUploadTask($workOrder, createIfNull: true);
$transitDocumentUploadTask->setStatus(TaskStatus::COMPLETED);
$transitDocumentUploadTask->setCompletedOn(new DateTime());
$this->entityManager->persist($transitDocumentUploadTask);
$this->entityManager->flush();
}
}