src/BookingProcess/ProcessEventSubscriber/BookingProcessEventSubscriber.php line 60

Open in your IDE?
  1. <?php
  2. namespace App\BookingProcess\ProcessEventSubscriber;
  3. use App\BookingProcess\ProcessCruiseDataAdapter\CostaCruiseDataToQuoteAdapter;
  4. use App\BookingProcess\ProcessEvent\BookingProcessEvents;
  5. use App\BookingProcess\ProcessEvent\QuoteToBookingPostProcessEvent;
  6. use App\BookingProcess\ProcessEvent\QuoteToBookingPreProcessEvent;
  7. use App\BookingProcess\ProcessHelper\Company\Option\OptionHelperProvider;
  8. use App\BookingProcess\ProcessQuoteToBooking\ReminderFactory;
  9. use App\Entity\Booking\Booking;
  10. use App\Entity\Booking\Quote;
  11. use App\Entity\EventCodes;
  12. use App\Helper\__Quote\QuoteEventHelper;
  13. use App\Manager\Company\Costa\CostaBookingManager;
  14. use App\Manager\CruiseData\Costa\CostaCruiseData;
  15. use App\Repository\Booking\QuoteRepository;
  16. use App\Repository\Cruise\Company\CompanyRepository;
  17. use Crea\ToolsBundle\Manager\Level_0\ManagerTools\ManagerProviderInterface;
  18. use Exception;
  19. use Psr\Cache\InvalidArgumentException;
  20. use stdClass;
  21. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  22. class BookingProcessEventSubscriber implements EventSubscriberInterface
  23. {
  24.     protected ManagerProviderInterface $managerProvider;
  25.     protected QuoteEventHelper $quoteEventHelper;
  26.     protected CostaCruiseDataToQuoteAdapter $costaCruiseDataToQuoteAdapter;
  27.     protected ReminderFactory $reminderFactory;
  28.     protected OptionHelperProvider $optionHelperProvider;
  29.     protected CostaBookingManager $costaBookingManager;
  30.     public function __construct(ManagerProviderInterface $managerProvider,
  31.                                 QuoteEventHelper $quoteEventHelper,
  32.                                 CostaCruiseDataToQuoteAdapter $costaCruiseDataToQuoteAdapter,
  33.                                 ReminderFactory $reminderFactory,
  34.                                 OptionHelperProvider $optionHelperProvider,
  35.                                 CostaBookingManager $costaBookingManager)
  36.     {
  37.         $this->managerProvider $managerProvider;
  38.         $this->quoteEventHelper $quoteEventHelper;
  39.         $this->costaCruiseDataToQuoteAdapter $costaCruiseDataToQuoteAdapter;
  40.         $this->reminderFactory $reminderFactory;
  41.         $this->optionHelperProvider $optionHelperProvider;
  42.         $this->costaBookingManager $costaBookingManager;
  43.     }
  44.     public static function getSubscribedEvents(): array
  45.     {
  46.         return [
  47.             BookingProcessEvents::QUOTE_TO_BOOKING_PRE_PROCESS => 'preProcess',
  48.             BookingProcessEvents::QUOTE_TO_BOOKING_POST_PROCESS => 'postProcess',
  49.         ];
  50.     }
  51.     /**
  52.      * @throws Exception|InvalidArgumentException
  53.      */
  54.     public function preProcess(QuoteToBookingPreProcessEvent $event): void
  55.     {
  56.         //init quote error field
  57.         $this->managerProvider->getManager(Quote::class)->update($event->getQuote(), [
  58.             'toBookingOnError' => false,
  59.             'toBookingExceptionEvents' => [],
  60.         ], true);
  61.         //confirm option
  62.         switch ($event->getQuote()->getConverter()) {
  63.             case QuoteRepository::QUOTE_CONVERTER_FULLWEB:
  64.             case QuoteRepository::QUOTE_CONVERTER_B2B:
  65.                 try {
  66.                     if (null !== $optionHelper $this->optionHelperProvider->getOptionHelper($event->getQuote())) {
  67.                         $httpResult $optionHelper->confirmOption($event->getQuote());
  68.                         if (!$httpResult->isValid()) {
  69.                             throw new Exception($httpResult->getData()["error"]);
  70.                         }
  71.                         else {
  72.                             $this->quoteEventHelper->setQuoteProcessTransformationEvent($event->getQuote(), EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_CONFIRM_OPTION_SUCCESS);
  73.                         }
  74.                     }
  75.                 }
  76.                 catch (\Throwable $e) {
  77.                     $this->quoteEventHelper->setQuoteProcessTransformationEvent($event->getQuote(), EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_CONFIRM_OPTION_ERROR, [], nullnull$e);
  78.                 }
  79.                 break;
  80.         }
  81.         //add included services in quote (Fullweb)
  82.         //after option confirmation because immediate confirm cruise (no booking number in this case because we have not set option)
  83.         if ($event->getQuote()->getConverter() === QuoteRepository::QUOTE_CONVERTER_FULLWEB) {
  84.             try {
  85.                 switch ($event->getQuote()->getCruiseHistory()->getShip()->getCompany()->getCode()) {
  86.                     case CompanyRepository::COMPANY_COSTA_CODE:
  87.                         //booking number from fullweb cruise data
  88.                         $fullwebCostaCruiseData $this->costaCruiseDataToQuoteAdapter->getCostaCruiseData($event->getQuote());
  89.                         $bookingNumber $fullwebCostaCruiseData->getBookingNumber();
  90.                         //get B2B cruise data from company COSTA
  91.                         $response $this->costaBookingManager->displayBooking($bookingNumber);
  92.                         if (isset($response->error)) {
  93.                             throw new Exception('Le numéro de réservation '.$bookingNumber.' n\'a pas été trouvé');
  94.                         }
  95.                         $B2BCostaCruiseData = new StdClass();
  96.                         $B2BCostaCruiseData->data $response->DisplayBookingResult;
  97.                         //get included services
  98.                         $this->costaCruiseDataToQuoteAdapter->setServices(
  99.                             $event->getQuote(),
  100.                             new CostaCruiseData(json_encode($B2BCostaCruiseData))
  101.                         );
  102.                         break;
  103.                 }
  104.                 $this->quoteEventHelper->setQuoteProcessTransformationEvent($event->getQuote(), EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_FULLWEB_INCLUDED_SERVICES_SUCCESS);
  105.             }
  106.             catch (\Throwable $e) {
  107.                 $this->quoteEventHelper->setQuoteProcessTransformationEvent($event->getQuote(), EventCodes::PROCESS_QUOTE_TRANSFORMATION_STEP_FULLWEB_INCLUDED_SERVICES_ERROR, [], nullnull$e);
  108.             }
  109.         }
  110.     }
  111.     /**
  112.      * @throws Exception
  113.      */
  114.     public function postProcess(QuoteToBookingPostProcessEvent $event): void
  115.     {
  116.         //transfer errors from quote to booking
  117.         $this->managerProvider->getManager(Booking::class)->update(
  118.             $event->getBooking(),
  119.             ['toBookingExceptionEvents' => $event->getBooking()->getQuote()->getToBookingExceptionEvents()],
  120.             true
  121.         );
  122.         //reminder new booking
  123.         switch($event->getBooking()->getQuote()->getConverter()){
  124.             case QuoteRepository::QUOTE_CONVERTER_MANUAL:
  125.                 $this->reminderFactory->build($event->getBooking());
  126.             break;
  127.         }
  128.     }
  129. }