/** * List of speakers for event * * @param Event $event Event * @param int $count Count * * @return array * * @Template() */ public function widgetAction(Event $event, $count) { $speakers = $event->getSpeakers()->getValues(); if ($count > 1) { shuffle($speakers); $speakers = array_slice($speakers, 0, $count); } return array('event' => $event, 'speakers' => $speakers); }
/** * List of participants for event * * @param Event $event Event * @param int $count Count * * @return array * * @Template() */ public function widgetAction(Event $event, $count) { $participants = $event->getTickets()->getValues(); // @todo якось не так... if ($count > 1) { shuffle($participants); $participants = array_slice($participants, 0, $count); } return array('event' => $event, 'participants' => $participants); }
/** * Возвращает необходимые данные для формы оплаты * * @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); }
/** * Get all sponsors of event * * @param Event $event * * @return array List of sponsors */ public function getSponsorsOfEvent(Event $event) { return $this->getEntityManager()->createQuery(' SELECT s as sponsor, c.name as category_name FROM StfalconSponsorBundle:Sponsor s JOIN s.sponsorEvents se JOIN se.event e JOIN se.category c WHERE e.id = :eventId ORDER BY c.sortOrder DESC ')->setParameter('eventId', $event->getId())->getResult(); }
/** * Пересчитываем итоговую сумму платежа по всем билетам * с учетом скидки * * @param Payment $payment * @param Event $event */ public function checkTicketsPricesInPayment($payment, $event) { // Вытягиваем скидку из конфига $paymentsConfig = $this->container->getParameter('stfalcon_event.config'); $discount = (double) $paymentsConfig['discount']; $eventCost = $event->getCost(); /** @var Ticket $ticket */ foreach ($payment->getTickets() as $ticket) { // получаем оплаченые платежи пользователя $paidPayments = $this->repository->findPaidPaymentsForUser($ticket->getUser()); //правильно ли установлен флаг наличия скидки // @todo с расчетом скидки у нас явно проблемы. ниже почти такой же код идет. плюс ещё в нескольких // местах по коду делаем подобные расчеты. плюс в самой модели билета есть логика расчета цены со скидкой... $isCorrectDiscount = $ticket->getHasDiscount() == (count($paidPayments) > 0 && $event->getUseDiscounts() || $ticket->hasPromoCode()); // если цена билета без скидки не ровна новой цене на ивент // или неверно указан флаг наличия скидки if ($ticket->getAmountWithoutDiscount() != $eventCost || !$isCorrectDiscount) { // если не правильно установлен флаг наличия скидки, тогда устанавливаем его заново if (!$isCorrectDiscount) { // @todo для реализации возможности отключения скидки постоянных участников мне пришлось // использовать метод $event->getUseDiscounts() в трех разных местах. а нужно, чтобы // это можно было сделать в одном месте $ticket->setHasDiscount(count($paidPayments) > 0 && $event->getUseDiscounts() || $ticket->hasPromoCode()); } $ticket->setAmountWithoutDiscount($eventCost); if ($ticket->getHasDiscount()) { $ticket->setAmountWithDiscount($discount); } else { $ticket->setAmount($eventCost); } $this->entityManager->merge($ticket); } } $payment->recalculateAmount(); //set base price $payment->setBaseAmount($payment->getAmount()); $this->entityManager->merge($payment); $this->flush(); }
/** * Event page submenu * * @param Request $request Request * @param Event $event Event * * @return \Knp\Menu\MenuItem */ public function createEventSubMenu(Request $request, Event $event) { $menu = $this->factory->createItem('root'); $menu->setUri($request->getRequestUri()); $menu->addChild("О событии", array('route' => 'event_show', 'routeParameters' => array('event_slug' => $event->getSlug()))); if ($event->getSpeakers()) { $menu->addChild("Докладчики", array('route' => 'event_speakers', 'routeParameters' => array('event_slug' => $event->getSlug()))); } if ($event->getTickets()) { $menu->addChild("Участники", array('route' => 'event_participants', 'routeParameters' => array('event_slug' => $event->getSlug()))); } // ссылки на страницы ивента foreach ($event->getPages() as $page) { if ($page->isShowInMenu()) { $menu->addChild($page->getTitle(), array('route' => 'event_page_show', 'routeParameters' => array('event_slug' => $event->getSlug(), 'page_slug' => $page->getSlug()))); } } return $menu; }
/** * @Route("/admin/event/{slug}/users/add", name="adminusersadd") * @Secure(roles="ROLE_ADMIN") * @Template() */ public function addUsersAction(Event $event) { // @todo удалить этот метод. одноразовый харкод $em = $this->getDoctrine()->getManager(); if (isset($_POST['users'])) { $users = explode("\r\n", $_POST['users']); foreach ($users as $data) { // данные с формы $dt = explode(' ', $data); unset($data); $data['name'] = $dt[0] . ' ' . $dt[1]; $data['email'] = $dt[2]; $data['discount'] = isset($dt[3]); $user = $this->get('fos_user.user_manager')->findUserBy(array('email' => $data['email'])); // создаем нового пользователя if (!$user) { $user = $this->get('fos_user.user_manager')->createUser(); $user->setEmail($data['email']); $user->setFullname($data['name']); // генерация временного пароля $password = substr(str_shuffle(md5(time())), 5, 8); $user->setPlainPassword($password); $user->setEnabled(true); $this->get('fos_user.user_manager')->updateUser($user); // отправляем сообщение о регистрации $text = "Приветствуем " . $user->getFullname() . "!\n\nВы были автоматически зарегистрированы на сайте Frameworks Days.\n\nВаш временный пароль: " . $password . "\nЕго можно сменить на странице " . $this->generateUrl('fos_user_change_password', array(), true) . "\n\n\n---\nС уважением,\nКоманда Frameworks Days"; $message = \Swift_Message::newInstance()->setSubject("Регистрация на сайте Frameworks Days")->setFrom('*****@*****.**', 'Frameworks Days')->setTo($user->getEmail())->setBody($text); // @todo каждый вызов отнимает память $this->get('mailer')->send($message); echo "#{$user->getId()} {$user->getFullname()} — Create a new user<br>"; } else { echo "<b>#{$user->getId()} {$user->getFullname()} — already registered</b><br>"; } // обновляем информацию о компании $user->setCountry('Украина'); if (isset($_POST['city'])) { $user->setCity($_POST['city']); } $user->setCompany($_POST['company']); $em->persist($user); $em->flush(); // проверяем или у него нет билетов на этот ивент /** @var Ticket $ticket */ $ticket = $em->getRepository('StfalconEventBundle:Ticket')->findOneBy(array('event' => $event->getId(), 'user' => $user->getId())); if (!$ticket) { $ticket = new Ticket(); $ticket->setEvent($event); $ticket->setUser($user); $em->persist($ticket); } if ($ticket->isPaid()) { echo "<b>he has already paid participation in the conference!</b><br>"; } else { // цена участия (с учетом скидки) $amount = $data['discount'] ? $_POST['amount'] * 0.8 : $_POST['amount']; $ticket->setAmount($amount); $ticket->setHasDiscount($data['discount']); $ticket->setAmountWithoutDiscount($_POST['amount']); $oldPayment = $ticket->getPayment(); if ($oldPayment) { $oldPayment->removeTicket($ticket); $em->persist($oldPayment); } echo "create a new payment<br>"; $payment = new Payment(); $payment->setUser($user); $payment->addTicket($ticket); $em->persist($payment); $em->flush(); // обновляем шлюз и статус платежа $payment->setGate('admin'); $payment->markedAsPaid(); $em->persist($payment); $em->persist($ticket); // сохраняем все изменения $em->flush(); echo "mark as paid<br>"; } } echo 'complete'; exit; } return []; }
/** * @param \Doctrine\Common\Persistence\ObjectManager $manager */ public function load(ObjectManager $manager) { $event = new Event(); $event->setName('Zend Framework Day'); $event->setSlug('zend-framework-day-2011'); $event->setDescription('Zend Framework Day посвящен популярному PHP фреймворку Zend Framework и является наследником конференции ZFConf Ukraine 2010.'); $event->setLogoFile($this->_generateUploadedFile('zend-framework-day.png')); $event->setEmailBackgroundFile($this->_generateUploadedFile('bg-blue.png')); $event->setPdfBackgroundFile($this->_generateUploadedFile('left-element.png')); $event->setCity('Киев'); $event->setPlace('отель "Казацкий"'); $event->setAbout('Описание события'); $event->setDate(new \DateTime('2012-04-19', new \DateTimeZone('Europe/Kiev'))); $event->setReceivePayments(true); $event->setCost(100); $manager->persist($event); $this->addReference('event-zfday', $event); $event = new Event(); $event->setName('PHP Frameworks Day'); $event->setSlug('php-frameworks-day-2012'); $event->setDescription('PHP frameworks day это конференция по современным PHP фреймворкам (Zend Framework 2, Symfony 2, Silex, Lithium и др.)'); $event->setLogoFile($this->_generateUploadedFile('php-frameworks-day-2012.png')); $event->setEmailBackgroundFile($this->_generateUploadedFile('bg-blue.png')); $event->setPdfBackgroundFile($this->_generateUploadedFile('left-element.png')); $event->setCity('Киев'); $event->setPlace('Пока неизвестно'); $event->setAbout('Описание события'); $event->setDate(new \DateTime('2012-11-18', new \DateTimeZone('Europe/Kiev'))); $event->setCost(100); $manager->persist($event); $this->addReference('event-phpday', $event); $event = new Event(); $event->setName('Not Active Frameworks Day'); $event->setSlug('not-active-frameworks-day'); $event->setDescription('Это событие тестовое, но должно быть неактивным'); $event->setLogoFile($this->_generateUploadedFile('smile-lol-icon.png')); $event->setEmailBackgroundFile($this->_generateUploadedFile('bg-blue.png')); $event->setPdfBackgroundFile($this->_generateUploadedFile('left-element.png')); $event->setCity('Где-то там'); $event->setPlace('Пока неизвестно'); $event->setAbout('Описание события'); $event->setActive(false); $event->setDate(new \DateTime('2012-12-12', new \DateTimeZone('Europe/Kiev'))); $event->setCost(100); $manager->persist($event); $this->addReference('event-not-active', $event); $event = new Event(); $event->setName('Javascript Frameworks Day'); $event->setSlug('javascript-frameworks-day-2012'); $event->setDescription('JavaScript Frameworks Day 2013 — международная конференция посвященная популярным JavaScript фреймворкам.'); $event->setLogoFile($this->_generateUploadedFile('jsfwday-logo-web.png')); $event->setEmailBackgroundFile($this->_generateUploadedFile('bg-blue.png')); $event->setPdfBackgroundFile($this->_generateUploadedFile('left-element.png')); $event->setCity('Киев'); $event->setPlace('отель "Казацкий"'); $event->setAbout('JavaScript Frameworks Day 2013 — международная конференция посвященная популярным JavaScript фреймворкам.'); $event->setDate(new \DateTime('2012-03-02', new \DateTimeZone('Europe/Kiev'))); $event->setCost(100); $manager->persist($event); $this->addReference('event-javascript-day', $event); $manager->flush(); }
/** * 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()); }
/** * Find ticket for event by user * * @param Event $event * @param User $user * * @return Ticket */ public function getTicketForEventByUser(Event $event, User $user) { return $this->findOneBy(array('event' => $event->getId(), 'user' => $user->getId())); }
/** * Find ticket for event by current user * * @param Event $event * * @return Ticket|null */ private function _findTicketForEventByCurrentUser(Event $event) { // @todo в сервіс $user = $this->container->get('security.context')->getToken()->getUser(); $ticket = null; if (is_object($user) && $user instanceof \FOS\UserBundle\Model\UserInterface) { // проверяем или у пользователя есть билеты на этот ивент $ticket = $this->getDoctrine()->getManager()->getRepository('StfalconEventBundle:Ticket')->findOneBy(array('event' => $event->getId(), 'user' => $user->getId())); } return $ticket; }