src/EventSubscriber/Finance/Quotation/QuotationSchedulingSubscriber.php line 34
<?php
namespace App\EventSubscriber\Finance\Quotation;
use App\Doctrine\Type\Finance\PayableStatus;
use App\Doctrine\Type\Scheduler\TaskStatus;
use App\Entity\Finance\Quotation;
use App\Event\Finance\QuotationCreationEvent;
use App\Event\Finance\QuotationEditEvent;
use App\Event\Finance\QuotationEventInterface;
use App\EventSubscriber\TasksCancelerTrait;
use App\Repository\Scheduler\TaskRepository;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
readonly class QuotationSchedulingSubscriber implements EventSubscriberInterface
{
use TasksCancelerTrait;
public function __construct(
private EntityManagerInterface $entityManager,
private TaskRepository $taskRepository,
) {}
public static function getSubscribedEvents(): array
{
return [
QuotationCreationEvent::IDENTIFIER => ['process', 0],
QuotationEditEvent::IDENTIFIER => ['process', 0],
];
}
public function process(QuotationEventInterface $event): void
{
$quotation = $event->getQuotation();
// Handle scheduling and updating current quotation object
if ($quotation->isFilled()) {
if ($event instanceof QuotationEditEvent) {
$pickupQuotationRequestTask = $this->taskRepository->getPickupQuotationRequestTask($quotation);
$this->cancelTasks([$pickupQuotationRequestTask]);
}
$this->scheduleFilledQuotationTasks($quotation);
} else {
$this->scheduleQuotationDraftTasks($quotation);
}
// If a original form is attached, it is most certainly amended and all it's attached tasks should be canceled
if ($quotation->getOriginalForm() instanceof Quotation) {
$originalForm = $quotation->getOriginalForm();
$pickupQuotationRequestTask = $this->taskRepository->getPickupQuotationRequestTask($originalForm);
$pickupQuotationFillingTask = $this->taskRepository->getPickupQuotationFillingTask($originalForm);
$this->cancelTasks([$pickupQuotationRequestTask, $pickupQuotationFillingTask]);
$originalForm->setStatus(PayableStatus::AMENDED);
$this->entityManager->persist($originalForm);
}
$this->entityManager->flush();
}
private function scheduleFilledQuotationTasks(Quotation $quotation): void
{
$quotation->setStatus(PayableStatus::READY_FOR_REVIEW);
$quotationReviewTask = $this->taskRepository->getQuotationReviewTask($quotation, createIfNull: true);
$pickupQuotationFillingTask = $this->taskRepository->getPickupQuotationFillingTask($quotation, createIfNull: true);
$pickupQuotationFillingTask
->setStatus(TaskStatus::COMPLETED)
->setCompletedOn(new DateTime());
$this->entityManager->persist($pickupQuotationFillingTask);
$this->entityManager->persist($quotationReviewTask);
}
private function scheduleQuotationDraftTasks(Quotation $quotation): void
{
$quotation->setStatus(PayableStatus::DRAFTED);
$pickupQuotationRequestTask = $this->taskRepository->getPickupQuotationRequestTask($quotation, createIfNull: true);
$pickupQuotationFillingTask = $this->taskRepository->getPickupQuotationFillingTask($quotation, createIfNull: true);
$this->entityManager->persist($pickupQuotationRequestTask);
$this->entityManager->persist($pickupQuotationFillingTask);
}
}