<?php
namespace App\BookingProcess\ProcessEventSubscriber;
use App\BookingProcess\ProcessQuoteToBooking\AssureverInsuranceValidator;
use App\BookingProcess\ProcessQuoteToBooking\BookingConfirmationFactory;
use App\BookingProcess\ProcessQuoteToBooking\BookingFactory;
use App\BookingProcess\ProcessQuoteToBooking\ReminderFactory;
use App\Entity\Booking\Quote;
use App\Entity\EventCodes;
use App\Helper\__Quote\QuoteEventHelper;
use App\Manager\Level_1\BookingManager;
use App\Manager\Level_1\ReminderManager;
use Crea\EventBundle\Helper\CreaEventHelper;
use Crea\EventBundle\Model\CreaEvent;
use Crea\ToolsBundle\Helper\EntityManagerHelper;
use Crea\ToolsBundle\Manager\Level_0\ManagerTools\ManagerProviderInterface;
use Exception;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Throwable;
class QuoteTransformationEventSubscriber implements EventSubscriberInterface
{
protected ManagerProviderInterface $managerProvider;
protected EntityManagerHelper $entityManagerHelper;
protected BookingFactory $bookingFactory;
protected BookingConfirmationFactory $bookingConfirmationFactory;
protected ReminderFactory $reminderFactory;
protected AssureverInsuranceValidator $assureverInsuranceValidator;
protected ReminderManager $reminderManager;
protected TranslatorInterface $translator;
protected BookingManager $bookingManager;
protected QuoteEventHelper $quoteEventHelper;
protected CreaEventHelper $creaEventHelper;
public function __construct(ManagerProviderInterface $managerProvider,
EntityManagerHelper $entityManagerHelper,
BookingFactory $bookingFactory,
BookingConfirmationFactory $bookingConfirmationFactory,
ReminderFactory $reminderFactory,
AssureverInsuranceValidator $assureverInsuranceValidator,
ReminderManager $reminderManager,
TranslatorInterface $translator,
BookingManager $bookingManager,
QuoteEventHelper $quoteEventHelper,
CreaEventHelper $creaEventHelper)
{
$this->managerProvider = $managerProvider;
$this->entityManagerHelper = $entityManagerHelper;
$this->bookingFactory = $bookingFactory;
$this->bookingConfirmationFactory = $bookingConfirmationFactory;
$this->reminderFactory = $reminderFactory;
$this->assureverInsuranceValidator = $assureverInsuranceValidator;
$this->reminderManager = $reminderManager;
$this->translator = $translator;
$this->bookingManager = $bookingManager;
$this->quoteEventHelper = $quoteEventHelper;
$this->creaEventHelper = $creaEventHelper;
}
public static function getSubscribedEvents(): array
{
return [
EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_CONFIRM_OPTION_ERROR => [['setQuoteOnError', 256], ['addManagerTask', 254]],
EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_FULLWEB_INCLUDED_SERVICES_ERROR => [['setQuoteOnError', 256], ['addManagerTask', 254]],
EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_BOOKING_ERROR => [['setQuoteOnError', 256], ['addManagerTask', 254], ['processDown', 253]],
EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_PAYMENT_ERROR => [['setQuoteOnError', 256], ['addManagerTask', 254], ['processDown', 253]],
EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_CALCULATION_ERROR => [['setQuoteOnError', 256], ['addManagerTask', 254]],
EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_BOOKING_CONFIRMATION_ERROR => [['setQuoteOnError', 256], ['addManagerTask', 254], ['processDown', 253]],
EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_INSURANCE_ERROR => [['setQuoteOnError', 256], ['addManagerTask', 254], ['processDown', 253]],
EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_REMINDER_ERROR => [['setQuoteOnError', 256], ['addManagerTask', 254], ['processDown', 253]],
EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_EMAIL_CONFIRMATION_ERROR => [['setQuoteOnError', 256], ['addManagerTask', 254]],
EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_EMAIL_OPINION_ERROR => [['setQuoteOnError', 256], ['addManagerTask', 254]],
EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_EMAIL_CRUISE_PREPARATION_ERROR => [['setQuoteOnError', 256], ['addManagerTask', 254]],
];
}
public function setQuoteOnError(CreaEvent $creaEvent)
{
$quote = $this->getQuote($creaEvent);
$quote->addToBookingExceptionEvent($creaEvent->getName());
$this->managerProvider->getManager(Quote::class)->update($quote, ["toBookingOnError" => true], true);
}
/**
* @throws Exception
*/
public function addManagerTask(CreaEvent $creaEvent)
{
$quote = $this->getQuote($creaEvent);
$object = $quote->getBooking() !== null ? $quote->getBooking() : $quote;
if ($creaEvent->isThrowException()) {
$this->reminderManager->setReminder($creaEvent->getMessage().' - la transformation doit être complétement relancée.', $object->getSeller(), $object);
}
else {
$this->reminderManager->setReminder($creaEvent->getMessage().' - une partie de la transformation doit être relancée depuis la page de détails de la réservation.', $object->getSeller(), $object);
}
}
/**
* @throws Exception
*/
public function processDown(CreaEvent $creaEvent)
{
$quote = $this->getQuote($creaEvent);
try {
if ($creaEvent->getCode() === EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_REMINDER_ERROR) {
$this->reminderFactory->unBuild($quote->getBooking());
}
if ($creaEvent->getCode() === EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_INSURANCE_ERROR) {
$this->assureverInsuranceValidator->unValidate($quote);
}
if ($creaEvent->getCode() === EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_BOOKING_CONFIRMATION_ERROR) {
$this->bookingConfirmationFactory->unBuild($quote->getBooking());
}
if ($creaEvent->getCode() === EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_PAYMENT_ERROR) {
//todo unSpendCredits and remove payments
}
if ($creaEvent->getCode() === EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_BOOKING_ERROR) {
$this->bookingManager->delete($quote->getBooking());
$this->entityManagerHelper->getEM()->flush();
}
}
catch (Throwable $e) {
$this->quoteEventHelper->setQuoteProcessTransformationEvent($quote, EventCodes::PROCESS_QUOTE_TRANSFORMATION_ERROR_PROCESS_DOWN, [], null, null, $e);
}
}
private function getQuote(CreaEvent $creaEvent): Quote
{
/** @var Quote $quote */
$quote = $this->creaEventHelper->getProjectEntity($creaEvent);
return $quote;
}
}