src/Manager/SessionDetailsManager.php line 278

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Manager;
  4. use App\Entity\Local\Response\SessionDetails;
  5. use App\Entity\Local\Restrictions;
  6. use App\Entity\Local\UserBalance;
  7. use App\Entity\Vista\LoyaltyMember;
  8. use App\Entity\Vista\Session;
  9. use App\Entity\Vista\SessionTicketType;
  10. use App\Repository\BookingRepository;
  11. use App\Repository\RestrictionsRepository;
  12. use App\Repository\SessionRepositoryInterface;
  13. use App\Repository\TicketRepository;
  14. use App\Repository\Vista\SessionVistaRepository;
  15. use Doctrine\Common\Persistence\ManagerRegistry;
  16. use Doctrine\ORM\EntityManager;
  17. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  18. //use Psr\Log\LoggerInterface;
  19. class SessionDetailsManager
  20. {
  21.     /**
  22.      * @var EntityManager
  23.      */
  24.     private $em;
  25.     /** @var RestrictionsRepository */
  26.     protected $restrictionsRepository;
  27.     /** @var BookingRepository */
  28.     protected $bookingRepository;
  29.     /** @var SessionRepositoryInterface */
  30.     protected $sessionRepository;
  31.     /** @var TicketRepository */
  32.     protected $ticketRepository;
  33.     /** @var SessionVistaRepository */
  34.     protected $sessionVistaRepository;
  35.     
  36. //    /** @var LoggerInterface */
  37.  //   private $logger;
  38.     public function __construct(
  39.         ManagerRegistry $registry,
  40.         SessionRepositoryInterface $sessionRepository,
  41.         BookingRepository $bookingRepository,
  42.         TicketRepository $ticketRepository,
  43.         RestrictionsRepository $restrictionsRepository,
  44.         SessionVistaRepository $sessionVistaRepository
  45. //        LoggerInterface $logger
  46.     ) {
  47.         $this->sessionRepository $sessionRepository;
  48.         $this->bookingRepository $bookingRepository;
  49.         $this->ticketRepository $ticketRepository;
  50.         $this->restrictionsRepository $restrictionsRepository;
  51.         $this->sessionVistaRepository $sessionVistaRepository;
  52. //        $this->logger = $logger;
  53.         $this->em $registry->getManager();        
  54.     }
  55.     /**
  56.      * Calculate restrictions for user sy Session.
  57.      *
  58.      * @param LoyaltyMember $user
  59.      * @param int $cinemaId
  60.      * @param \DateTimeInterface $date
  61.      * @return Restrictions
  62.      * @throws \Throwable
  63.      */
  64.     public function calculateRestrictions(LoyaltyMember $userint $cinemaId, \DateTimeInterface $date)
  65.     {
  66.         $restrictions $this->restrictionsRepository->findOrCreate();
  67.         $userRestrictions = clone $restrictions;
  68.         $bookings $this->bookingRepository->findAllByUser($user$cinemaId);
  69.         $tickets $restrictions->getMaxReservedTickets();
  70.         $bonusCardTickets $restrictions->getMaxBonusCardTickets();
  71.         foreach ($bookings as $booking) {
  72.             if ('0' !== $booking->getCancelledStatus()) {
  73.                 continue;
  74.             }
  75.             foreach ($booking->getTickets() as $ticket) {
  76.                 if ($date->format('Y-m-d') !== $ticket->getSessionDateTime()->format('Y-m-d')) {
  77.                     continue;
  78.                 }
  79.                 if (strpos($ticket->getDescription(), 'CBC') !== false) {
  80.                     $bonusCardTickets--;
  81.                     $tickets--;
  82.                 } else {
  83.                     if (!$booking->isPaid()) {
  84.                         $tickets--;
  85.                     }
  86.                 }
  87.             }
  88.         }
  89.         $tickets max($tickets0);
  90.         $bonusCardTickets min(max($bonusCardTickets0), $tickets);
  91.         $userRestrictions
  92.             ->setMaxBonusCardTickets($bonusCardTickets)
  93.             ->setMaxReservedBonusTickets($bonusCardTickets)
  94.             ->setMaxTickets($restrictions->getMaxTickets())
  95.             ->setMaxReservedTickets($tickets)
  96.             ->setOriginalRestrictions($restrictions);
  97.         return $userRestrictions;
  98.     }
  99.     /**
  100.      * Check if session has child tickets.
  101.      *
  102.      * @param Session $session
  103.      *
  104.      * @return bool
  105.      */
  106.     protected function hasChildTicketsOld(Session $session): bool
  107.     {
  108.         $tickets $this->ticketRepository->findByCinemaIdSessionId($session->getCinemaId(), $session->getSessionId());
  109.         /** @var SessionTicketType $ticket */
  110.         foreach ($tickets as $ticket) {
  111.             if ($ticket->isChildOnlyTicket()) {
  112.                 return true;
  113.             }
  114.         }
  115.         return false;
  116.     }
  117.     /**
  118.      * Check if session has reduced tickets.
  119.      *
  120.      * @param Session $session
  121.      *
  122.      * @return bool
  123.      */
  124.     protected function hasReducedTickets(Session $session): bool
  125.     {
  126.         $tickets $this->ticketRepository->findByCinemaIdSessionId($session->getCinemaId(), $session->getSessionId());
  127.         /** @var SessionTicketType $ticket */
  128.         $reducedTicketDesc '';
  129.         switch (getenv('APP_COUNTRY')) {
  130.             case 'aut'$reducedTicketDesc 'Ermäßigt'; break;            
  131.             case 'rou'$reducedTicketDesc 'Student'; break;
  132.             /*           
  133.             case 'hrv': $countryName = 'Croatia'; break;
  134.             case 'svn': $countryName = 'Slovenia'; break;                
  135.             case 'srb': $countryName = 'Serbia'; break;                
  136.             case 'rks': $countryName = 'Kosovo'; break;
  137.             case 'alb': $countryName = 'Albania'; break;            
  138.             case 'grc': $countryName = 'Greece'; break;            
  139.             case 'mkd': $countryName = 'Macedonia'; break;            
  140.             case 'bih': $countryName = 'Bosnia'; break;
  141.             case 'bil': $countryName = 'BosniaL'; break;
  142.             */
  143.             default: return false;
  144.         }
  145.         foreach ($tickets as $ticket) {
  146.             if (stripos($ticket->getDescriptionAlt(), $reducedTicketDesc) !== false)
  147.                 return true;
  148.         }
  149.         return false;
  150.     }
  151.     /**
  152.      * Check if session has tickets by type.
  153.      *
  154.      * @param array $tickets
  155.      * @param string $ticketsDesc
  156.      * @param string $ticketsNotDesc
  157.      * @param string $pckNotDesc
  158.      *
  159.      * @return bool
  160.      */
  161.     protected function hasTicketsByTypeAndNot(array $ticketsstring $ticketsDescstring $ticketsNotDescstring $pckNotDesc "PCK"): bool
  162.     {
  163.         /** @var SessionTicketType $ticket */
  164.         foreach ($tickets as $ticket) {
  165.             if (
  166.                 stripos($ticket->getDescriptionAlt(), $ticketsDesc) !== false &&
  167.                 stripos($ticket->getDescriptionAlt(), $ticketsNotDesc) === false &&
  168.                 stripos($ticket->getDescriptionAlt(), $pckNotDesc) === false
  169.             ) {
  170.                 return true;
  171.             }
  172.         }
  173.         return false;
  174.     }
  175.     /**
  176.      * Check if session has specific tickets.
  177.      *
  178.      * @param array $tickets
  179.      * @param string $ticketTypeDesc
  180.      *
  181.      * @return bool
  182.      */
  183.     protected function hasTicketsByType(array $ticketsstring $ticketTypeDesc): bool
  184.     {
  185.         /** @var SessionTicketType $ticket */
  186.         foreach ($tickets as $ticket) {
  187.             if (stripos($ticket->getDescriptionAlt(), $ticketTypeDesc) !== false)
  188.                 return true;
  189.         }
  190.         return false;
  191.     }
  192.     /**
  193.      * @param string $id
  194.      *
  195.      * @return Session
  196.      */
  197.     public function getById($id): Session
  198.     {
  199.         $session $this->sessionRepository->findOneBy(['id' => $id]);
  200.         if (null === $session) {
  201.             throw new NotFoundHttpException(sprintf('Session with id %s does not exists'$id));
  202.         }
  203.         return $session;
  204.     }
  205.     /**
  206.      * @param string $cinemaId
  207.      * @param int    $sessionId
  208.      *
  209.      * @throws NotFoundHttpException if session not found
  210.      * @return Session
  211.      */
  212.     public function loadSession(string $cinemaIdint $sessionId): Session
  213.     {
  214.         $id sprintf('%s-%s'$cinemaId$sessionId);
  215.         $vistaSession $this->sessionVistaRepository->find($id);
  216.         if (!$vistaSession) {
  217.             throw new NotFoundHttpException();
  218.         }
  219.         $this->em->getConnection()->beginTransaction();
  220.         try {
  221.             $session $this->sessionRepository->findForUpdate($id);
  222.             if (null === $session) {
  223.                 $this->em->getConnection()->rollBack();
  224.                 throw new NotFoundHttpException();
  225.             }
  226.             $session->setSeatsAvailable($vistaSession->getSeatsAvailable());
  227.             
  228.             if( $session->getSeatsTotal()>)
  229.                 $seatsAvailablePercent = ($session->getSeatsAvailable() / $session->getSeatsTotal()) * 100;
  230.             else
  231.                 $seatsAvailablePercent=100;
  232.             if ($seatsAvailablePercent $session->getCinema()->getYellowSeatsAvailablePercent()) {
  233.                 $session->setStatus(Session::STATUS_YELLOW);
  234.             }
  235.             $this->em->flush($session);
  236.             $this->em->getConnection()->commit();
  237.             return $session;
  238.         } catch (\Exception $e) {
  239.             $this->em->getConnection()->rollBack();
  240.             throw $e;
  241.         }
  242.     }
  243.     /**
  244.      * @param string $id
  245.      *
  246.      * @return SessionDetails
  247.      */
  248.     public function getDetails($id)
  249.     {
  250.         $session $this->getById($id);
  251.         $response = new SessionDetails();
  252.         //TAG:LANGUAGE
  253.         if( getenv('APP_COUNTRY') == 'aut' ||
  254.             getenv('APP_COUNTRY') == 'rou' ){
  255.             $response->setHasReducedTickets($this->hasReducedTickets($session));
  256.         } else {
  257.             $response->setHasReducedTickets(false);
  258.         }
  259.         
  260.         // Fetch tickets from session and cinema
  261.         $tickets $this->ticketRepository->findByCinemaIdSessionId($session->getCinemaId(), $session->getSessionId());
  262.         if (getenv('APP_COUNTRY') == 'grc') {
  263.             $response->setHasChildTickets(false);
  264.         } else {
  265.             $response->setHasChildTickets($this->hasTicketsByTypeAndNot($tickets"Child""Package Child""PCK"));
  266.         }
  267.         $response->setHasRegularTickets($this->hasTicketsByTypeAndNot($tickets"Regular""Package Regular""PCK"));
  268.         $response->setHasWheelchairTickets($this->hasTicketsByTypeAndNot($tickets"Wheelchair""Package Wheelchair""PCK"));
  269.         $response->setHasPackageRegular($this->hasTicketsByType($tickets"Package Regular"));
  270.         $response->setHasPackageClub($this->hasTicketsByType($tickets"Package Club"));
  271.         $response->setHasPackageChild($this->hasTicketsByType($tickets"Package Child"));
  272.         $response->setHasPackageReduced($this->hasTicketsByType($tickets"Package Reduced"));
  273.         $response->setHasCBCTickets($this->hasTicketsByType($tickets"CBC"));
  274.         $restrictions $this->restrictionsRepository->findOrCreate();
  275.         if (
  276.             $session->getCinema() &&
  277.             $session->getCinema()->getShowPopupOnPurchaseTicketsScreen() &&
  278.             $session->getCinema()->getPurchaseTicketsScreenPopupText()
  279.         ) {
  280.             $restrictions->setShowPopupOnPurchaseTicketsScreen($session->getCinema()->getShowPopupOnPurchaseTicketsScreen());
  281.             $restrictions->setPurchaseTicketsScreenPopupText($session->getCinema()->getPurchaseTicketsScreenPopupText());
  282.         }
  283.         $restrictions->setOriginalRestrictions(clone $restrictions);
  284.         $response->setRestrictions($restrictions);
  285.         $response->setSession($session);
  286.         $response->setScheduledFilm($session->getScheduledFilm());
  287.         return $response;
  288.     }
  289.     /**
  290.      * @param $id
  291.      * @param LoyaltyMember $user
  292.      * @param UserBalance $userBalance
  293.      *
  294.      * @return SessionDetails
  295.      * @throws \Throwable
  296.      */
  297.     public function getDetailsForUser($idLoyaltyMember $userUserBalance $userBalance)
  298.     {
  299.         $session $this->getById($id);
  300.         $response = new SessionDetails();
  301.         $response->setUserBalance($userBalance);
  302.         //TAG:LANGUAGE
  303.         if( getenv('APP_COUNTRY') == 'aut' ||
  304.             getenv('APP_COUNTRY') == 'rou' ){
  305.                 $response->setHasReducedTickets($this->hasReducedTickets($session));
  306.         } else {
  307.             $response->setHasReducedTickets(false);
  308.         }
  309.         
  310.         // Fetch tickets from session and cinema
  311.         $tickets $this->ticketRepository->findByCinemaIdSessionId($session->getCinemaId(), $session->getSessionId());
  312.         $response->setHasRegularTickets($this->hasTicketsByTypeAndNot($tickets"Regular""Package Regular""PCK"));
  313.         if (getenv('APP_COUNTRY') == 'grc') {
  314.             $response->setHasChildTickets(false);
  315.         } else {
  316.             $response->setHasChildTickets($this->hasTicketsByTypeAndNot($tickets"Child""Package Child""PCK"));
  317.         }
  318.         $response->setHasWheelchairTickets($this->hasTicketsByTypeAndNot($tickets"Wheelchair""Package Wheelchair""PCK"));
  319.         $response->setHasPackageRegular($this->hasTicketsByType($tickets"Package Regular"));
  320.         $response->setHasPackageClub($this->hasTicketsByType($tickets"Package Club"));
  321.         $response->setHasPackageChild($this->hasTicketsByType($tickets"Package Child"));
  322.         $response->setHasPackageReduced($this->hasTicketsByType($tickets"Package Reduced"));
  323.         $response->setHasCBCTickets($this->hasTicketsByType($tickets"CBC"));
  324.         
  325.         $restrictions $this->calculateRestrictions($user, (int) $session->getCinemaId(), $session->getShowtime());
  326.         if (
  327.             $session->getCinema() &&
  328.             $session->getCinema()->getShowPopupOnPurchaseTicketsScreen() &&
  329.             $session->getCinema()->getPurchaseTicketsScreenPopupText()
  330.         ) {
  331.             $restrictions->setShowPopupOnPurchaseTicketsScreen($session->getCinema()->getShowPopupOnPurchaseTicketsScreen());
  332.             $restrictions->setPurchaseTicketsScreenPopupText($session->getCinema()->getPurchaseTicketsScreenPopupText());
  333.         }
  334.         $response->setRestrictions($restrictions);
  335.         $response->setSession($session);
  336.         $response->setScheduledFilm($session->getScheduledFilm());
  337.         return $response;
  338.     }
  339. }