src/EventSubscriber/Finance/Quotation/WorkAwardScheduler.php line 77
<?php
namespace App\EventSubscriber\Finance\Quotation;
use App\Doctrine\Type\Scheduler\TaskStatus;
use App\Doctrine\Type\Scheduler\TaskType;
use App\Entity\Expediting\ShippingPlan;
use App\Entity\Sales\WorkOrder;
use App\Event\Expediting\FreightDatasheetImportEvent;
use App\Event\Expediting\ShippingPlanCreationEvent;
use App\Event\Sales\WorkOrderCancelationEvent;
use App\Event\Sales\WorkOrderReopeningEvent;
use App\EventSubscriber\TasksCancelerTrait;
use App\Repository\Common\CompanyRepository;
use App\Repository\Scheduler\TaskRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
readonly class WorkAwardScheduler implements EventSubscriberInterface
{
use TasksCancelerTrait;
public function __construct(
private TaskRepository $taskRepository,
private CompanyRepository $companyRepository,
private EntityManagerInterface $entityManager,
private EventDispatcherInterface $eventDispatcher,
) {}
public static function getSubscribedEvents(): array
{
return [
ShippingPlanCreationEvent::IDENTIFIER => ['handleShippingPlan', 10],
FreightDatasheetImportEvent::IDENTIFIER => ['handleDatasheetImport', 10],
WorkOrderCancelationEvent::IDENTIFIER => ['handleCancelation', -90],
WorkOrderReopeningEvent::IDENTIFIER => ['handleReopening', 10],
];
}
public function handleShippingPlan(ShippingPlanCreationEvent $event): void
{
$shippingPlan = $event->getShippingPlan();
$workOrder = $shippingPlan->getWorkOrder();
if (!$workOrder instanceof WorkOrder) {
return;
}
$freightDatasheetImportTask = $this->taskRepository->getFreightDatasheetImportTask($workOrder);
if (TaskStatus::COMPLETED === $freightDatasheetImportTask->getStatus()) {
$this->process($workOrder);
}
}
public function handleDatasheetImport(FreightDatasheetImportEvent $event): void
{
/** @var WorkOrder $workOrder */
$workOrder = $this->entityManager->getRepository(WorkOrder::class)->findOneBy([
'reference' => $event->getDatasheet()->workOrderReference,
]);
$shipmentPlanningTask = $this->taskRepository->getShipmentPlanningTask($workOrder);
if (TaskStatus::COMPLETED === $shipmentPlanningTask->getStatus()) {
$this->process($workOrder);
}
}
private function process(WorkOrder $workOrder): void
{
// By now, we know for sure a shipping plan was created
$shippingPlan = $workOrder->getShippingPlans()->last();
$workAwardTask = $this->taskRepository->getWorkAwardTask($shippingPlan, createIfNull: true);
$this->entityManager->persist($workAwardTask);
$this->entityManager->flush();
}
public function handleCancelation(WorkOrderCancelationEvent $event): void
{
$shippingPlan = $event->getWorkOrder()->getShippingPlans()?->last();
if (!$shippingPlan instanceof ShippingPlan) {
return;
}
$workAwardTask = $this->taskRepository->getWorkAwardTask($shippingPlan);
$this->cancelTasks([$workAwardTask]);
$this->entityManager->flush();
}
public function handleReopening(WorkOrderReopeningEvent $event): void
{
$shippingPlan = $event->getWorkOrder()->getShippingPlans()?->last();
if (!$shippingPlan instanceof ShippingPlan) {
return;
}
$canceledWorkAwardTask = $this->taskRepository->findOneBy([
'entity' => WorkOrder::class,
'entityId' => $event->getWorkOrder()->getId(),
'type' => TaskType::TRANSPORT_AGENT_SELECTION,
'status' => TaskStatus::CANCELED,
]);
if (null === $canceledWorkAwardTask) {
return;
}
// No need to check if any planned or completed tasks exists as they are kept untouched in that case
$workAwardTask = $this->taskRepository->getWorkAwardTask($shippingPlan, createIfNull: true);
$this->entityManager->persist($workAwardTask);
$this->entityManager->flush();
}
}