src/Bidcoz/Bundle/FrontendBundle/Controller/RegistrationController.php line 33

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\Campaign;
  5. use Bidcoz\Bundle\CoreBundle\Entity\Organization;
  6. use Bidcoz\Bundle\CoreBundle\Entity\Proxy\RegistrationPurchaseProxy;
  7. use Bidcoz\Bundle\CoreBundle\Entity\Registration\RegistrationType;
  8. use Bidcoz\Bundle\CoreBundle\Entity\User;
  9. use Bidcoz\Bundle\FrontendBundle\Form\Type\RegistrationPurchaseType;
  10. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  11. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. # TODO: New authenticator behaves differently for @Security and @IsGranted
  15. # Issue: "Symfony\Component\Security\Core\Exception\AccessDeniedException: No user token or you forgot to put your controller behind a firewall while using a @Security tag
  16. # PR fixes this (still "Open"): https://github.com/sensiolabs/SensioFrameworkExtraBundle/pull/763
  17. # Docs: https://symfony.com/doc/5.2/security/experimental_authenticators.html#enabling-the-system
  18. # Notes: When PR gets merged, switch back to using the @Security tag: @Security("is_granted('VIEW', organization) and is_granted('FRONT_END', campaign)")
  19. /**
  20.  * @Route("/{orgSlug}/{campaignSlug}/registrations")
  21.  * @IsGranted("VIEW", subject="organization")
  22.  * @IsGranted("FRONT_END", subject="campaign")
  23.  */
  24. class RegistrationController extends CoreController
  25. {
  26.     /**
  27.      * @Route("", name="campaign_registrations")
  28.      */
  29.     public function registrationsAction(Organization $organizationCampaign $campaign)
  30.     {
  31.         $registrationTypes $this->getRepository('Registration\RegistrationType')->findCampaignRegistrationTypes($campaign);
  32.         return $this->render('@BidcozFrontend/Campaign/Registrations/index.html.twig', [
  33.             'organization'      => $organization,
  34.             'campaign'          => $campaign,
  35.             'registrationTypes' => $registrationTypes,
  36.         ]);
  37.     }
  38.     /**
  39.      * @Route("/registrations/{registrationId}", name="campaign_registration_view", methods={"GET"})
  40.      * @ParamConverter("registrationType", class="Bidcoz\Bundle\CoreBundle\Entity\Registration\RegistrationType", options={"id" = "registrationId"})
  41.      */
  42.     public function buyRegistrationAction(Organization $organizationCampaign $campaignRegistrationType $registrationType)
  43.     {
  44.         $user $this->getUser();
  45.         if (!$user) {
  46.             $this->messageAccessDeniedException('You must login or create an account to purchase registrations');
  47.         }
  48.         $proxy       $this->createRegistrationProxy($registrationType$campaign);
  49.         $formOptions $this->getPurchaseRegistrationFormOptions($campaign$registrationType$user);
  50.         $form        $this->getPurchaseRegistrationForm($proxy$formOptions);
  51.         return $this->render('@BidcozFrontend/Campaign/Registrations/buy.html.twig'array_merge($formOptions, [
  52.             'organization'     => $organization,
  53.             'campaign'         => $campaign,
  54.             'registrationType' => $registrationType,
  55.             'form'             => $form->createView(),
  56.         ]));
  57.     }
  58.     /**
  59.      * @Route("/registrations/{registrationId}", name="campaign_registration_purchase", methods={"POST"})
  60.      * @ParamConverter("registrationType", class="Bidcoz\Bundle\CoreBundle\Entity\Registration\RegistrationType", options={"id" = "registrationId"})
  61.      */
  62.     public function purchaseRegistrationAction(Request $requestOrganization $organizationCampaign $campaignRegistrationType $registrationType)
  63.     {
  64.         if (!$user $this->getUser()) {
  65.             $this->addFlash('info''Please login or create an account before purchasing a registration.');
  66.             throw $this->createAccessDeniedException('Unable to access this page!');
  67.         }
  68.         $proxy $this->createRegistrationProxy($registrationType$campaign);
  69.         $formOptions $this->getPurchaseRegistrationFormOptions($campaign$registrationType$user);
  70.         $form        $this->getPurchaseRegistrationForm($proxy$formOptions);
  71.         $form->handleRequest($request);
  72.         if ($form->isSubmitted() && $form->isValid()) {
  73.             $user $this->getUser();
  74.             $this->getRegistrationManager()->createRegistrationPurchase($campaign$user$proxy);
  75.             $this->getEntityManager()->flush();
  76.             $this->addFlash('success''Registration purchased');
  77.             if ('0.00' === $registrationType->getPrice()) {
  78.                 return $this->redirectToRoute('campaign_home', [
  79.                     'orgSlug'      => $organization->getSlug(),
  80.                     'campaignSlug' => $campaign->getSlug(),
  81.                 ]);
  82.             }
  83.             return $this->redirectToRoute('account_campaign_purchases', [
  84.                 'orgSlug'      => $organization->getSlug(),
  85.                 'campaignSlug' => $campaign->getSlug(),
  86.             ]);
  87.         }
  88.         return $this->render('@BidcozFrontend/Campaign/Registrations/buy.html.twig'array_merge($formOptions, [
  89.             'organization'     => $organization,
  90.             'campaign'         => $campaign,
  91.             'registrationType' => $registrationType,
  92.             'form'             => $form->createView(),
  93.         ]));
  94.     }
  95.     protected function createRegistrationProxy(RegistrationType $registrationTypeCampaign $campaign)
  96.     {
  97.         $user      $this->getUser();
  98.         $questions $this->getRepository('Registration\RegistrationQuestion')->findActiveByCampaign($campaign);
  99.         $registrationAnswers array_map(function ($registrationQuestion) use ($user) {
  100.             $question $registrationQuestion->getQuestion();
  101.             return $this->getQuestionManager()->createRegistrationAnswer($question$user);
  102.         }, $questions);
  103.         $proxy = new RegistrationPurchaseProxy($registrationType);
  104.         $proxy->setRegistrationAnswers($registrationAnswers);
  105.         return $proxy;
  106.     }
  107.     protected function getPurchaseRegistrationFormOptions(Campaign $campaignRegistrationType $registrationTypeUser $user)
  108.     {
  109.         $discounts             $this->getRepository('Discount\RegistrationTypeDiscount')->findActiveRegistrationTypeDiscounts($registrationType);
  110.         $hasActiveDiscountCode count($discounts) > 0;
  111.         return [
  112.             'require_name'       => $registrationType->getRequireName(),
  113.             'require_address'    => $registrationType->getRequireAddress(),
  114.             'require_email'      => $registrationType->getRequireEmail(),
  115.             'require_phone'      => $registrationType->getRequirePhone(),
  116.             'require_waiver'     => $campaign->getRequireRegistrationWaiver(),
  117.             'waiver_text'        => $campaign->getRegistrationWaiver(),
  118.             'user'               => $user,
  119.             'show_discount_code' => $hasActiveDiscountCode,
  120. //             'cascade_validation' => true,
  121.         ];
  122.     }
  123.     protected function getPurchaseRegistrationForm(RegistrationPurchaseProxy $proxy, array $options)
  124.     {
  125.         return $this->createForm(RegistrationPurchaseType::class, $proxy$options);
  126.     }
  127. }