/** * Возвращает необходимые данные для формы оплаты * * @param Payment $payment * @param Event $event * @return array */ public function getData(Payment $payment, Event $event) { $config = $this->container->getParameter('stfalcon_event.config'); $description = 'Оплата участия в конференции ' . $event->getName() . '. Плательщик ' . $payment->getUser()->getFullname() . ' (#' . $payment->getUser()->getId() . ')'; $params['ik_co_id'] = $config['interkassa']['shop_id']; $params['ik_am'] = $payment->getAmount(); $params['ik_pm_no'] = $payment->getId(); $params['ik_desc'] = $description; $params['ik_loc'] = 'ru'; return ['ik_co_id' => $config['interkassa']['shop_id'], 'ik_desc' => $description, 'ik_sign' => $this->getSignHash($params)]; }
/** * @param Event $event Event * @param User $user User * @param Payment $payment Payment * @param FormView $promoCodeFormView Promo code form view * @param PromoCode $promoCode Promo code * @param FormView $ticketFormView Ticket form view * @param int $discountAmount Discount amount * * @return array * * @Template() * @Secure(roles="ROLE_USER") */ public function payAction($event, $user, $payment, $promoCodeFormView, $promoCode, $ticketFormView, $discountAmount) { $config = $this->container->getParameter('stfalcon_payment.config'); $description = 'Оплата участия в конференции ' . $event->getName() . '. Плательщик ' . $user->getFullname() . ' (#' . $user->getId() . ')'; /** @var InterkassaService $interkassa */ $interkassa = $this->container->get('stfalcon_event.interkassa.service'); $params['ik_co_id'] = $config['interkassa']['shop_id']; $params['ik_am'] = $payment->getAmount(); $params['ik_pm_no'] = $payment->getId(); $params['ik_desc'] = $description; $params['ik_loc'] = 'ru'; $data = array('ik_co_id' => $config['interkassa']['shop_id'], 'ik_desc' => $description, 'ik_sign' => $interkassa->getSignHash($params)); return array('data' => $data, 'event' => $event, 'payment' => $payment, 'promoCodeForm' => $promoCodeFormView, 'promoCode' => $promoCode, 'ticketForm' => $ticketFormView, 'discountAmount' => $discountAmount); }
/** * 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()); }