src/Controller/V1/User/BalanceController.php line 105

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller\V1\User;
  4. use App\Entity\Local\Response\PaymentStartResponse;
  5. use App\Entity\Vista\LoyaltyMember;
  6. use App\Entity\Vista\MemberTransaction;
  7. use App\Entity\Vista\Order;
  8. use App\Helper\MPay24Helper;
  9. use App\Helper\PaymentHelper;
  10. use App\Helper\UserHelper;
  11. use App\Repository\CinemaRepository;
  12. use App\Repository\ConcessionRepository;
  13. use App\Repository\OrderRepositoryInterface;
  14. use App\Repository\RestrictionsRepository;
  15. use App\Repository\UserBalanceRepository;
  16. use App\Repository\UserBalanceTransactionRepository;
  17. use DateTimeImmutable;
  18. use FOS\RestBundle\Controller\AbstractFOSRestController;
  19. use FOS\RestBundle\Controller\Annotations as Rest;
  20. use Nelmio\ApiDocBundle\Annotation\Model;
  21. use Nelmio\ApiDocBundle\Annotation\Security as NelmioSecurity;
  22. use Swagger\Annotations as SWG;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use App\Security\Security as CoreSecurity;
  26. use App\Repository\RewardRepository;
  27. use App\Form\DataTransformer\VistaTimestampToDateTimeTransformer;
  28. /**
  29.  * @Route("/users/balance")
  30.  * @NelmioSecurity(name="Bearer")
  31.  * @SWG\Tag(name="Balance_v1")
  32.  */
  33. class BalanceController extends AbstractFOSRestController
  34. {
  35.     /** @var UserBalanceRepository */
  36.     protected $userBalanceRepository;
  37.     /** @var UserBalanceTransactionRepository */
  38.     protected $balanceTransactionRepository;
  39.     /** @var ConcessionRepository */
  40.     protected $concessionRepository;
  41.     /** @var UserHelper */
  42.     protected $userHelper;
  43.     /** @var MPay24Helper */
  44.     protected $MPay24Helper;
  45.     /** @var PaymentHelper */
  46.     protected $paymentHelper;
  47.     /** @var OrderRepositoryInterface */
  48.     protected $orderRepository;
  49.     /** @var RestrictionsRepository */
  50.     protected $restrictionsRepository;
  51.     /** @var CinemaRepository */
  52.     protected $cinemaRepository;
  53.     /** @var RewardRepository */
  54.     protected $rewardRepository;
  55.     public function __construct(
  56.         UserBalanceRepository $userBalanceRepository,
  57.         UserBalanceTransactionRepository $balanceTransactionRepository,
  58.         ConcessionRepository $concessionRepository,
  59.         UserHelper $userHelper,
  60.         MPay24Helper $MPay24Helper,
  61.         PaymentHelper $paymentHelper,
  62.         OrderRepositoryInterface $orderRepository,
  63.         RestrictionsRepository $restrictionsRepository,
  64.         CinemaRepository $cinemaRepository,
  65.         RewardRepository $rewardRepository
  66.     ) {
  67.         $this->userBalanceRepository $userBalanceRepository;
  68.         $this->balanceTransactionRepository $balanceTransactionRepository;
  69.         $this->concessionRepository $concessionRepository;
  70.         $this->userHelper $userHelper;
  71.         $this->MPay24Helper $MPay24Helper;
  72.         $this->paymentHelper $paymentHelper;
  73.         $this->orderRepository $orderRepository;
  74.         $this->restrictionsRepository $restrictionsRepository;
  75.         $this->cinemaRepository $cinemaRepository;
  76.         $this->rewardRepository $rewardRepository;
  77.     }
  78.     /**
  79.      * @Route("", methods={"GET"})
  80.      * @Rest\View()
  81.      *
  82.      * @SWG\Response(
  83.      *     response="200",
  84.      *     description="Success",
  85.      *     @Model(type=\App\Entity\Local\UserBalance::class))
  86.      *
  87.      * @param CoreSecurity $security
  88.      * @return \App\Entity\Local\UserBalance
  89.      */
  90.     public function indexAction(CoreSecurity $security)
  91.     {
  92.         /** @var LoyaltyMember $securityUser */
  93.         $securityUser $security->getUser();
  94.         /** @var LoyaltyMember $user */
  95.         $user $this->userHelper->requestUser($securityUser->getMemberId());
  96.         return $this->userBalanceRepository->findByUser($user);
  97.     }
  98.     /**
  99.      * @Route("/transactions", methods={"GET"})
  100.      * @Rest\QueryParam(name="to", allowBlank=true)
  101.      * @Rest\QueryParam(name="limit", allowBlank=true)
  102.      * @Rest\View()
  103.      *
  104.      * @SWG\Response(
  105.      *     response="200",
  106.      *     description="Success",
  107.      *     @SWG\Schema(type="array", items=@SWG\Items(ref=@Model(type=MemberTransaction::class))))
  108.      *
  109.      * @param CoreSecurity           $security
  110.      * @param DateTimeImmutable|null $to
  111.      * @param string|null            $limit
  112.      *
  113.      * @return MemberTransaction[]|array|null
  114.      * @throws \Throwable
  115.      */
  116.     public function transactionsAction(CoreSecurity $security, ?\DateTimeImmutable $to, ?string $limit)
  117.     {
  118.         /** @var LoyaltyMember $user */
  119.         $user $security->getUser();
  120.         $filter = [
  121.             'UserSessionId' => $user->getUserSessionId(),
  122.             'ReturnMemberTransactionDetails' => true,
  123.         ];
  124.         if ($to == null) {
  125.             $to = new \DateTime('now');
  126.         }
  127.         $to = new \DateTime($to->format('Y-m-d 23:59:59'));
  128.         if (empty($limit)) $limit "1500";
  129.         $filter['MaxResults'] = (int) $limit;
  130.         $filter['DateFrom'] = sprintf('/Date(%s)/', (new \DateTimeImmutable('-18 month'))->getTimestamp() * 1000);
  131.         $filter['DateTo'] = sprintf('/Date(%s)/'$to->getTimestamp() * 1000);
  132.         return $this->balanceTransactionRepository->findBy($filter);
  133.     }
  134.     /**
  135.      * @Route("/concessions", methods={"GET"})
  136.      * @Rest\View()
  137.      *
  138.      * @SWG\Response(
  139.      *     response="200",
  140.      *     description="Success",
  141.      *     @SWG\Schema(type="array", items=@SWG\Items(ref=@Model(type=\App\Entity\Vista\ConcessionItem::class))))
  142.      *
  143.      * @param CoreSecurity $security
  144.      * @return \App\Entity\Vista\ConcessionItem[]
  145.      */
  146.     public function concessionsAction(CoreSecurity $security)
  147.     {
  148.         /** @var LoyaltyMember $user */
  149.         $user $this->userHelper->requestUser($security->getUser()->getMemberId());
  150.         return $this->concessionRepository->findByUser($user);
  151.     }
  152.     /**
  153.      * @Route("/concessions", methods={"POST"})
  154.      * @SWG\Parameter(
  155.      *     name="concessionItem",
  156.      *     in="body",
  157.      *     type="object",
  158.      *     @SWG\Schema(@SWG\Property(type="string", property="concessionId")))
  159.      * @Rest\View()
  160.      *
  161.      * @SWG\Response(
  162.      *     response="201",
  163.      *     description="success",
  164.      *     @SWG\Schema(@Model(type=PaymentStartResponse::class)))
  165.      * @SWG\Response(
  166.      *     response="400",
  167.      *     description="Desired value of the card balance is bigger than maximum")
  168.      *
  169.      * @param CoreSecurity $security
  170.      * @param Request $request
  171.      * @return PaymentStartResponse
  172.      * @throws \Doctrine\ORM\ORMException
  173.      * @throws \Doctrine\ORM\OptimisticLockException
  174.      * @throws \GuzzleHttp\Exception\GuzzleException
  175.      * @throws \Symfony\Component\Serializer\Exception\ExceptionInterface
  176.      */
  177.     public function rechargeAction(CoreSecurity $securityRequest $request)
  178.     {
  179.         /**
  180.          * @var LoyaltyMember $user
  181.          */
  182.         $user $security->getUser();
  183.         $order = (new Order())->setCinemaId(getenv('VISTA_BACKOFFICE_ID'))
  184.             ->setBookingDate(new \DateTimeImmutable())
  185.         ;
  186.         $cinema $this->cinemaRepository->find(getenv('VISTA_BACKOFFICE_ID'));
  187.         if (null === $cinema) {
  188.             throw new \InvalidArgumentException('Invalid VISTA_BACKOFFICE_ID');
  189.         }
  190.         $order->setCinemaName($cinema->getName());
  191.         $this->orderRepository->create($order);
  192.         $updatedUser $this->userHelper->validate($user$order->getUserSessionId());
  193.         $concessionItem $this->concessionRepository->find($request->get('concessionId'));
  194.         $order->setConcessionItem($concessionItem);
  195.         if(getenv('CPAY_ADDRESS') || getenv('RAIFFEISEN_ADDRESS') || getenv('KOM_BANK_ADDRESS')) {
  196.             $transactionsToCancel $this->paymentHelper->findCancelList($user->getMemberId());
  197.             foreach ($transactionsToCancel as $transaction) {
  198.                 $orderToCheck $this->orderRepository->findOneBy(['userSessionId' => $transaction->getUserSessionId()]);
  199.                 if (null !== $orderToCheck && $this->paymentHelper->canBeCanceled($orderToCheck)) {
  200.                     $this->orderRepository->cancel($orderToCheck);
  201.                 }
  202.             }
  203.         } else { /* mpay24 */
  204.             $transactionsToCancel $this->MPay24Helper->findCancelList($user->getMemberId());
  205.             foreach ($transactionsToCancel as $transaction) {
  206.                 $orderToCheck $this->orderRepository->findOneBy(['userSessionId' => $transaction->getUserSessionId()]);
  207.                 if (null !== $orderToCheck && $this->MPay24Helper->canBeCanceled($orderToCheck)) {
  208.                     $this->orderRepository->cancel($orderToCheck);
  209.                 }
  210.             }
  211.         }
  212.         $result $this->userBalanceRepository->startRecharge(
  213.             $updatedUser,
  214.             $order,
  215.             $concessionItem
  216.         );
  217.         $order->setOrderTotalValueInCents($result->Order->TotalValueCents);
  218.         $this->userHelper->validate($user$order->getUserSessionId());
  219.         $restrictions $this->restrictionsRepository->findOrCreate();
  220.         
  221.         if(getenv('CPAY_ADDRESS')) { /* cPay */
  222.             $paymentPageUrl = (getenv('DEV_SIRMA') ? 'http://' getenv('DEV_SIRMA') : getenv('SCHEME_AND_HTTP_HOST')) .
  223.                 sprintf("/api/v1/orders/%s/payment/cpay-redirect/%s/%s/%s"$order->getUserSessionId(), $this->paymentHelper->startConcessionPayment($order$updatedUser$concessionItem), $order->getOrderTotalValueInCents(), $order->getCinemaId());
  224.         } else if(getenv('RAIFFEISEN_ADDRESS')) { /* Raiffeisen */
  225.             $paymentPageUrl = (getenv('DEV_SIRMA') ? 'http://' getenv('DEV_SIRMA') : getenv('SCHEME_AND_HTTP_HOST')) .
  226.                 sprintf("/api/v1/orders/ord-%s/payment/raiffeisen-redirect/%s/%s/%s"$order->getUserSessionId(), $this->paymentHelper->startConcessionPayment($order$updatedUser$concessionItem), $order->getOrderTotalValueInCents(), $order->getCinemaId());
  227.         } else if(getenv('KOM_BANK_ADDRESS')) { /* KomBank */
  228.             $paymentPageUrl = (getenv('DEV_SIRMA') ? 'http://' getenv('DEV_SIRMA') : getenv('SCHEME_AND_HTTP_HOST')) .
  229.                 sprintf("/api/v1/orders/%s/payment/kom-bank-redirect/%s/%s/%s"$order->getUserSessionId(), $this->paymentHelper->startConcessionPayment($order$updatedUser$concessionItem), $order->getOrderTotalValueInCents(), $order->getCinemaId());
  230.         } else { /* mpay24 */
  231.             $paymentPageUrl $this->MPay24Helper->startConcessionPayment($order$updatedUser$concessionItem);
  232.         }
  233.         $response = (new PaymentStartResponse())
  234.             ->setPaymentPageUrl($paymentPageUrl)
  235.             ->setOrderId($order->getUserSessionId())
  236.             ->setRestrictions($restrictions);
  237.         $order->setState(Order::STATE_PAYMENT_STARTED);
  238.         $this->orderRepository->save($order);
  239.         return $response;
  240.     }
  241. }