src/EventSubscriber/Expediting/ProofOfCollectionScheduler.php line 45
<?php
namespace App\EventSubscriber\Expediting;
use App\Doctrine\Type\Expediting\ShipmentType;
use App\Doctrine\Type\Scheduler\TaskStatus;
use App\Event\Expediting\ShipmentStatusUpdateEvent;
use App\Event\Sales\SignedPocUploadEvent;
use App\Repository\Scheduler\TaskRepository;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
readonly class ProofOfCollectionScheduler implements EventSubscriberInterface
{
public function __construct(
private EntityManagerInterface $entityManager,
private TaskRepository $taskRepository,
) {}
public static function getSubscribedEvents(): array
{
return [
ShipmentStatusUpdateEvent::IDENTIFIER => ['schedule', 0],
SignedPocUploadEvent::IDENTIFIER => ['process', 0],
];
}
public function schedule(ShipmentStatusUpdateEvent $event): void
{
$segment = $event->getShippingSegment();
$shippingPlan = $segment->getShippingPlan();
$workOrder = $shippingPlan->getWorkOrder();
if (null === $workOrder || !in_array(ShipmentType::PICKUP, $segment->getTypes())) {
return;
}
$pocIssuanceTask = $this->taskRepository->getPocIssuanceTask($workOrder, createIfNull: true);
$signedPocUploadTask = $this->taskRepository->getSignedPocUploadTask($workOrder, createIfNull: true);
$this->entityManager->persist($pocIssuanceTask);
$this->entityManager->persist($signedPocUploadTask);
$this->entityManager->flush();
}
public function process(SignedPocUploadEvent $event): void
{
$workOrder = $event->getWorkOrder();
// Mark upload task as complete
$signedPocUploadTask = $this->taskRepository->getSignedPocUploadTask($workOrder);
$signedPocUploadTask->setStatus(TaskStatus::COMPLETED);
$signedPocUploadTask->setCompletedOn(new DateTime());
$this->entityManager->persist($signedPocUploadTask);
// Schedule uploaded file for email issuance
$signedPocIssuanceTask = $this->taskRepository->getSignedPocIssuanceTask($workOrder, createIfNull: true);
$this->entityManager->persist($signedPocIssuanceTask);
$this->entityManager->flush();
}
}