src/Controller/V1/User/BookingController.php line 42

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller\V1\User;
  4. use App\Entity\Local\GiftCard;
  5. use App\Entity\Local\Response\PaymentStartResponse;
  6. use App\Entity\Vista\Booking;
  7. use App\Entity\Vista\CancelBookingResponse;
  8. use App\Entity\Vista\LoyaltyMember;
  9. use App\Entity\Vista\VistaApiV2Response;
  10. use App\Exceptions\PaymentException;
  11. use App\Helper\MPay24Helper;
  12. use App\Helper\PaymentHelper;
  13. use App\Helper\OrderPaymentHelper;
  14. use App\Manager\SessionDetailsManager;
  15. use App\Helper\UserHelper;
  16. use App\Repository\BookingRepository;
  17. use App\Repository\CinemaRepository;
  18. use App\Repository\GiftCardsRepository;
  19. use App\Repository\MailingRepositoryInterface as MailingRepository;
  20. use App\Repository\RestrictionsRepository;
  21. use App\Repository\SessionRepositoryInterface;
  22. use App\Repository\UserBalanceTransactionRepository;
  23. use FOS\RestBundle\Controller\Annotations as Rest;
  24. use Nelmio\ApiDocBundle\Annotation\Model;
  25. use Nelmio\ApiDocBundle\Annotation\Security as NelmioSecurity;
  26. use Swagger\Annotations as SWG;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpFoundation\Response;
  29. use Symfony\Component\HttpFoundation\RedirectResponse;
  30. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  31. use Symfony\Component\Routing\Annotation\Route;
  32. use App\Security\Security as CoreSecurity;
  33. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  34. use Psr\Log\LoggerInterface;
  35. /**
  36.  * @Rest\Route("/users/bookings")
  37.  * @SWG\Tag(name="Booking_v1")
  38.  */
  39. class BookingController
  40. {
  41.     /** @var BookingRepository */
  42.     protected $bookingRepository;
  43.     /** @var UserHelper */
  44.     protected $userHelper;
  45.     /** @var MPay24Helper */
  46.     protected $mPay24Helper;
  47.     /** @var PaymentHelper */
  48.     protected $paymentHelper;
  49.     /** @var OrderPaymentHelper */
  50.     protected $orderPaymentHelper;
  51.     /** @var CinemaRepository */
  52.     protected $cinemaRepository;
  53.     /** @var UserBalanceTransactionRepository */
  54.     protected $balanceTransactionRepository;
  55.     /** @var RestrictionsRepository */
  56.     protected $restrictionsRepository;
  57.     /** @var SessionDetailsManager */
  58.     protected $sessionDetailsHelper;
  59.     /** @var SessionRepositoryInterface */
  60.     protected $sessionRepository;
  61.     /** @var MailingRepository */
  62.     protected $mailer;
  63.     /** @var GiftCardsRepository */
  64.     private $giftCardsRepository;
  65.     /** @var LoggerInterface */
  66.     protected $logger;
  67.     public function __construct(
  68.         BookingRepository $bookingRepository,
  69.         UserHelper $userHelper,
  70.         MPay24Helper $mPay24Helper,
  71.         PaymentHelper $paymentHelper,
  72.         OrderPaymentHelper $orderPaymentHelper,
  73.         CinemaRepository $cinemaRepository,
  74.         UserBalanceTransactionRepository $balanceTransactionRepository,
  75.         RestrictionsRepository $restrictionsRepository,
  76.         SessionRepositoryInterface $sessionRepository,
  77.         SessionDetailsManager $sessionDetailsHelper,
  78.         MailingRepository $mailer,
  79.         GiftCardsRepository $giftCardsRepository,
  80.         LoggerInterface $logger
  81.     ) {
  82.         $this->bookingRepository $bookingRepository;
  83.         $this->userHelper $userHelper;
  84.         $this->mPay24Helper $mPay24Helper;
  85.         $this->paymentHelper $paymentHelper;
  86.         $this->orderPaymentHelper $orderPaymentHelper;
  87.         $this->cinemaRepository $cinemaRepository;
  88.         $this->balanceTransactionRepository $balanceTransactionRepository;
  89.         $this->restrictionsRepository $restrictionsRepository;
  90.         $this->sessionDetailsHelper $sessionDetailsHelper;
  91.         $this->sessionRepository $sessionRepository;
  92.         $this->mailer $mailer;
  93.         $this->giftCardsRepository $giftCardsRepository;
  94.         $this->logger $logger;
  95.     }
  96.     /**
  97.      * @Rest\Route("", methods={"GET"})
  98.      * @NelmioSecurity(name="Bearer")
  99.      * @Rest\View()
  100.      *
  101.      * @SWG\Response(
  102.      *     response="200",
  103.      *     description="Success",
  104.      *     @SWG\Schema(type="array", items=@SWG\Items(ref=@Model(type=\App\Entity\Vista\Booking::class))))
  105.      *
  106.      * @param CoreSecurity $security
  107.      * @return array
  108.      * @throws \Throwable
  109.      */
  110.     public function indexAction(CoreSecurity $security)
  111.     {
  112.         /** @var LoyaltyMember $securityUser */
  113.         $securityUser $security->getUser();
  114.         /** @var LoyaltyMember $user */
  115.         $user $this->userHelper->requestUser($securityUser->getMemberId());
  116.         $result $this->bookingRepository->getAllByUserButLegacy($user);
  117.         $this->logger->info('found 'count($result) . ' valid bookings');
  118.         return $result;
  119.     }
  120.     /**
  121.      * @Rest\Route("/cinema/{cinemaId}", methods={"GET"})
  122.      * @NelmioSecurity(name="Bearer")
  123.      * @Rest\View()
  124.      *
  125.      * @SWG\Response(
  126.      *     response="200",
  127.      *     description="Success",
  128.      *     @SWG\Schema(type="array", items=@SWG\Items(ref=@Model(type=\App\Entity\Vista\Booking::class)))))
  129.      *
  130.      * @param CoreSecurity $security
  131.      * @param int $cinemaId
  132.      * @return array
  133.      * @throws \Throwable
  134.      */
  135.     public function getByCinemaId(CoreSecurity $securityint $cinemaId)
  136.     {
  137.         /** @var LoyaltyMember $user */
  138.         $user $security->getUser();
  139.         $this->userHelper->validate($user);
  140.         return $this->bookingRepository->getAllByUser($user$cinemaId);
  141.     }
  142.     /**
  143.      * @Rest\Route("/tickets", methods={"GET"})
  144.      * @NelmioSecurity(name="Bearer")
  145.      * @Rest\View()
  146.      *
  147.      * @SWG\Response(
  148.      *     response="200",
  149.      *     description="Success",
  150.      *     @SWG\Schema(type="array", items=@SWG\Items(ref=@Model(type=\App\Entity\Vista\Booking::class)))))
  151.      *
  152.      * @param CoreSecurity $security
  153.      * @return array
  154.      * @throws \Throwable
  155.      */
  156.     public function getTicketsAction(CoreSecurity $security)
  157.     {
  158.         /** @var LoyaltyMember $user */
  159.         $user $security->getUser();
  160.         $this->userHelper->validate($user);
  161.         return array_values($this->bookingRepository->getAllByUserButLegacy($user));
  162.     }
  163.     /**
  164.      * @Route("/pdf/{cinemaId}/{bookingId}", methods={"GET"})
  165.      * @NelmioSecurity(name="Bearer")
  166.      * @Rest\View()
  167.      *
  168.      * @SWG\Response(
  169.      *     response="200",
  170.      *     description="Success")
  171.      *
  172.      * @param CoreSecurity $security
  173.      * @param string $bookingId
  174.      * @param string $cinemaId
  175.      * @return Response
  176.      */
  177.     public function bookingPdfAction(CoreSecurity $securitystring $bookingIdstring $cinemaId)
  178.     {
  179.         $booking $this->bookingRepository->getById($bookingId$cinemaId);
  180.         if (null === $booking) {
  181.             throw new NotFoundHttpException();
  182.         }
  183.         /** @var LoyaltyMember $user */
  184.         $user $security->getUser();
  185.         $param = [];
  186.         $param['cinemaId'] = $booking->getCinemaId();
  187.         if ($booking->getTickets()) {
  188.             $param['sessionId'] = $booking->getTickets()[0]->getSessionId();
  189.         }
  190.         $session $this->sessionRepository->findOneBy($param);
  191.         $pdf $this->mailer->downloadTicketPdf($booking$session$usernull);
  192.         $response = new Response($pdf->getBody()->getContents());
  193.         $response->headers->set('Content-type''application/pdf');
  194.         return $response;
  195.     }
  196.     /**
  197.      * Perform payment
  198.      *
  199.      * @Rest\Route("/{bookingNumber}/payment", methods={"POST"})
  200.      * @Rest\View()
  201.      *
  202.      * @SWG\Response(
  203.      *     response="200",
  204.      *     description="Success",
  205.      *     @Model(type=\App\Entity\Local\Response\PaymentStartResponse::class))
  206.      *
  207.      * @param int $bookingNumber
  208.      * @param CoreSecurity $security
  209.      *
  210.      * @return PaymentStartResponse
  211.      * @throws \Doctrine\ORM\ORMException
  212.      * @throws \Doctrine\ORM\OptimisticLockException
  213.      * @throws \Symfony\Component\Serializer\Exception\ExceptionInterface
  214.      * @throws \Throwable
  215.      */
  216.     public function paymentAction(int $bookingNumberCoreSecurity $security)
  217.     {
  218.         /** @var LoyaltyMember $user */
  219.         $user $security->getUser();
  220.         $this->userHelper->validate($user);
  221.         $booking $this->bookingRepository->findBooking($bookingNumber$user);
  222.         if (null === $booking) {
  223.             throw new \InvalidArgumentException('Invalid booking id');
  224.         }
  225.         if ($booking->isPaid()) {
  226.             throw PaymentException::create(
  227.                 'The booking is already paid',
  228.                 PaymentException::CODE_PAYMENT_BOOKING_IS_PAID
  229.             );
  230.         }
  231.         $restrictions $this->restrictionsRepository->findOrCreate();
  232.         //error_log(sprintf("%s %s(%s) ", date('Y-m-d H:i:s'),  __METHOD__, __LINE__) . " paymentId(ordeId) {$booking->getPaymentId()}");
  233.         if(getenv('RAIFFEISEN_ADDRESS')) { /* Raiffeisen */
  234.             $paymentPageUrl = (getenv('DEV_SIRMA') ? 'http://' getenv('DEV_SIRMA') : getenv('SCHEME_AND_HTTP_HOST')) .
  235.                 sprintf("/api/v1/orders/bkn-%s/payment/raiffeisen-redirect/%s/%s/%s"$booking->getPaymentId(), $this->paymentHelper->startBookingPayment($booking$user), $booking->getTotalValueCents(), $booking->getCinemaId());
  236.         } else if(getenv('CPAY_ADDRESS')) { /* cPay */
  237.             $paymentPageUrl = (getenv('DEV_SIRMA') ? 'http://' getenv('DEV_SIRMA') : getenv('SCHEME_AND_HTTP_HOST')) .
  238.                 sprintf("/api/v1/orders/%s/payment/cpay-booking/%s/%s/%s"$booking->getPaymentId(), $this->paymentHelper->startBookingPayment($booking$user), $booking->getTotalValueCents(), $booking->getCinemaId());
  239.         } else if(getenv('KOM_BANK_ADDRESS')) {
  240.             $paymentPageUrl = (getenv('DEV_SIRMA') ? 'http://' getenv('DEV_SIRMA') : getenv('SCHEME_AND_HTTP_HOST')) .
  241.                 sprintf("/api/v1/orders/%s/payment/kom-bank-booking/%s/%s/%s"$booking->getPaymentId(), $this->paymentHelper->startBookingPayment($booking$user), $booking->getTotalValueCents(), $booking->getCinemaId());
  242.         } else { /* mpay24 */
  243.             $paymentPageUrl $this->mPay24Helper->startBookingPayment($booking$user);
  244.         }
  245.         return (new PaymentStartResponse())
  246.             ->setPaymentPageUrl($paymentPageUrl)
  247.             ->setOrderId(null)
  248.             ->setRestrictions($restrictions);
  249.     }
  250.     /**
  251.      * Perform payment with bonus card
  252.      *
  253.      * @Rest\Route("/{bookingNumber}/payment-with-bonus-card", methods={"POST"})
  254.      * @Rest\View()
  255.      *
  256.      * @SWG\Response(
  257.      *     response="200",
  258.      *     description="Success",
  259.      *     @Model(type=\App\Entity\Vista\Booking::class))
  260.      *
  261.      * @param int $bookingNumber
  262.      * @param CoreSecurity $security
  263.      * @return mixed
  264.      * @throws \GuzzleHttp\Exception\GuzzleException
  265.      * @throws \Throwable
  266.      */
  267.     public function paymentBonusCardAction(int $bookingNumberCoreSecurity $security)
  268.     {
  269.         /** @var LoyaltyMember $loyaltyMember */
  270.         $loyaltyMember $security->getUser();
  271.         /** @var Booking $booking */
  272.         if (null === ($booking $this->bookingRepository->findBooking($bookingNumber$loyaltyMember))) {
  273.             throw new \InvalidArgumentException('Invalid booking id');
  274.         }
  275.         if ($booking->isPaid()) {
  276.             throw PaymentException::create(
  277.                 'The booking is already paid',
  278.                 PaymentException::CODE_PAYMENT_BOOKING_IS_PAID
  279.             );
  280.         }
  281.         $this->userHelper->validate($loyaltyMember);
  282.         $session $this->sessionDetailsHelper->getById(sprintf(
  283.             '%s-%s',
  284.             $booking->getCinemaId(),
  285.             $booking->getTickets()[0]->getSessionId()
  286.         ));
  287.         return $this->orderPaymentHelper->makePaymentForBookingWithBonusCard(
  288.             $loyaltyMember,
  289.             $booking,
  290.             $session
  291.         );
  292.     }
  293.     /**
  294.      * Perform payment with gift cards
  295.      *
  296.      * @Rest\Route("/{bookingNumber}/payment-with-gift-card", methods={"POST"})
  297.      * @ParamConverter("giftcards", converter="fos_rest.request_body", class="array")
  298.      * @Rest\View()
  299.      *
  300.      * @SWG\Response(
  301.      *     response="200",
  302.      *     description="Success",
  303.      *     @Model(type=\App\Entity\Vista\Booking::class))
  304.      *
  305.      * @param int $bookingNumber
  306.      * @param array $giftcards
  307.      * @param CoreSecurity $security
  308.      * @return mixed
  309.      * @throws \GuzzleHttp\Exception\GuzzleException
  310.      * @throws \Throwable
  311.      */
  312.     public function paymentGiftCardAction(int $bookingNumber$giftcardsCoreSecurity $security)
  313.     {
  314.         /** @var LoyaltyMember $loyaltyMember */
  315.         $loyaltyMember $security->getUser();
  316.         $this->logger->debug('paying booking with ' .count($giftcards) . ' giftcard(s)');
  317.         $usedgiftcards=[];
  318.         foreach($giftcards as $gcitem){
  319.             $gc=(new GiftCard)
  320.                 ->setNumber($gcitem['Number'])
  321.                 ->setValueInCents($this->giftCardsRepository->getGiftCardValue($gcitem['Number']));
  322.             $usedgiftcards[]=$gc;
  323.         }        
  324.         usort($usedgiftcards, function($a$b){
  325.             return $a->getValueInCents() - $b->getValueInCents();
  326.         });
  327.         $this->logger->debug('found '.count($usedgiftcards). ' giftcards and sorted them');        
  328.         $this->logger->debug('searching booking '.$bookingNumber);        
  329.         /** @var Booking $booking */
  330.         if (null === ($booking $this->bookingRepository->findBooking($bookingNumber$loyaltyMember))) {
  331.             throw new \InvalidArgumentException('Invalid booking id');
  332.         }
  333.         if ($booking->isPaid()) {
  334.             throw PaymentException::create(
  335.                 'The booking is already paid',
  336.                 PaymentException::CODE_PAYMENT_BOOKING_IS_PAID
  337.             );
  338.         }
  339.         $this->logger->debug('requested booking found and booking is still not paid');
  340.         $this->userHelper->validate($loyaltyMember);
  341.         $session $this->sessionDetailsHelper->getById(sprintf(
  342.             '%s-%s',
  343.             $booking->getCinemaId(),
  344.             $booking->getTickets()[0]->getSessionId()
  345.         ));
  346.         return $this->orderPaymentHelper->makePaymentForBookingWithGiftCard(
  347.             $loyaltyMember,
  348.             $usedgiftcards,
  349.             $booking,
  350.             $session
  351.         );
  352.     }
  353.     /**
  354.      * Finish payment
  355.      *
  356.      * @Rest\Route("/{orderId}/payment-finish-kombank/{hash}/{result}", methods={"POST"}, name="booking_finish_kombank")
  357.      *
  358.      * @SWG\Response(response="200", description="Success")
  359.      *
  360.      * @param $orderId
  361.      * @param $hash
  362.      * @param $result
  363.      * @return Response
  364.      * @throws \Doctrine\ORM\ORMException
  365.      * @throws \Doctrine\ORM\OptimisticLockException
  366.      * @throws \GuzzleHttp\Exception\GuzzleException
  367.      * @throws \Throwable
  368.      */
  369.     public function paymentFinishKombank($orderId$hash$result) {        
  370.         $queryParams $_POST;
  371.         $transaction $this->paymentHelper->getTransaction($orderId);
  372.         $memberId $transaction->getMemberId();
  373.         $member = (new LoyaltyMember())->setMemberId($memberId);
  374.         $user $this->userHelper->validate($member);
  375.         $booking $this->bookingRepository->findBooking((int) $transaction->getVistaBookingNumber(), $user);
  376.         if (null === $booking) {
  377.             throw new \InvalidArgumentException(sprintf(
  378.                 'Invalid transaction, booking with number %s doesn\'t exist',
  379.                 $transaction->getVistaBookingNumber()
  380.             ));
  381.         }
  382.         if ($booking->isPaid() && 'success' === $result) {
  383.             return new RedirectResponse(sprintf(
  384.                 '%s/purchase/payment/%s',
  385.                 getenv('WEBSITE_SCHEME_AND_HTTP_HOST'),
  386.                 $result
  387.             ));
  388.         }
  389.         if ('success' === $result) {
  390.             $queryParams['STATUS'] = 'BILLED';
  391.         } else {
  392.             $queryParams['STATUS'] = 'FAILED';
  393.         }
  394.         if (!$booking->isPaid() && 'success' === $result) {
  395.             $this->paymentHelper->finishPayment($booking$hash$queryParams);
  396.             return new RedirectResponse(sprintf(
  397.                 '%s/purchase/payment/%s',
  398.                 getenv('WEBSITE_SCHEME_AND_HTTP_HOST'),
  399.                 $result
  400.             ));
  401.         }
  402.         return new RedirectResponse(sprintf(
  403.             '%s/purchase/payment/%s',
  404.             getenv('WEBSITE_SCHEME_AND_HTTP_HOST'),
  405.             $result
  406.         ));
  407.     }
  408.     /**
  409.      * Finish payment
  410.      *
  411.      * @Rest\Route("/{orderId}/payment-finish-cpay/{hash}/{result}", methods={"POST"}, name="booking_finish_cpay")
  412.      *
  413.      * @SWG\Response(response="200", description="Success")
  414.      *
  415.      * @param $orderId
  416.      * @param $hash
  417.      * @param $result
  418.      * @return Response
  419.      * @throws \Doctrine\ORM\ORMException
  420.      * @throws \Doctrine\ORM\OptimisticLockException
  421.      * @throws \GuzzleHttp\Exception\GuzzleException
  422.      * @throws \Throwable
  423.      */
  424.     public function paymentFinishCpay($orderId$hash$result) {
  425.         $queryParams $_POST;
  426.         //error_log(sprintf("%s %s(%s) ", date('Y-m-d H:i:s'),  __METHOD__, __LINE__) . var_export($queryParams, true));
  427.         $transaction $this->paymentHelper->getTransaction($orderId);
  428.         $memberId $transaction->getMemberId();
  429.         $member = (new LoyaltyMember())->setMemberId($memberId);
  430.         $user $this->userHelper->validate($member);
  431.         $booking $this->bookingRepository->findBooking((int) $transaction->getVistaBookingNumber(), $user);
  432.         if (null === $booking) {
  433.             throw new \InvalidArgumentException(sprintf(
  434.                 'Invalid transaction, booking with number %s doesn\'t exist',
  435.                 $transaction->getVistaBookingNumber()
  436.             ));
  437.         }
  438.         if ($booking->isPaid() && 'success' === $result) {
  439.             return new RedirectResponse(sprintf(
  440.                 '%s/purchase/payment/%s',
  441.                 getenv('WEBSITE_SCHEME_AND_HTTP_HOST'),
  442.                 $result
  443.             ));
  444.         }
  445.         if ('success' === $result) {
  446.             $queryParams['STATUS'] = 'BILLED';
  447.         } else {
  448.             $queryParams['STATUS'] = 'FAILED';
  449.         }
  450.         if (!$booking->isPaid() && 'success' === $result) {
  451.             $this->paymentHelper->finishPayment($booking$hash$queryParams);
  452.             return new RedirectResponse(sprintf(
  453.                 '%s/purchase/payment/%s',
  454.                 getenv('WEBSITE_SCHEME_AND_HTTP_HOST'),
  455.                 $result
  456.             ));
  457.         }
  458.         return new RedirectResponse(sprintf(
  459.             '%s/purchase/payment/%s',
  460.             getenv('WEBSITE_SCHEME_AND_HTTP_HOST'),
  461.             $result
  462.         ));
  463.     }
  464.     /**
  465.      * Finish  payment
  466.      *
  467.      * @Rest\Route("/{orderId}/payment-finish/{hash}", methods={"GET"}, name="booking_finish")
  468.      *
  469.      * @SWG\Response(response="200", description="Success")
  470.      *
  471.      * @param $orderId
  472.      * @param $hash
  473.      * @param Request $request
  474.      * @return Response
  475.      * @throws \Doctrine\ORM\ORMException
  476.      * @throws \Doctrine\ORM\OptimisticLockException
  477.      * @throws \GuzzleHttp\Exception\GuzzleException
  478.      * @throws \Throwable
  479.      */
  480.     public function paymentFinishAction($orderId$hashRequest $request)
  481.     {
  482.         $transaction $this->mPay24Helper->getTransaction($orderId);
  483.         $memberId $transaction->getMemberId();
  484.         $member = (new LoyaltyMember())->setMemberId($memberId);
  485.         $user $this->userHelper->validate($member);
  486.         // find booking ignoring filters like pickup time
  487.         $booking $this->bookingRepository->findBooking((int) $transaction->getVistaBookingNumber(), $usertrue);
  488.         if (null === $booking) {
  489.             throw new \InvalidArgumentException(sprintf(
  490.                 'Invalid transaction, booking with number %s doesn\'t exist',
  491.                 $transaction->getVistaBookingNumber()
  492.             ));
  493.         }
  494.         if ($booking->isPaid()) {
  495.             return new Response(MPay24Helper::PAYMENT_RESPONSE_OK);
  496.         }
  497.         $result $this->mPay24Helper->finishPayment($booking$hash$request->query->all());
  498.         return new Response($result->getResponse());
  499.     }
  500.     /**
  501.      * @Rest\Route("/get-single/{cinemaId}/{bookingId}", methods={"GET"})
  502.      * @Rest\View()
  503.      *
  504.      * @SWG\Response(
  505.      *     response="200",
  506.      *     description="Success",
  507.      *     @Model(type=\App\Entity\Vista\Booking::class))
  508.      *
  509.      * @param $bookingId
  510.      * @param $cinemaId
  511.      * @return mixed
  512.      */
  513.     public function getByIdCinemaAction($bookingId$cinemaId)
  514.     {
  515.         return $this->bookingRepository->getById($bookingId$cinemaId);
  516.     }
  517.     /**
  518.      * @Rest\Route("/cancel/{cinemaId}/{bookingNumber}", methods={"GET"})
  519.      * @NelmioSecurity(name="Bearer")
  520.      * @Rest\View()
  521.      *
  522.      * @SWG\Response(
  523.      *     response="200",
  524.      *     description="Success",
  525.      *     @Model(type=\App\Entity\Vista\CancelBookingResponse::class))
  526.      *
  527.      * @param $cinemaId
  528.      * @param $bookingNumber
  529.      * @return CancelBookingResponse
  530.      */
  531.     public function cancelAction($cinemaId$bookingNumber)
  532.     {
  533.         return $this->bookingRepository->cancel($cinemaId$bookingNumber);
  534.     }
  535.     /**
  536.      * @Rest\Route("/refund/{cinemaId}/{bookingNumber}", methods={"GET"})
  537.      * @NelmioSecurity(name="Bearer")
  538.      * @Rest\View()
  539.      *
  540.      * @SWG\Response(
  541.      *     response="200",
  542.      *     description="Success",
  543.      *     @Model(type=\App\Entity\Vista\CancelBookingResponse::class))
  544.      *
  545.      * @param $cinemaId
  546.      * @param $bookingNumber
  547.      * @param CoreSecurity $security
  548.      * @return VistaApiV2Response
  549.      */
  550.     public function refundAction($cinemaId$bookingNumberCoreSecurity $security)
  551.     {
  552.         return $this->bookingRepository->refund($security->getUser(), $cinemaId$bookingNumber);
  553.     }
  554.     /**
  555.      * @Rest\Route("/refundanonym/{bookingNumber}", methods={"POST"})
  556.      * @Rest\View()
  557.      *
  558.      * @SWG\Parameter(
  559.      *     name="body",
  560.      *     in="body",
  561.      *     @SWG\Schema(type="object",
  562.      *         @SWG\Property(property="email", type="string")))
  563.      * 
  564.      * @SWG\Response(
  565.      *     response="200",
  566.      *     description="Success",
  567.      *     @Model(type=\App\Entity\Vista\CancelBookingResponse::class))
  568.      *
  569.      * @param Request $request
  570.      * @return VistaApiV2Response
  571.      */
  572.     public function refundanonymAction(Request $request)
  573.     {
  574.         return $this->bookingRepository->refundanonym($request->get('email'), $request->get('bookingNumber'));
  575.     }
  576. }