src/EventSubscriber/Sales/WorkOrderStatusWatcher.php line 70

  1. <?php
  2. namespace App\EventSubscriber\Sales;
  3. use App\Doctrine\Type\Identity\UserRole;
  4. use App\Doctrine\Type\Sales\WorkOrderStatus;
  5. use App\Doctrine\Type\Scheduler\TaskStatus;
  6. use App\Event\Sales\WorkOrderApprovalEvent;
  7. use App\Event\Sales\WorkOrderCancelationEvent;
  8. use App\Event\Sales\WorkOrderCreationEvent;
  9. use App\Event\Sales\WorkOrderEventInterface;
  10. use App\Event\Sales\WorkOrderReopeningEvent;
  11. use App\EventSubscriber\TasksCancelerTrait;
  12. use App\Repository\Scheduler\TaskRepository;
  13. use DateTime;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. readonly class WorkOrderStatusWatcher implements EventSubscriberInterface
  17. {
  18.     use TasksCancelerTrait;
  19.     public function __construct(
  20.         private EntityManagerInterface $entityManager,
  21.         private TaskRepository         $taskRepository,
  22.     ) {}
  23.     public static function getSubscribedEvents(): array
  24.     {
  25.         return [
  26.             WorkOrderCreationEvent::IDENTIFIER => ['handleScheduling'99],
  27.             WorkOrderReopeningEvent::IDENTIFIER => ['handleScheduling'99],
  28.             WorkOrderApprovalEvent::IDENTIFIER => ['handleApproval'99],
  29.             WorkOrderCancelationEvent::IDENTIFIER => ['handleCancelation'99],
  30.         ];
  31.     }
  32.     public function handleScheduling(WorkOrderEventInterface $event): void
  33.     {
  34.         $workOrder $event->getWorkOrder();
  35.         $workOrderReviewTask $this->taskRepository->getWorkOrderReviewRequestTask(workOrder$workOrdercreateIfNulltrue);
  36.         $issuerRoles $workOrder->getCreatedBy()?->getRoles(asEnumtrue) ?? [];
  37.         if (in_array(UserRole::ROLE_CLIENT$issuerRoles) && in_array(UserRole::ROLE_WORK_ORDER_REVIEWER$issuerRoles)) {
  38.             $workOrderReviewTask
  39.                 ->setStatus(TaskStatus::COMPLETED)
  40.                 ->setCompletedOn(new DateTime());
  41.             $workOrder->setStatus(WorkOrderStatus::APPROVED);
  42.             $this->entityManager->persist($workOrder);
  43.         } else {
  44.             $workOrderAuthorizationRequestTask $this->taskRepository->getWorkOrderAuthorizationRequestTask(workOrder$workOrdercreateIfNulltrue);
  45.             $this->entityManager->persist($workOrderAuthorizationRequestTask);
  46.         }
  47.         $this->entityManager->persist($workOrderReviewTask);
  48.         $this->entityManager->flush();
  49.     }
  50.     public function handleApproval(WorkOrderApprovalEvent $event): void
  51.     {
  52.         $workOrder $event->getWorkOrder();
  53.         $workOrderReviewRequestTask $this->taskRepository->getWorkOrderReviewRequestTask(workOrder$workOrder);
  54.         $workOrderReviewRequestTask->setStatus(TaskStatus::COMPLETED);
  55.         $workOrderReviewRequestTask->setCompletedOn(new DateTime());
  56.         $this->entityManager->flush();
  57.     }
  58.     public function handleCancelation(WorkOrderCancelationEvent $event): void
  59.     {
  60.         $workOrder $event->getWorkOrder();
  61.         $tasks = [
  62.             $this->taskRepository->getWorkOrderReviewRequestTask(workOrder$workOrder),
  63.             $this->taskRepository->getWorkOrderAuthorizationRequestTask(workOrder$workOrder),
  64.         ];
  65.         $this->cancelTasks($tasks);
  66.         $this->entityManager->flush();
  67.     }
  68. }