src/Bidcoz/Bundle/FrontendBundle/Controller/DonationController.php line 47

Open in your IDE?
  1. <?php
  2. namespace Bidcoz\Bundle\FrontendBundle\Controller;
  3. use Bidcoz\Bundle\CoreBundle\Controller\CoreController;
  4. use Bidcoz\Bundle\CoreBundle\Entity\Address;
  5. use Bidcoz\Bundle\CoreBundle\Entity\Auction\Auction;
  6. use Bidcoz\Bundle\CoreBundle\Entity\Campaign;
  7. use Bidcoz\Bundle\CoreBundle\Entity\Donation\CashDonation;
  8. use Bidcoz\Bundle\CoreBundle\Entity\Donation\DonationLevel;
  9. use Bidcoz\Bundle\CoreBundle\Entity\Organization;
  10. use Bidcoz\Bundle\CoreBundle\Entity\PaymentGateway\Account\Account;
  11. use Bidcoz\Bundle\CoreBundle\Entity\Proxy\CashDonationProxy;
  12. use Bidcoz\Bundle\CoreBundle\Entity\Proxy\ItemDonationProxy;
  13. use Bidcoz\Bundle\CoreBundle\Entity\User;
  14. use Bidcoz\Bundle\FrontendBundle\Form\Type\AddressType;
  15. use Bidcoz\Bundle\FrontendBundle\Form\Type\Donation\CashDonationLevelType;
  16. use Bidcoz\Bundle\FrontendBundle\Form\Type\Donation\CashType;
  17. use Bidcoz\Bundle\FrontendBundle\Form\Type\Donation\ItemType;
  18. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  19. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  20. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. /**
  24.  * @Route("/{orgSlug}/{campaignSlug}/donate")
  25.  * @IsGranted("VIEW", subject="organization")
  26.  * @IsGranted("FRONT_END", subject="campaign")
  27.  */
  28. class DonationController extends CoreController
  29. {
  30.     /**
  31.      * @Route("", name="campaign_donate")
  32.      */
  33.     public function donateAction(Organization $organizationCampaign $campaign)
  34.     {
  35.         return $this->render('@BidcozFrontend/Campaign/Donate/index.html.twig', [
  36.             'organization' => $organization,
  37.             'campaign'     => $campaign,
  38.         ]);
  39.     }
  40.     /**
  41.      * @Route("/money", name="campaign_donate_cash")
  42.      */
  43.     public function donateMoneyAction(Request $requestOrganization $organizationCampaign $campaign)
  44.     {
  45.         $form $this->getCashDonationForm();
  46.         if ('POST' === $request->getMethod()) {
  47.             if (!$user $this->getUser()) {
  48.                 $this->addFlash('info''Please login or create an account before making a donation.');
  49.                 throw $this->createAccessDeniedException('Unable to access this page!');
  50.             }
  51.             $form->handleRequest($request);
  52.             if ($form->isSubmitted() && $form->isValid()) {
  53.                 $data $form->getData();
  54.                 $this->getDonationManager()->createSimpleCashDonation($campaign$user$data['amount']);
  55.                 $this->getEntityManager()->flush();
  56.                 $this->addFlash('success''Thank you for your donation');
  57.                 return $this->redirectToRoute('account_campaign_purchases', [
  58.                     'orgSlug'      => $organization->getSlug(),
  59.                     'campaignSlug' => $campaign->getSlug(),
  60.                 ]);
  61.             }
  62.         }
  63.         return $this->render('@BidcozFrontend/Campaign/Donate/donate_cash.html.twig', [
  64.             'organization' => $organization,
  65.             'campaign'     => $campaign,
  66.             'form'         => $form->createView(),
  67.         ]);
  68.     }
  69.     /**
  70.      * @Route("/money/level/{donation_level_id}", name="campaign_donate_cash_level", methods={"GET"})
  71.      * @ParamConverter("donationLevel", class="Bidcoz\Bundle\CoreBundle\Entity\Donation\DonationLevel", options={"id" = "donation_level_id"})
  72.      */
  73.     public function viewDonationLevelAction(Request $requestOrganization $organizationCampaign $campaignDonationLevel $donationLevel)
  74.     {
  75.         if (!$user $this->getUser()) {
  76.             $this->addFlash('info''Please login or create an account before making a donation.');
  77.             throw $this->createAccessDeniedException('Unable to access this page!');
  78.         }
  79.         $stripeEnabled $organization->isStripeAllowed() && $organization->hasPaymentGatewayAccountType(Account::STRIPE);
  80.         $proxy $this->createCashDonationProxy($donationLevel$campaign);
  81.         $proxy->setDonorName($this->getUser()->getName());
  82.         $form $this->getCashDonationLevelForm($proxy$stripeEnabled);
  83.         return $this->render('@BidcozFrontend/Campaign/Donate/donate.html.twig', [
  84.             'organization'  => $organization,
  85.             'campaign'      => $campaign,
  86.             'donationLevel' => $donationLevel,
  87.             'form'          => $form->createView(),
  88.             'stripeEnabled' => $stripeEnabled,
  89.         ]);
  90.     }
  91.     /**
  92.      * @Route("/money/level/{donation_level_id}", name="campaign_donate_cash_level_save", methods={"POST"})
  93.      * @ParamConverter("donationLevel", class="Bidcoz\Bundle\CoreBundle\Entity\Donation\DonationLevel", options={"id" = "donation_level_id"})
  94.      */
  95.     public function makeDonationAction(Request $requestOrganization $organizationCampaign $campaignDonationLevel $donationLevel)
  96.     {
  97.         if (!$user $this->getUser()) {
  98.             $this->addFlash('info''Please login or create an account before purchasing a ticket.');
  99.             throw $this->createAccessDeniedException('Unable to access this page!');
  100.         }
  101.         $stripeEnabled $organization->isStripeAllowed() && $organization->hasPaymentGatewayAccountType(Account::STRIPE);
  102.         $proxy $this->createCashDonationProxy($donationLevel$campaign);
  103.         $form $this->getCashDonationLevelForm($proxy$stripeEnabled);
  104.         $form->handleRequest($request);
  105.         if (!$organization->isStripeAddressCheck()) {
  106.             $address     $user->getAddress();
  107.             $addressForm $this->getAddressForm($address);
  108.             $addressForm->handleRequest($request);
  109.             if ($addressForm->isSubmitted() && $addressForm->isValid()) {
  110.                 $user->setAddress($address);
  111.             }
  112.         }
  113.         try {
  114.             if ($form->isSubmitted() && $form->isValid()) {
  115.                 $user   $this->getUser();
  116.                 $level  $proxy->getDonationLevel();
  117.                 $amount $level->getAmount() + $proxy->getAdditionalAmount();
  118.                 if ($proxy->getStripeToken() && $proxy->getInterval()) {
  119.                     $intervalAmount round($amount $proxy->getIntervalsCnt(), 2);
  120.                     $realAmount     $intervalAmount $proxy->getIntervalsCnt();      // real amount after round
  121.                     $proxy->setAdditionalAmount($realAmount $level->getAmount()); // update AdditionalAmount according to realAmount
  122.                     $subscriptionId $this->getStripeManager()->createSubscriptionAndSubscribeUser(
  123.                         $campaign,
  124.                         $user,
  125.                         $proxy->getInterval(),
  126.                         $proxy->getStripeToken(),
  127.                         $intervalAmount
  128.                     );
  129.                 } else {
  130.                     $subscriptionId null;
  131.                 }
  132.                 /** @var CashDonation $donation */
  133.                 $donation $this->getDonationManager()->createCashDonation($campaign$user$proxy$subscriptionId);
  134.                 //stripe payment for one-time donation
  135.                 if (!$subscriptionId && $proxy->getStripeToken()) {
  136.                     $transaction $this->getStripeManager()->createStripeTransactionForPurchases(
  137.                             $campaign,
  138.                             $user,
  139.                             $donation->getPurchases()->toArray(),
  140.                             $proxy->getStripeToken()
  141.                         );
  142.                 }
  143.                 $this->getEntityManager()->flush();
  144.                 $this->addFlash('success''Donation successful');
  145.                 // If not recurring payments, send to cart with Appeal item
  146.                 if (!$subscriptionId) {
  147.                     $redirect_path 'account_campaign_purchases';
  148.                 } else {
  149.                     $redirect_path 'account_campaign_purchase_stripe_success';
  150.                 }
  151.                 // Send to cart instead of campaign homepage.
  152.                 // return $this->redirectToRoute('campaign_home', [
  153.                 return $this->redirectToRoute($redirect_path, [
  154.                     'orgSlug'      => $organization->getSlug(),
  155.                     'campaignSlug' => $campaign->getSlug(),
  156.                 ]);
  157.             }
  158.         } catch (\Stripe\Error\Base $e) {
  159.             $this->addFlash('danger'$e->getMessage());
  160.             $this->getEntityManager()->clear();
  161.         }
  162.         return $this->render('@BidcozFrontend/Campaign/Donate/donate.html.twig', [
  163.             'organization'  => $organization,
  164.             'campaign'      => $campaign,
  165.             'donationLevel' => $donationLevel,
  166.             'form'          => $form->createView(),
  167.             'stripeEnabled' => $stripeEnabled,
  168.         ]);
  169.     }
  170.     /**
  171.      * @Route("/crypto", name="campaign_donate_crypto")
  172.      * @IsGranted("DONATION_CRYPTO", subject="organization")
  173.      */
  174.     public function donateCryptoAction(Request $requestOrganization $organizationCampaign $campaign)
  175.     {
  176.         $cryptoWallets $campaign->getCryptoWallets();
  177.         return $this->render('@BidcozFrontend/Campaign/Donate/donate_crypto.html.twig', [
  178.             'organization'   => $organization,
  179.             'campaign'       => $campaign,
  180.             'crypto_wallets' => $cryptoWallets,
  181.         ]);
  182.     }
  183.     /**
  184.      * @Route("/levels", name="campaign_donate_levels")
  185.      */
  186.     public function donationLevelsAction(Request $requestOrganization $organizationCampaign $campaign)
  187.     {
  188.         $donationLevels $this->getRepository('Donation\DonationLevel')->findCampaignDonationLevels($campaign);
  189.         return $this->render('@BidcozFrontend/Campaign/Donate/levels.html.twig', [
  190.             'organization'   => $organization,
  191.             'campaign'       => $campaign,
  192.             'donationLevels' => $donationLevels,
  193.         ]);
  194.     }
  195.     /**
  196.      * @Route("/item", name="campaign_donate_item")
  197.      */
  198.     public function donateItemAction(Request $requestOrganization $organizationCampaign $campaignAuction $auction)
  199.     {
  200.         $itemProxy = new ItemDonationProxy($campaign);
  201.         $form      $this->getItemDonationForm($itemProxy);
  202.         if ('POST' === $request->getMethod()) {
  203.             if (!$user $this->getUser()) {
  204.                 $this->addFlash('info''Please login or create an account before making a donation.');
  205.                 throw $this->createAccessDeniedException('Unable to access this page!');
  206.             }
  207.             $form->handleRequest($request);
  208.             if ($form->isSubmitted() && $form->isValid()) {
  209.                 $this->getDonationManager()->createItemDonation($itemProxy);
  210.                 $this->addFlash('success''Thank you. Your Donation has been received.');
  211.                 return $this->redirectToRoute('campaign_donate_item', [
  212.                     'orgSlug'      => $organization->getSlug(),
  213.                     'campaignSlug' => $campaign->getSlug(),
  214.                 ]);
  215.             }
  216.         }
  217.         return $this->render('@BidcozFrontend/Campaign/Donate/donate_item.html.twig', [
  218.             'organization' => $organization,
  219.             'campaign'     => $campaign,
  220.             'form'         => $form->createView(),
  221.         ]);
  222.     }
  223.     protected function createItem(Auction $auctionUser $user)
  224.     {
  225.         $item $this->getItemManager()->createItem($auction);
  226.         $item->setActive(false);
  227.         $item->setDonor($user);
  228.         return $item;
  229.     }
  230.     protected function getCashDonationForm()
  231.     {
  232.         return $this->createForm(CashType::class);
  233.     }
  234.     protected function getCashDonationLevelForm(CashDonationProxy $cashDonationProxy$withInterval)
  235.     {
  236.         return $this->createForm(CashDonationLevelType::class, $cashDonationProxy, [
  237.             'withInterval' => $withInterval,
  238.             'showMessage'  => $cashDonationProxy->getDonationLevel()->getShowMessage(),
  239.         ]);
  240.     }
  241.     protected function getItemDonationForm(ItemDonationProxy $item)
  242.     {
  243.         return $this->createForm(ItemType::class, $item);
  244.     }
  245.     protected function createCashDonationProxy(DonationLevel $donationLevelCampaign $campaign)
  246.     {
  247.         $user      $this->getUser();
  248.         $questions $this->getRepository('Donation\DonationQuestion')->findCampaignDonationQuestions($campaigntrue);
  249.         $answers array_map(function ($q) use ($user) {
  250.             $question $q->getQuestion();
  251.             return $this->getQuestionManager()->createDonationAnswer($question$user);
  252.         }, $questions);
  253.         $proxy = new CashDonationProxy($donationLevel$user);
  254.         $proxy->setAnswers($answers);
  255.         return $proxy;
  256.     }
  257.     protected function getAddressForm(Address $address)
  258.     {
  259.         return $this->createForm(AddressType::class, $address);
  260.     }
  261. }