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.             'hasUnansweredRequiredQuestions' => $this->getPurchaseManager()->hasUnansweredRequiredQuestions($purchases),
  114.         ];
  115.         return $this->render('@BidcozFrontend/Account/Purchases/campaign.html.twig'$params);
  116.     }
  117.     /**
  118.      * @Route("/zero-dollar", name="account_zero_dollar_purchase", methods={"POST"})
  119.      */
  120.     public function zeroDollarPurchaseAction(Request $requestOrganization $organizationCampaign $campaign)
  121.     {
  122.         $user      $this->getUser();
  123.         $purchases $this->getPurchaseManager()->getUserPendingPurchasesForCampaign($user$campaign);
  124.         if ($redirect $this->redirectIfUnansweredRequiredQuestions($organization$campaign)) {
  125.             return $redirect;
  126.         }
  127.         $proxy     $this->getTransactionManager()->createTransactionProxy($campaign$user$purchases);
  128.         $result    $this->getTransactionManager()->createTransactionResult($proxy);
  129.         if ($result->getTotal() > 0) {
  130.             $this->addFlash('danger''Only zero dollar purchases can be completed by this method');
  131.             return $this->redirectToRoute('account_campaign_purchases', [
  132.                 'orgSlug'      => $organization->getSlug(),
  133.                 'campaignSlug' => $campaign->getSlug(),
  134.             ]);
  135.         }
  136.         $proxy->setType('cash');
  137.         $this->getTransactionManager()->createTransaction($proxy);
  138.         $this->getEntityManager()->flush();
  139.         return $this->redirectToRoute('account_campaign_purchase_zero_dollar_success', [
  140.             'orgSlug'      => $organization->getSlug(),
  141.             'campaignSlug' => $campaign->getSlug(),
  142.         ]);
  143.     }
  144.     /**
  145.      * @Route("/flight-simulator", name="account_flight_simulator_purchase", methods={"POST"})
  146.      */
  147.     public function flightSimulatorPurchaseAction(Request $requestOrganization $organizationCampaign $campaign)
  148.     {
  149.         $user $this->getUser();
  150.         $purchases $this->getPurchaseManager()->getUserPendingPurchasesForCampaign($user$campaign);
  151.         if ($redirect $this->redirectIfUnansweredRequiredQuestions($organization$campaign)) {
  152.             return $redirect;
  153.         }
  154.         $proxy $this->getTransactionManager()->createTransactionProxy($campaign$user$purchases);
  155.         $result $this->getTransactionManager()->createTransactionResult($proxy);
  156.         if (!$this->getFlightSimulatorManager()->isHiddenOrGlobal($campaign)) {
  157.             $this->addFlash('danger''Only [Flight Simulator] purchases can be completed by this method');
  158.             return $this->redirectToRoute('account_campaign_purchases', [
  159.                 'orgSlug' => $organization->getSlug(),
  160.                 'campaignSlug' => $campaign->getSlug(),
  161.             ]);
  162.         }
  163.         $proxy->setType('flight_simulator');
  164.         $this->getTransactionManager()->createTransaction($proxy, [], truetrue);
  165.         $this->getEntityManager()->flush();
  166.         return $this->redirectToRoute('account_campaign_purchase_flight_simulator_success', [
  167.             'orgSlug'      => $organization->getSlug(),
  168.             'campaignSlug' => $campaign->getSlug(),
  169.         ]);
  170.     }
  171.     protected function getCCForm(StripeCreditCardProxy $proxy)
  172.     {
  173.         return $this->createForm(StripeCreditCardType::class, $proxy);
  174.     }
  175.     protected function getPurchaseQuestionForm(Purchase $purchase)
  176.     {
  177.         return $this->createForm(PurchaseQuestionType::class, $purchase);
  178.     }
  179.     /**
  180.      * @Route("/update-user-fee-type", name="account_fee_type", methods={"POST"})
  181.      */
  182.     public function userFeeAction(Request $requestOrganization $organizationCampaign $campaign)
  183.     {
  184.         $feeForm $this->getFeeForm($this->getUser());
  185.         $feeForm->handleRequest($request);
  186.         if ($feeForm->isValid()) {
  187.             $this->getEntityManager()->flush();
  188.         }
  189.         return $this->redirectToRoute('account_campaign_purchases', [
  190.             'orgSlug'      => $organization->getSlug(),
  191.             'campaignSlug' => $campaign->getSlug(),
  192.         ]);
  193.     }
  194.     /**
  195.      * @Route("/update-preferred-payment-gateway", name="account_preferred_payment_gateway", methods={"POST"})
  196.      */
  197.     public function preferredPaymentGatewayAction(Request $requestOrganization $organizationCampaign $campaign)
  198.     {
  199.         $preferredPaymentGatewayForm $this->getPreferredPaymentGatewayForm($this->getUser(), $organization);
  200.         $preferredPaymentGatewayForm->handleRequest($request);
  201.         if ($preferredPaymentGatewayForm->isValid()) {
  202.             $this->getEntityManager()->flush();
  203.         }
  204.         return $this->redirectToRoute('account_campaign_purchases', [
  205.             'orgSlug'      => $organization->getSlug(),
  206.             'campaignSlug' => $campaign->getSlug(),
  207.         ]);
  208.     }
  209.     /**
  210.      * @Route("/paypal/success", name="account_campaign_purchase_paypal_success")
  211.      */
  212.     public function paypalSuccessAction(Organization $organizationCampaign $campaign)
  213.     {
  214.         return $this->render('@BidcozFrontend/Account/Purchases/PayPal/success.html.twig', [
  215.             'organization' => $organization,
  216.             'campaign'     => $campaign,
  217.         ]);
  218.     }
  219.     /**
  220.      * @Route("/stripe/success", name="account_campaign_purchase_stripe_success")
  221.      */
  222.     public function stripeSuccessAction(Organization $organizationCampaign $campaign)
  223.     {
  224.         return $this->render('@BidcozFrontend/Account/Purchases/Stripe/success.html.twig', [
  225.             'organization' => $organization,
  226.             'campaign'     => $campaign,
  227.         ]);
  228.     }
  229.     /**
  230.      * @Route("/check/success", name="account_campaign_purchase_check_success")
  231.      */
  232.     public function checkSuccessAction(Organization $organizationCampaign $campaign)
  233.     {
  234.         return $this->render('@BidcozFrontend/Account/Purchases/Check/success.html.twig', [
  235.             'organization' => $organization,
  236.             'campaign'     => $campaign,
  237.         ]);
  238.     }
  239.     /**
  240.      * @Route("/external/success", name="account_campaign_purchase_external_success")
  241.      */
  242.     public function externalSuccessAction(Organization $organizationCampaign $campaign)
  243.     {
  244.         return $this->render('@BidcozFrontend/Account/Purchases/External/success.html.twig', [
  245.             'organization' => $organization,
  246.             'campaign'     => $campaign,
  247.         ]);
  248.     }
  249.     /**
  250.      * @Route("/zero-dollar/success", name="account_campaign_purchase_zero_dollar_success")
  251.      */
  252.     public function zeroDollarSuccessAction(Organization $organizationCampaign $campaign)
  253.     {
  254.         return $this->render('@BidcozFrontend/Account/Purchases/ZeroDollar/success.html.twig', [
  255.             'organization' => $organization,
  256.             'campaign'     => $campaign,
  257.         ]);
  258.     }
  259.     /**
  260.      * @Route("/flight-simulator/success", name="account_campaign_purchase_flight_simulator_success")
  261.      */
  262.     public function flightSimulatorSuccessAction(Organization $organizationCampaign $campaign)
  263.     {
  264.         return $this->render('@BidcozFrontend/Account/Purchases/FlightSimulator/success.html.twig', [
  265.             'organization' => $organization,
  266.             'campaign'     => $campaign,
  267.         ]);
  268.     }
  269.     protected function getPreferredPaymentGatewayForm(User $userOrganization $organization)
  270.     {
  271.         return $this->createForm(UserPreferredPaymentGatewayType::class, $user, [
  272.             'organization' => $organization,
  273.         ]);
  274.     }
  275.     protected function getFeeForm(User $user)
  276.     {
  277.         return $this->createForm(UserFeeType::class, $user);
  278.     }
  279.     protected function getCashDonationForm()
  280.     {
  281.         return $this->createForm(CashType::class);
  282.     }
  283. }