src/Bidcoz/Bundle/FrontendBundle/Controller/Account/CampaignPurchaseController.php line 34

Open in your IDE?
  1. <?php
  2. namespace Bidcoz\Bundle\FrontendBundle\Controller\Account;
  3. use Bidcoz\Bundle\CoreBundle\Controller\CoreController;
  4. use Bidcoz\Bundle\CoreBundle\Entity\Campaign;
  5. use Bidcoz\Bundle\CoreBundle\Entity\Organization;
  6. use Bidcoz\Bundle\CoreBundle\Entity\PaymentGateway\Account\Account;
  7. use Bidcoz\Bundle\CoreBundle\Entity\Proxy\StripeCreditCardProxy;
  8. use Bidcoz\Bundle\CoreBundle\Entity\Purchase\Purchase;
  9. use Bidcoz\Bundle\CoreBundle\Entity\User;
  10. use Bidcoz\Bundle\CoreBundle\Exception\InvalidPurchaseException;
  11. use Bidcoz\Bundle\CoreBundle\Exception\ItemUnavailableException;
  12. use Bidcoz\Bundle\CoreBundle\Form\Type\PurchaseQuestionType;
  13. use Bidcoz\Bundle\CoreBundle\Form\Type\StripeCreditCardType;
  14. use Bidcoz\Bundle\FrontendBundle\Form\Type\Donation\CashType;
  15. use Bidcoz\Bundle\FrontendBundle\Form\Type\UserFeeType;
  16. use Bidcoz\Bundle\FrontendBundle\Form\Type\UserPreferredPaymentGatewayType;
  17. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  18. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. /**
  22.  * @Route("/account/purchases/{orgSlug}/{campaignSlug}")
  23.  * @IsGranted("VIEW", subject="organization")
  24.  * @IsGranted("FRONT_END", subject="campaign")
  25.  */
  26. class CampaignPurchaseController extends CoreController
  27. {
  28.     /**
  29.      * @Route("", name="account_campaign_purchases")
  30.      */
  31.     public function campaignPurchasesAction(Organization $organizationCampaign $campaign)
  32.     {
  33.         $user      $this->getUser();
  34.         $purchases $this->getPurchaseManager()->getUserPendingPurchasesForCampaign($user$campaign);
  35.         $proxy     $this->getTransactionManager()->createTransactionProxy($campaign$user$purchases);
  36.         try {
  37.             $this->getPurchaseManager()->ensurePurchasesValid($proxy);
  38.         } catch (InvalidPurchaseException $e) {
  39.             if ($e instanceof ItemUnavailableException) {
  40.                 $item    $e->getItem();
  41.                 $message sprintf(
  42.                     'Item %s removed: %s',
  43.                     $item->getName(),
  44.                     $e->getMessage()
  45.                 );
  46.             } else {
  47.                 $purchase $e->getPurchase();
  48.                 $message  sprintf(
  49.                     '%s is being removed from your purchases: %s',
  50.                     $purchase->getDescription(),
  51.                     $e->getMessage()
  52.                 );
  53.             }
  54.             $this->addFlash('danger'$message);
  55.             $this->getEntityManager()->flush();
  56.             return $this->redirectToRoute('account_campaign_purchases', [
  57.                 'orgSlug'      => $organization->getSlug(),
  58.                 'campaignSlug' => $campaign->getSlug(),
  59.             ]);
  60.         }
  61.         $result           $this->getTransactionManager()->createTransactionResult($proxy);
  62.         $feeForm          $this->getFeeForm($user);
  63.         $cashDonationForm $this->getCashDonationForm();
  64.         $showPayPal = !$organization->isStripeAllowed() && $organization->hasPaymentGatewayAccountType(Account::PAYPAL);
  65.         $showStripe $organization->isStripeAllowed() && $organization->hasPaymentGatewayAccountType(Account::STRIPE);
  66.         $payByCheck $campaign->isPayByCheck();
  67.         $showExternal $campaign->isExternalPaymentAllowed();
  68.         $customPayment $campaign->showCustomPaymentInstructions();
  69.         $flightSimulatorPayment $this->getFlightSimulatorManager()->isHiddenOrGlobal($campaign);
  70.         $cc $showStripe $this->getCcManager()->getCC($campaign$user) : null;
  71.         if ($showStripe && !$cc && $campaign->hasAuction() && $campaign->hasTickets() && $campaign->getCollectCcInfo()) {
  72.             $ccProxy = new StripeCreditCardProxy();
  73.             $ccForm  $this->getCCForm($ccProxy)->createView();
  74.         } else {
  75.             $ccForm null;
  76.         }
  77.         if ($payByCheck) {
  78.             $payByCheckPurchases array_filter($purchases, function (Purchase $purchase) {
  79.                 return $purchase->isPurchasePayableOffline();
  80.             });
  81.             if (=== count($payByCheckPurchases)) {
  82.                 $payByCheck false;
  83.             }
  84.         }
  85.         $purchaseForms = [];
  86.         foreach ($purchases as $purchase) {
  87.             if ($purchase->hasQuestion()) {
  88.                 $purchaseForms[$purchase->getId()] = $this->getPurchaseQuestionForm($purchase)->createView();
  89.             }
  90.         }
  91.         $session $this->getSession();
  92.         $session->set('stripe:charge:org'$organization->getSlug());
  93.         $session->set('stripe:charge:campaign'$campaign->getSlug());
  94.         $proxy  $this->getTransactionManager()->createTransactionProxy($campaign$user);
  95.         $result $this->getTransactionManager()->createTransactionResult($proxy);
  96.         $this->getTransactionManager()->logTransactionResult($result);
  97.         $params = [
  98.             'organization' => $organization,
  99.             'campaign' => $campaign,
  100.             'result' => $result,
  101.             'feeForm' => $feeForm->createView(),
  102.             'cashDonationForm' => $cashDonationForm->createView(),
  103.             'showPayPal' => $showPayPal,
  104.             'showStripe' => $showStripe,
  105.             'showExternal' => $showExternal,
  106.             'payByCheck' => $payByCheck,
  107.             'tomorrow' => new \DateTime('tomorrow'),
  108.             'customPayment' => $customPayment,
  109.             'flightSimulatorPayment' => $flightSimulatorPayment,
  110.             'cc' => $cc,
  111.             'ccForm' => $ccForm,
  112.             'purchaseForms' => $purchaseForms,
  113.         ];
  114.         return $this->render('@BidcozFrontend/Account/Purchases/campaign.html.twig'$params);
  115.     }
  116.     /**
  117.      * @Route("/zero-dollar", name="account_zero_dollar_purchase", methods={"POST"})
  118.      */
  119.     public function zeroDollarPurchaseAction(Request $requestOrganization $organizationCampaign $campaign)
  120.     {
  121.         $user      $this->getUser();
  122.         $purchases $this->getPurchaseManager()->getUserPendingPurchasesForCampaign($user$campaign);
  123.         $proxy     $this->getTransactionManager()->createTransactionProxy($campaign$user$purchases);
  124.         $result    $this->getTransactionManager()->createTransactionResult($proxy);
  125.         if ($result->getTotal() > 0) {
  126.             $this->addFlash('danger''Only zero dollar purchases can be completed by this method');
  127.             return $this->redirectToRoute('account_campaign_purchases', [
  128.                 'orgSlug'      => $organization->getSlug(),
  129.                 'campaignSlug' => $campaign->getSlug(),
  130.             ]);
  131.         }
  132.         $proxy->setType('cash');
  133.         $this->getTransactionManager()->createTransaction($proxy);
  134.         $this->getEntityManager()->flush();
  135.         return $this->redirectToRoute('account_campaign_purchase_zero_dollar_success', [
  136.             'orgSlug'      => $organization->getSlug(),
  137.             'campaignSlug' => $campaign->getSlug(),
  138.         ]);
  139.     }
  140.     /**
  141.      * @Route("/flight-simulator", name="account_flight_simulator_purchase", methods={"POST"})
  142.      */
  143.     public function flightSimulatorPurchaseAction(Request $requestOrganization $organizationCampaign $campaign)
  144.     {
  145.         $user $this->getUser();
  146.         $purchases $this->getPurchaseManager()->getUserPendingPurchasesForCampaign($user$campaign);
  147.         $proxy $this->getTransactionManager()->createTransactionProxy($campaign$user$purchases);
  148.         $result $this->getTransactionManager()->createTransactionResult($proxy);
  149.         if (!$this->getFlightSimulatorManager()->isHiddenOrGlobal($campaign)) {
  150.             $this->addFlash('danger''Only [Flight Simulator] purchases can be completed by this method');
  151.             return $this->redirectToRoute('account_campaign_purchases', [
  152.                 'orgSlug' => $organization->getSlug(),
  153.                 'campaignSlug' => $campaign->getSlug(),
  154.             ]);
  155.         }
  156.         $proxy->setType('flight_simulator');
  157.         $this->getTransactionManager()->createTransaction($proxy, [], truetrue);
  158.         $this->getEntityManager()->flush();
  159.         return $this->redirectToRoute('account_campaign_purchase_flight_simulator_success', [
  160.             'orgSlug'      => $organization->getSlug(),
  161.             'campaignSlug' => $campaign->getSlug(),
  162.         ]);
  163.     }
  164.     protected function getCCForm(StripeCreditCardProxy $proxy)
  165.     {
  166.         return $this->createForm(StripeCreditCardType::class, $proxy);
  167.     }
  168.     protected function getPurchaseQuestionForm(Purchase $purchase)
  169.     {
  170.         return $this->createForm(PurchaseQuestionType::class, $purchase);
  171.     }
  172.     /**
  173.      * @Route("/update-user-fee-type", name="account_fee_type", methods={"POST"})
  174.      */
  175.     public function userFeeAction(Request $requestOrganization $organizationCampaign $campaign)
  176.     {
  177.         $feeForm $this->getFeeForm($this->getUser());
  178.         $feeForm->handleRequest($request);
  179.         if ($feeForm->isValid()) {
  180.             $this->getEntityManager()->flush();
  181.         }
  182.         return $this->redirectToRoute('account_campaign_purchases', [
  183.             'orgSlug'      => $organization->getSlug(),
  184.             'campaignSlug' => $campaign->getSlug(),
  185.         ]);
  186.     }
  187.     /**
  188.      * @Route("/update-preferred-payment-gateway", name="account_preferred_payment_gateway", methods={"POST"})
  189.      */
  190.     public function preferredPaymentGatewayAction(Request $requestOrganization $organizationCampaign $campaign)
  191.     {
  192.         $preferredPaymentGatewayForm $this->getPreferredPaymentGatewayForm($this->getUser(), $organization);
  193.         $preferredPaymentGatewayForm->handleRequest($request);
  194.         if ($preferredPaymentGatewayForm->isValid()) {
  195.             $this->getEntityManager()->flush();
  196.         }
  197.         return $this->redirectToRoute('account_campaign_purchases', [
  198.             'orgSlug'      => $organization->getSlug(),
  199.             'campaignSlug' => $campaign->getSlug(),
  200.         ]);
  201.     }
  202.     /**
  203.      * @Route("/paypal/success", name="account_campaign_purchase_paypal_success")
  204.      */
  205.     public function paypalSuccessAction(Organization $organizationCampaign $campaign)
  206.     {
  207.         return $this->render('@BidcozFrontend/Account/Purchases/PayPal/success.html.twig', [
  208.             'organization' => $organization,
  209.             'campaign'     => $campaign,
  210.         ]);
  211.     }
  212.     /**
  213.      * @Route("/stripe/success", name="account_campaign_purchase_stripe_success")
  214.      */
  215.     public function stripeSuccessAction(Organization $organizationCampaign $campaign)
  216.     {
  217.         return $this->render('@BidcozFrontend/Account/Purchases/Stripe/success.html.twig', [
  218.             'organization' => $organization,
  219.             'campaign'     => $campaign,
  220.         ]);
  221.     }
  222.     /**
  223.      * @Route("/check/success", name="account_campaign_purchase_check_success")
  224.      */
  225.     public function checkSuccessAction(Organization $organizationCampaign $campaign)
  226.     {
  227.         return $this->render('@BidcozFrontend/Account/Purchases/Check/success.html.twig', [
  228.             'organization' => $organization,
  229.             'campaign'     => $campaign,
  230.         ]);
  231.     }
  232.     /**
  233.      * @Route("/external/success", name="account_campaign_purchase_external_success")
  234.      */
  235.     public function externalSuccessAction(Organization $organizationCampaign $campaign)
  236.     {
  237.         return $this->render('@BidcozFrontend/Account/Purchases/External/success.html.twig', [
  238.             'organization' => $organization,
  239.             'campaign'     => $campaign,
  240.         ]);
  241.     }
  242.     /**
  243.      * @Route("/zero-dollar/success", name="account_campaign_purchase_zero_dollar_success")
  244.      */
  245.     public function zeroDollarSuccessAction(Organization $organizationCampaign $campaign)
  246.     {
  247.         return $this->render('@BidcozFrontend/Account/Purchases/ZeroDollar/success.html.twig', [
  248.             'organization' => $organization,
  249.             'campaign'     => $campaign,
  250.         ]);
  251.     }
  252.     /**
  253.      * @Route("/flight-simulator/success", name="account_campaign_purchase_flight_simulator_success")
  254.      */
  255.     public function flightSimulatorSuccessAction(Organization $organizationCampaign $campaign)
  256.     {
  257.         return $this->render('@BidcozFrontend/Account/Purchases/FlightSimulator/success.html.twig', [
  258.             'organization' => $organization,
  259.             'campaign'     => $campaign,
  260.         ]);
  261.     }
  262.     protected function getPreferredPaymentGatewayForm(User $userOrganization $organization)
  263.     {
  264.         return $this->createForm(UserPreferredPaymentGatewayType::class, $user, [
  265.             'organization' => $organization,
  266.         ]);
  267.     }
  268.     protected function getFeeForm(User $user)
  269.     {
  270.         return $this->createForm(UserFeeType::class, $user);
  271.     }
  272.     protected function getCashDonationForm()
  273.     {
  274.         return $this->createForm(CashType::class);
  275.     }
  276. }