/**
  * 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);
 }
Exemple #5
0
 /**
  * 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();
 }
Exemple #6
0
 /**
  * Пересчитываем итоговую сумму платежа по всем билетам
  * с учетом скидки
  *
  * @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();
 }
Exemple #7
0
 /**
  * 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 [];
 }
Exemple #9
0
 /**
  * @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();
 }
Exemple #10
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());
 }
Exemple #11
0
 /**
  *  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()));
 }
Exemple #12
0
 /**
  * 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;
 }