src/EventSubscriber/PaymentEventsSubscriber.php line 99

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber;
  4. use App\Entity\Vista\LoyaltyMember;
  5. use App\Event\PaymentConcessionEvent;
  6. use App\Event\PaymentTicketEvent;
  7. use App\Event\RefundTicketEvent;
  8. use App\Event\RefundTicketAnonymEvent;
  9. use App\Repository\BookingRepository as BookingHelper;
  10. use App\Helper\UserHelper;
  11. use App\Repository\ConcessionRepository;
  12. use App\Repository\MailingRepositoryInterface as MailingRepository;
  13. use App\Repository\SessionRepositoryInterface;
  14. use Psr\Log\LoggerInterface;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\Yaml\Yaml;
  17. class PaymentEventsSubscriber implements EventSubscriberInterface
  18. {
  19.     /** @var MailingRepository */
  20.     protected $mailer;
  21.     /** @var UserHelper */
  22.     protected $userHelper;
  23.     /** @var BookingHelper */
  24.     protected $bookingHelper;
  25.     /** @var SessionRepositoryInterface */
  26.     protected $sessionRepository;
  27.     /** @var ConcessionRepository */
  28.     protected $concessionRepository;
  29.     /** @var LoggerInterface */
  30.     protected $logger;
  31.     /** @var string */
  32.     protected $rootDir;
  33.     public function __construct(
  34.         MailingRepository $mailer,
  35.         UserHelper $userHelper,
  36.         BookingHelper $bookingHelper,
  37.         SessionRepositoryInterface $sessionRepository,
  38.         ConcessionRepository $concessionRepository,
  39.         LoggerInterface $logger,
  40.         string $rootDir
  41.     ) {
  42.         $this->mailer $mailer;
  43.         $this->userHelper $userHelper;
  44.         $this->sessionRepository $sessionRepository;
  45.         $this->bookingHelper $bookingHelper;
  46.         $this->concessionRepository $concessionRepository;
  47.         $this->rootDir $rootDir;
  48.         $this->logger $logger;
  49.     }
  50.     /**
  51.      * @inheritdoc
  52.      */
  53.     public static function getSubscribedEvents()
  54.     {
  55.         return [
  56.             PaymentTicketEvent::class => 'onTicketBought',
  57.             PaymentConcessionEvent::class => 'onConcessionBought',
  58.             RefundTicketEvent::class => 'onTicketRefund',
  59.             RefundTicketAnonymEvent::class => 'onTicketAnonymRefund',
  60.         ];
  61.     }
  62.     /**
  63.      * @param PaymentConcessionEvent $event
  64.      *
  65.      * @throws \GuzzleHttp\Exception\GuzzleException
  66.      */
  67.     public function onConcessionBought(PaymentConcessionEvent $event)
  68.     {
  69.         $transaction $event->getTransaction();
  70.         $concessionItem $this->concessionRepository->find($transaction->getConcessionItemId());
  71.         $user $this->userHelper->requestUser($transaction->getMemberId());
  72.         $booking $this->bookingHelper->getById($transaction->getVistaBookingId(), $transaction->getCinemaId());
  73.         $locale null;
  74.         if ($headers $transaction->getHeaders()) {
  75.             $locale $headers['Accept-Language'] ?? null;
  76.         }
  77.         $this->mailer->sendEmailOnChargeCbc($booking$concessionItem$usernull$locale);
  78.         $event->setResult($booking);
  79.     }
  80.     /**
  81.      * @param RefundTicketEvent $event
  82.      * @return void
  83.      * @throws \GuzzleHttp\Exception\GuzzleException
  84.      */
  85.     public function onTicketRefund(RefundTicketEvent $event)
  86.     {
  87.         $this->logger->debug('onTicketRefund Event received');
  88.         if ($event->getIsCbcRefund()) {
  89.             if ($event->getResult()) {
  90.                 $this->logger->debug('sending cbc refund success email');
  91.                 if (!$this->mailer->sendEmailOnCbcRefundSuccess($event->getBooking(), $event->getUser())) {
  92.                     $this->logger->error('error sending cbc refund success email');
  93.                 }
  94.             } else {
  95.                 $this->logger->debug('sending cbc refund failed email');
  96.                 if (getenv('EMAIL_REPORT')) {
  97.                     if (!$this->mailer->sendEmailOnCbcRefundFailed($event->getBooking(), $event->getUser(), getenv('EMAIL_REPORT'))) {
  98.                         $this->logger->error('error sending cbc refund failed email');
  99.                     }
  100.                 } else {
  101.                     $this->logger->warning('report email address not set');
  102.                 }
  103.             }
  104.         } else {
  105.             if ($event->getResult()) {
  106.                 $this->logger->debug('sending gift card refund success email');
  107.                 $event->getUser()->setCardNumber($event->getGiftCardNumber());
  108.                 if (!$this->mailer->sendEmailOnGiftCardRefundSuccess($event->getBooking(), $event->getUser())) {
  109.                     $this->logger->error('error sending gift card refund success email');
  110.                 }
  111.             } else {
  112.                 $this->logger->debug('sending gift card refund failed email');
  113.                 if (getenv('EMAIL_REPORT')) {
  114.                     if (!$this->mailer->sendEmailOnGiftCardRefundFailed($event->getBooking(), $event->getUser(), getenv('EMAIL_REPORT'))) {
  115.                         $this->logger->error('error sending gift card refund failed email');
  116.                     }
  117.                 } else {
  118.                     $this->logger->warning('report email address not set');
  119.                 }
  120.             }
  121.         }
  122.     }
  123.     /**
  124.      * @param RefundTicketAnonymEvent $event
  125.      * @return void
  126.      * @throws \GuzzleHttp\Exception\GuzzleException
  127.      */
  128.     public function onTicketAnonymRefund(RefundTicketAnonymEvent $event)
  129.     {
  130.         $this->logger->debug('onTicketAnonymRefund Event received');
  131.         if ($event->getResult()) {
  132.             $this->logger->debug('sending anonym gift card refund success email');
  133.             if (!$this->mailer->sendEmailOnGiftCardRefundSuccess($event->getBooking(), null$event->getEmail(), $event->getGiftCardNumber())) {
  134.                 $this->logger->error('error sending anonym gift card refund success email');
  135.             }
  136.         } else {
  137.             $this->logger->debug('sending anonym gift card refund failed email');
  138.             if (getenv('EMAIL_REPORT')) {
  139.                 if (!$this->mailer->sendEmailOnGiftCardRefundFailed($event->getBooking(), nullgetenv('EMAIL_REPORT'))) {
  140.                     $this->logger->error('error sending anonym gift card refund failed email');
  141.                 }
  142.             } else {
  143.                 $this->logger->warning('report anonym email address not set');
  144.             }
  145.         }
  146.     }
  147.     /**
  148.      * @param PaymentTicketEvent $event
  149.      * @return void
  150.      * @throws \GuzzleHttp\Exception\GuzzleException
  151.      */
  152.     public function onTicketBought(PaymentTicketEvent $event)
  153.     {
  154.         $this->logger->debug('onTicketBought Event received');
  155.         $session=null;
  156.         $transaction $event->getTransaction();
  157.         $booking $this->bookingHelper->getById($transaction->getVistaBookingId(), $transaction->getCinemaId());
  158.         if (null === $booking) {
  159.             return;
  160.         }
  161.         if( $booking->getTicketsCount()>0){
  162.             $session $this->sessionRepository->findOneBy([
  163.                 'cinemaId' => $transaction->getCinemaId(),
  164.                 'sessionId' => $booking->getTickets()[0]->getSessionId()
  165.             ]);
  166.             if (!$session){
  167.                 // read drive in cinema mapping config
  168.                 $di_mapping Yaml::parseFile($this->rootDir.'/config/drive_in_mapping.yml');
  169.                 // search session with drive-in cinema id if not found with real cinema id
  170.                 $cinemaId $transaction->getCinemaId();
  171.                 foreach ($di_mapping as $map) {
  172.                     if ($cinemaId === $map['host_cinema_id']) {
  173.                         $cinemaId $map['drive_in_cinema_id'];
  174.                         break;
  175.                     }
  176.                 }
  177.                 $session $this->sessionRepository->findOneBy([
  178.                     'sessionId' => $booking->getTickets()[0]->getSessionId(),
  179.                     'cinemaId' => $cinemaId
  180.                 ]);
  181.             }
  182.         } else {
  183.             $session $this->sessionRepository->findOneBy([
  184.                 'cinemaId' => $transaction->getCinemaId()
  185.             ]);
  186.             if (!$session){
  187.                 // read drive in cinema mapping config
  188.                 $di_mapping Yaml::parseFile($this->rootDir.'/config/drive_in_mapping.yml');
  189.                 // search session with drive-in cinema id if not found with real cinema id
  190.                 $cinemaId $transaction->getCinemaId();
  191.                 foreach ($di_mapping as $map) {
  192.                     if ($cinemaId === $map['host_cinema_id']) {
  193.                         $cinemaId $map['drive_in_cinema_id'];
  194.                         break;
  195.                     }
  196.                 }
  197.                 $session $this->sessionRepository->findOneBy([
  198.                     'cinemaId' => $cinemaId
  199.                 ]);
  200.             }
  201.         }
  202.         $user null;
  203.         if (null !== $transaction->getMemberId() and !empty($transaction->getMemberId())) {
  204.             $this->logger->debug('retrieving user');
  205.             $user $this->userHelper->requestUser($transaction->getMemberId());
  206.         }
  207.         $locale null;
  208.         if ($headers $transaction->getHeaders()) {
  209.             $locale $headers['Accept-Language'] ?? null;
  210.         }
  211.         if( $booking->getTicketsCount()>0){
  212.             if ($booking->isPaid()) {
  213.                 $this->logger->debug('sending ticket email');
  214.                 $this->mailer->sendEmailOnTicket($booking$session$user$transaction->getEmail(), $locale);
  215.             } elseif (!$booking->isPaid() && $user instanceof LoyaltyMember) {
  216.                 $this->logger->debug('sending reservation email');
  217.                 $this->mailer->sendEmailOnReservation($booking$session$user$transaction->getEmail());
  218.             }
  219.         } elseif ($booking->getConcessionsCount() > 0) {
  220.             if ($booking->isPaid()) {
  221.                 $this->logger->debug('sending concessions email');
  222.                 $this->mailer->sendEmailOnTicket($booking$session$user$transaction->getEmail(), $locale);
  223.             }
  224.         }
  225.         $event->setResult($booking);
  226.     }
  227. }