Example #1
0
 /**
  * Event pay
  *
  * @param Event $event
  * @throws \Exception
  *
  * @Secure(roles="ROLE_USER")
  * @Route("/event/{event_slug}/pay", name="event_pay")
  * @ParamConverter("event", options={"mapping": {"event_slug": "slug"}})
  * @Template()
  *
  * @return array
  */
 public function payAction(Event $event)
 {
     if (!$event->getReceivePayments()) {
         throw new \Exception("Оплата за участие в {$event->getName()} не принимается.");
     }
     $em = $this->getDoctrine()->getManager();
     /* @var  User $user */
     $user = $this->container->get('security.token_storage')->getToken()->getUser();
     /* @var $ticket Ticket */
     $ticket = $this->container->get('stfalcon_event.ticket.service')->findTicketForEventByCurrentUser($event);
     if (!($payment = $ticket->getPayment())) {
         $payment = new Payment();
         $payment->setUser($user);
         $em->persist($payment);
         $payment->addTicket($ticket);
         $em->persist($ticket);
     }
     if (!$payment->isPaid()) {
         $this->get('stfalcon_event.payment_manager')->checkTicketsPricesInPayment($payment, $event);
         // покупка за реферальные средства
         if ($user->getBalance() > 0) {
             if ($payment->getAmount() < $user->getBalance()) {
                 //Билет бесплатно
                 $referralService = $this->get('stfalcon_event.referral.service');
                 $payment->setAmount(0);
                 $payment->setFwdaysAmount($payment->getBaseAmount());
                 $payment->markedAsPaid();
                 // списываем реферельные средства
                 $referralService->utilizeBalance($payment);
                 $em->persist($payment);
                 $em->flush();
                 return $this->redirect($this->generateUrl('payment_success'));
             } else {
                 $amount = $payment->getAmount() - $user->getBalance();
                 $payment->setAmount($amount);
                 $payment->setFwdaysAmount($user->getBalance());
             }
             $em->persist($payment);
         }
     }
     $em->flush();
     /**
      * Обработка формы промо кода
      */
     $promoCodeForm = $this->createForm('stfalcon_event_promo_code');
     $promoCode = $payment->getPromoCodeFromTickets();
     $request = $this->getRequest();
     // процент скидки для постоянных участников
     $paymentsConfig = $this->container->getParameter('stfalcon_event.config');
     $discountAmount = 100 * (double) $paymentsConfig['discount'];
     if ($request->isMethod('post')) {
         $promoCodeForm->bind($request);
         $code = $promoCodeForm->get('code')->getData();
         $promoCode = $em->getRepository('StfalconEventBundle:PromoCode')->findActivePromoCodeByCodeAndEvent($code, $event);
         if ($promoCode) {
             $notUsedPromoCode = $payment->addPromoCodeForTickets($promoCode, $discountAmount);
             $em->flush();
             if (!empty($notUsedPromoCode)) {
                 $this->get('session')->getFlashBag()->add('not_used_promocode', implode(', ', $notUsedPromoCode));
             }
         } else {
             $promoCodeForm->get('code')->addError(new FormError('Такой промокод не найден'));
         }
     }
     $this->get('session')->set('active_payment_id', $payment->getId());
     return array('data' => $this->get('stfalcon_event.interkassa.service')->getData($payment, $event), 'event' => $event, 'payment' => $payment, 'promoCodeForm' => $promoCodeForm->createView(), 'promoCode' => $promoCode, 'ticketForm' => $this->createForm('stfalcon_event_ticket')->createView(), 'discountAmount' => $discountAmount, 'balance' => $user->getBalance());
 }