src/EventSubscriber/Sales/WorkOrderStatusWatcher.php line 38
<?php
namespace App\EventSubscriber\Sales;
use App\Doctrine\Type\Identity\UserRole;
use App\Doctrine\Type\Sales\WorkOrderStatus;
use App\Doctrine\Type\Scheduler\TaskStatus;
use App\Event\Sales\WorkOrderApprovalEvent;
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 DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
readonly class WorkOrderStatusWatcher implements EventSubscriberInterface
{
use TasksCancelerTrait;
public function __construct(
private EntityManagerInterface $entityManager,
private TaskRepository $taskRepository,
) {}
public static function getSubscribedEvents(): array
{
return [
WorkOrderCreationEvent::IDENTIFIER => ['handleScheduling', 99],
WorkOrderReopeningEvent::IDENTIFIER => ['handleScheduling', 99],
WorkOrderApprovalEvent::IDENTIFIER => ['handleApproval', 99],
WorkOrderCancelationEvent::IDENTIFIER => ['handleCancelation', 99],
];
}
public function handleScheduling(WorkOrderEventInterface $event): void
{
$workOrder = $event->getWorkOrder();
$workOrderReviewTask = $this->taskRepository->getWorkOrderReviewRequestTask(workOrder: $workOrder, createIfNull: true);
$issuerRoles = $workOrder->getCreatedBy()?->getRoles(asEnum: true) ?? [];
if (in_array(UserRole::ROLE_CLIENT, $issuerRoles) && in_array(UserRole::ROLE_WORK_ORDER_REVIEWER, $issuerRoles)) {
$workOrderReviewTask
->setStatus(TaskStatus::COMPLETED)
->setCompletedOn(new DateTime());
$workOrder->setStatus(WorkOrderStatus::APPROVED);
$this->entityManager->persist($workOrder);
} else {
$workOrderAuthorizationRequestTask = $this->taskRepository->getWorkOrderAuthorizationRequestTask(workOrder: $workOrder, createIfNull: true);
$this->entityManager->persist($workOrderAuthorizationRequestTask);
}
$this->entityManager->persist($workOrderReviewTask);
$this->entityManager->flush();
}
public function handleApproval(WorkOrderApprovalEvent $event): void
{
$workOrder = $event->getWorkOrder();
$workOrderReviewRequestTask = $this->taskRepository->getWorkOrderReviewRequestTask(workOrder: $workOrder);
$workOrderReviewRequestTask->setStatus(TaskStatus::COMPLETED);
$workOrderReviewRequestTask->setCompletedOn(new DateTime());
$this->entityManager->flush();
}
public function handleCancelation(WorkOrderCancelationEvent $event): void
{
$workOrder = $event->getWorkOrder();
$tasks = [
$this->taskRepository->getWorkOrderReviewRequestTask(workOrder: $workOrder),
$this->taskRepository->getWorkOrderAuthorizationRequestTask(workOrder: $workOrder),
];
$this->cancelTasks($tasks);
$this->entityManager->flush();
}
}