src/FMT/Application/Controller/Common/CartController.php line 163

Open in your IDE?
  1. <?php
  2. namespace FMT\Application\Controller\Common;
  3. use Exception;
  4. use FMT\Data\Entity\CampaignBook;
  5. use FMT\Domain\Service\CartManagerInterface;
  6. use FMT\Domain\Service\PaymentManagerInterface;
  7. use FMT\Domain\Type\Payment\Settings;
  8. use FMT\Domain\Type\Payment\Donation;
  9. use FMT\Domain\Exception\CartActionException;
  10. use FMT\Application\Controller\AbstractBaseController;
  11. use FMT\Application\Controller\Student\DashboardController;
  12. use FMT\Application\FormType\PaymentType;
  13. use FMT\Application\Voter\TransactionVoter;
  14. use FMT\Application\Traits\ControllerHelperTrait;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  17. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  18. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  19. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  20. use Symfony\Component\HttpFoundation\JsonResponse;
  21. use Symfony\Component\HttpFoundation\RedirectResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  24. /**
  25.  * Class CartController
  26.  * @package FMT\Application\Controller\Common
  27.  * @Route("/cart")
  28.  * @Template()
  29.  */
  30. class CartController extends AbstractBaseController
  31. {
  32.     use ControllerHelperTrait;
  33.     const TRANSACTION_SESSION_KEY "thank_you_txn_id";
  34.     const ROUTE_ADD 'fmt-cart-add';
  35.     const ROUTE_REMOVE 'fmt-cart-remove';
  36.     const ROUTE_INDEX 'fmt-cart-index';
  37.     const ROUTE_CHECKOUT_THANK_YOU "fmt-checkout-thank-you";
  38.     /** @var string */
  39.     private $token;
  40.     /** @var PaymentManagerInterface */
  41.     private $manager;
  42.     /**
  43.      * CartController constructor.
  44.      * @param Settings $settings
  45.      */
  46.     public function __construct(Settings $settings)
  47.     {
  48.         $this->token $settings->publicKey;
  49.     }
  50.     /**
  51.      * @param PaymentManagerInterface $manager
  52.      * @required
  53.      */
  54.     public function setPaymentManager(PaymentManagerInterface $manager)
  55.     {
  56.         $this->manager $manager;
  57.     }
  58.     /**
  59.      * @param CampaignBook $product
  60.      * @param CartManagerInterface $cartManager
  61.      *
  62.      * @ParamConverter("product", class="FMT\Data\Entity\CampaignBook")
  63.      * @Method({"POST"})
  64.      * @Route("/add/{product}",
  65.      *     name=CartController::ROUTE_ADD,
  66.      *     requirements={"product"="\d+"},
  67.      *     options={"expose"=true},
  68.      *     condition="request.isXmlHttpRequest()"
  69.      * )
  70.      * @return JsonResponse
  71.      */
  72.     public function addAction(CampaignBook $productCartManagerInterface $cartManager)
  73.     {
  74.         $isSchoolActive $product->getCampaign()->getSchool()->isActive();
  75.         try {
  76.             if ($cartManager->hasProduct($product)) {
  77.                 $this->addFlashBagError('fmt.cart.product.add.duplicate_item');
  78.                 return $this->createFailureAjaxResponse(['is_school_active' => $isSchoolActive]);
  79.             }
  80.             if (!$cartManager->canAddProduct($product)) {
  81.                 $this->addFlashBagError('fmt.cart.product.add.can_not_add_item');
  82.                 return $this->createFailureAjaxResponse(['is_school_active' => $isSchoolActive]);
  83.             }
  84.             $cartManager->addProduct($product);
  85.             $cartManager->save();
  86.             $this->addFlashBagNotice('fmt.cart.product.add.success');
  87.             return $this->createSuccessAjaxResponse([
  88.                 'summary' => $cartManager->getSummary()->getFormattedArray(),
  89.             ]);
  90.         } catch (Exception $exception) {
  91.             $isSchoolActive $product->getCampaign()->getSchool()->isActive();
  92.             $cartManager->removeProducts();
  93.             $cartManager->delete();
  94.             return $this->createFailureAjaxResponse(['is_school_active' => $isSchoolActive]);
  95.         }
  96.     }
  97.     /**
  98.      * @param CampaignBook $product
  99.      * @param CartManagerInterface $cartManager
  100.      *
  101.      * @ParamConverter("product", class="FMT\Data\Entity\CampaignBook")
  102.      * @Route("/remove/{product}",
  103.      *     name=CartController::ROUTE_REMOVE,
  104.      *     requirements={"product"="\d+"},
  105.      *     options={"expose"=true},
  106.      *     condition="request.isXmlHttpRequest()"
  107.      * )
  108.      * @return JsonResponse
  109.      */
  110.     public function removeAction(CampaignBook $productCartManagerInterface $cartManager)
  111.     {
  112.         $isSchoolActive $product->getCampaign()->getSchool()->isActive();
  113.         if (!$cartManager->hasProduct($product)) {
  114.             $this->addFlashBagError('fmt.cart.product.remove.absent_item');
  115.             return $this->createFailureAjaxResponse();
  116.         }
  117.         $cartManager->removeProduct($product);
  118.         $cartManager->save();
  119.         $this->addFlashBagNotice('fmt.cart.product.remove.success');
  120.         return $this->createSuccessAjaxResponse([
  121.             'summary' => $cartManager->getSummary()->getFormattedArray(),
  122.             'is_school_active' => $isSchoolActive,
  123.         ]);
  124.     }
  125.     /**
  126.      * @param Request $request
  127.      * @param CartManagerInterface $cartManager
  128.      *
  129.      * @Route("/", name=CartController::ROUTE_INDEX)
  130.      *
  131.      * @Security(
  132.           "is_granted('ROLE_DONOR') or
  133.            is_granted('ROLE_STUDENT') or
  134.            is_granted('ROLE_ADMIN') or
  135.            is_granted('ROLE_SUPER_ADMIN') or
  136.            is_granted('IS_AUTHENTICATED_ANONYMOUSLY')"
  137.       )
  138.      * @return array|RedirectResponse
  139.      */
  140.     public function cartAction(Request $requestCartManagerInterface $cartManager)
  141.     {
  142.         $user $this->getUser();
  143.         $cart $cartManager->getCart();
  144.         $campaign $cart->getCampaign() ?: null;
  145.         if ($campaign && $campaign->isFinished()) {
  146.             $cartItems $cart->getItems();
  147.             foreach ($cartItems as $cartItem) {
  148.                 $book $cartItem->getBook();
  149.                 $cartManager->removeProduct($book);
  150.                 $cartManager->save();
  151.             }
  152.             return $this->redirectToRoute(self::ROUTE_INDEX);
  153.         }
  154.         $payWithDonations false;
  155.         if ($campaign) {
  156.             $cartItems $cart->getItems();
  157.             $updatedCart false;
  158.             foreach ($cartItems as $cartItem) {
  159.                 $book $cartItem->getBook();
  160.                 if ($book->getStatus() !== CampaignBook::STATUS_UNAVAILABLE) {
  161.                     $cartManager->removeProduct($book);
  162.                     $cartManager->save();
  163.                     $updatedCart true;
  164.                 }
  165.             }
  166.             if ($updatedCart) {
  167.                 return $this->redirectToRoute(self::ROUTE_INDEX);
  168.             }
  169.             $payWithDonations $cart->getShipping() + $cart->getPrice() <= $campaign->getFundedTotal();
  170.         }
  171.         $donation = new Donation($campaign $campaign->getUser() : $this->getUser());
  172.         $donation->setDonor($this->getUser());
  173.         if ($user && $user->isStudent()) {
  174.             $this->addFlashBagWarning('fmt.cart.errors.students_reminder');
  175.         }
  176.         $attributes = [
  177.             "action" => $this->generateUrl(self::ROUTE_INDEX),
  178.             "attr" => [
  179.                 "data-checkout" => true,
  180.                 "data-token" => $this->token
  181.             ]
  182.         ];
  183.                 
  184.         $form $this->createForm(PaymentType::class, $donation$attributes);
  185.         $form->handleRequest($request);
  186.         $response = [
  187.             "form" => $form->createView(),
  188.             "cart" => $cart,
  189.             "student" => $user && $user->isStudent(),
  190.             "payWithDonations" => $payWithDonations,
  191.         ];
  192.         if ($form->isSubmitted() && $form->isValid()) {
  193.             try {
  194.                 $orderInfo $cartManager->sendDonationOrder($donation$cart);
  195.                 $orderExternalId $orderInfo["orderExternalId"];
  196.                 $transaction $orderInfo["transaction"];
  197.                 if (!$orderExternalId) {
  198.                     $this->addFlashBagError('fmt.cart.errors.send_order');
  199.                     return $response;
  200.                 }
  201.                 if (!$transaction) {
  202.                     $this->addFlashBagError('fmt.cart.errors.send_payment');
  203.                     return $response;
  204.                 }
  205.                 $this->setSessionVariable(self::TRANSACTION_SESSION_KEY$transaction->getId());
  206.             } catch (CartActionException $exception) {
  207.                 $this->addFlashBagError($exception->getMessage());
  208.                 return $response;
  209.             }
  210.             if ($user && $user->isStudent()) {
  211.                 return $this->redirectToRoute(DashboardController::ROUTE_INDEX);
  212.             }
  213.             return $this->redirectToRoute(self::ROUTE_CHECKOUT_THANK_YOU);
  214.         }
  215.         return $response;
  216.     }
  217.     /**
  218.      * @param Request $request
  219.      * @return array
  220.      * @Route("/thank-you-for-checkout", name=CartController::ROUTE_CHECKOUT_THANK_YOU)
  221.      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  222.      */
  223.     public function checkoutThankYouAction(Request $requestPaymentManagerInterface $paymentManager)
  224.     {
  225.         if (!$this->hasSessionVariable(self::TRANSACTION_SESSION_KEY)) {
  226.             throw new NotFoundHttpException("Transaction is not defined for this page");
  227.         }
  228.         $transaction $paymentManager->getTransaction($this->getSessionVariable(self::TRANSACTION_SESSION_KEY));
  229.         $this->denyAccessUnlessGranted(TransactionVoter::CAN_VIEW_TRANSACTION$transaction);
  230.         return [
  231.             "student" => $transaction->getRecipient()->getProfile()->getFirstName(),
  232.             "isRegistered" => is_null($this->getUser()),
  233.         ];
  234.     }
  235. }