src/EventSubscriber/Expediting/ExpeditablesLabelsScheduler.php line 60
<?php
namespace App\EventSubscriber\Expediting;
use App\Doctrine\Type\Expediting\ExpeditingStatus;
use App\Doctrine\Type\Scheduler\TaskStatus;
use App\Entity\Sales\WorkOrder;
use App\Event\Purchasing\OrderDatasheetImportEvent;
use App\Event\Sales\WorkOrderCancelationEvent;
use App\Event\Sales\WorkOrderCreationEvent;
use App\Event\Sales\WorkOrderEventInterface;
use App\Event\Sales\WorkOrderReopeningEvent;
use App\EventSubscriber\TasksCancelerTrait;
use App\Repository\Scheduler\TaskRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
readonly class ExpeditablesLabelsScheduler implements EventSubscriberInterface
{
use TasksCancelerTrait;
public function __construct(
private EntityManagerInterface $entityManager,
private TaskRepository $taskRepository,
) {}
public static function getSubscribedEvents(): array
{
return [
WorkOrderCreationEvent::IDENTIFIER => ['handleScheduling', 0],
WorkOrderReopeningEvent::IDENTIFIER => ['handleScheduling', 0],
WorkOrderCancelationEvent::IDENTIFIER => ['handleCancelation', 0],
OrderDatasheetImportEvent::IDENTIFIER => ['handleOrdersDatasheet', 0],
];
}
public function handleScheduling(WorkOrderEventInterface $event): void
{
$workOrder = $event->getWorkOrder();
foreach ($workOrder->getFreights() as $freight) {
$purchaseOrderDatasheetImportTask = $this->taskRepository->getPurchaseOrderDatasheetImportTask(order: $freight->getOrder());
if (TaskStatus::COMPLETED !== $purchaseOrderDatasheetImportTask?->getStatus()) {
return;
}
}
// Only scheduling labels issuance if all datasheets are imported
$this->scheduleStickers($workOrder);
$this->entityManager->flush();
}
public function handleCancelation(WorkOrderCancelationEvent $event): void
{
$expeditablesLabelsIssuanceTask = $this->taskRepository->getExpeditablesLabelsIssuanceTask(workOrder: $event->getWorkOrder());
$this->cancelTasks([$expeditablesLabelsIssuanceTask]);
$this->entityManager->flush();
}
public function handleOrdersDatasheet(OrderDatasheetImportEvent $event): void
{
$order = $event->getOrder();
foreach ($order->getFreights() as $freight) {
$this->scheduleStickers($freight->getWorkOrder());
}
$this->entityManager->flush();
}
public function scheduleStickers(WorkOrder $workOrder): void
{
foreach ($workOrder->getItems() as $item) {
if (!in_array($item->getStatus(), [ExpeditingStatus::PLANNED, ExpeditingStatus::READY, ExpeditingStatus::AUTHORIZED, ExpeditingStatus::BOOKED])) {
return;
}
}
// Only schedule issuance if items ware not collected or already received at facility
$expeditablesLabelsIssuanceTask = $this->taskRepository->getExpeditablesLabelsIssuanceTask(workOrder: $workOrder, createIfNull: true);
$this->entityManager->persist($expeditablesLabelsIssuanceTask);
}
}