PageRenderTime 26ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/src/AppBundle/Controller/SubscribeController.php

https://gitlab.com/tiagokalinkeiori/congresso
PHP | 273 lines | 229 code | 33 blank | 11 comment | 30 complexity | 15c77b35b643e6bda74227c64d04fd61 MD5 | raw file
  1. <?php
  2. namespace AppBundle\Controller;
  3. use AppBundle\Form\RegistrationForm;
  4. use AppBundle\Model\CountryQuery;
  5. use AppBundle\Model\DistrictQuery;
  6. use AppBundle\Model\LanguageQuery;
  7. use AppBundle\Model\Subscribe;
  8. use AppBundle\Model\SubscribePayment;
  9. use AppBundle\Model\SubscribeQuery;
  10. use AppBundle\Model\SubscribeTypePriceQuery;
  11. use AppBundle\Model\User;
  12. use AppBundle\Util\ConfigurationUtil;
  13. use Propel;
  14. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  16. use Symfony\Component\Form\FormError;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  19. /**
  20. * @Route("/")
  21. */
  22. class SubscribeController extends BaseController
  23. {
  24. /**
  25. * @Route("/inscritos", name="subscribers")
  26. * @Template()
  27. */
  28. public function subscribersAction(Request $request)
  29. {
  30. $districtId = $request->query->get('distrito');
  31. $page = $request->query->get('pagina', 1);
  32. $search = $request->query->get('busca');
  33. $limit = 20;
  34. $districts = DistrictQuery::create()
  35. ->leftJoinSubscribe('s')
  36. ->addJoinCondition('s', '(s.Canceled = 0 OR s.Canceled IS NULL)')
  37. ->withColumn('count(distinct s.Id)', 'Total')
  38. ->select(array(
  39. 'Id',
  40. 'Name',
  41. 'Total',
  42. ))
  43. ->orderById()
  44. ->groupById()
  45. ->filterById(null, \Criteria::ISNOTNULL)
  46. ->find()
  47. ->toArray();
  48. $countries = CountryQuery::create()
  49. ->leftJoinSubscribe('s')
  50. ->addJoinCondition('s', '(s.Canceled = 0 OR s.Canceled IS NULL)')
  51. ->withColumn('count(distinct s.Id)', 'Total')
  52. ->select(array(
  53. 'Id',
  54. 'Name',
  55. 'Code',
  56. 'Total',
  57. ))
  58. ->orderBy('Total', \Criteria::DESC)
  59. ->groupById()
  60. ->having('Total > 0')
  61. ->find()
  62. ->toArray();
  63. $subscribers = SubscribeQuery::create('ss')
  64. ->useStateQuery('s', \Criteria::LEFT_JOIN)->endUse()
  65. ->useDistrictQuery('d', \Criteria::LEFT_JOIN)->endUse()
  66. ->withColumn('s.Name', 'State')
  67. ->withColumn('d.Name', 'District')
  68. ->select(array(
  69. 'Id',
  70. 'Name',
  71. 'State',
  72. 'City',
  73. 'District',
  74. ))
  75. ->_if(!empty($districtId))
  76. ->filterByDistrictId($districtId)
  77. ->_endif()
  78. ->filterByCanceled(false)
  79. ->_or()
  80. ->filterByCanceled(null)
  81. ->_if(!empty($search))
  82. ->where('(s.Name LIKE "%'.$search.'%" OR d.Name LIKE "%'.$search.'%" OR ss.Name LIKE "%'.$search.'%")')
  83. ->_endif()
  84. ->orderByDate()
  85. ->paginate($page, $limit);
  86. return $this->prepareView(array(
  87. 'districts' => $districts,
  88. 'countries' => $countries,
  89. 'districtId' => $districtId,
  90. 'subscribers' => $subscribers,
  91. 'search' => $search,
  92. ));
  93. }
  94. /**
  95. * @Route("/inscricao", name="registration")
  96. * @Template()
  97. */
  98. public function registrationAction(Request $request)
  99. {
  100. $configuration = ConfigurationUtil::all();
  101. if ($request->query->has('preview')
  102. || (empty($configuration['registration.date.start'])
  103. || (!empty($configuration['registration.date.start'])
  104. && date("Y-m-d") >= $configuration['registration.date.start']))
  105. && (empty($configuration['registration.date.end'])
  106. || (!empty($configuration['registration.date.end'])
  107. && date("Y-m-d") <= $configuration['registration.date.end']))) {
  108. $form = $this->createForm(new RegistrationForm($this->container, $this->getLocale($request)), array('Genre' => 'M'), array(
  109. 'csrf_protection' => true,
  110. ));
  111. if ($request->isMethod('post')) {
  112. $form->submit($request);
  113. if ($form->isValid()) {
  114. $data = $form->getData();
  115. $exists = SubscribeQuery::create()
  116. ->filterByEmail($data['Email'])
  117. ->count();
  118. if (!$exists) {
  119. $conn = Propel::getConnection();
  120. try {
  121. $conn->beginTransaction();
  122. $now = new \DateTime();
  123. $age = $now->diff($data['Birthday'])->y;
  124. $price = 0;
  125. if ($age > (int) $configuration['subscribe.min.payment.age']) {
  126. $subscribeTypePrice = SubscribeTypePriceQuery::create()
  127. ->filterBySubscribeTypeId($data['SubscribeTypeId'])
  128. ->filterByStart(time(), \Criteria::LESS_EQUAL)
  129. ->filterByEnd(time(), \Criteria::GREATER_EQUAL)
  130. ->findOne();
  131. if ($data['Quota'] > 1 && $subscribeTypePrice->getInstallmentValue()) {
  132. $price = $subscribeTypePrice->getInstallmentValue();
  133. } else {
  134. $price = $subscribeTypePrice->getPrice();
  135. }
  136. }
  137. $language = LanguageQuery::create()
  138. ->findOneByCode($this->getLocale($request));
  139. $subscribe = new Subscribe();
  140. $subscribe->setCountry($data['Country'])
  141. ->setDistrict($data['District'])
  142. ->setSubscribeTypeId($data['SubscribeTypeId'])
  143. ->setDisplacementId($data['DisplacementId'])
  144. ->setEmail($data['Email'])
  145. ->setName($data['Name'])
  146. ->setBirthday($data['Birthday'])
  147. ->setStateId($data['State'])
  148. ->setRegister($data['Register'])
  149. ->setDocument(preg_replace("/[^0-9]/", "", $data['Document']))
  150. ->setGenre($data['Genre'])
  151. ->setPhone($data['Phone'])
  152. ->setAddress($data['Address'])
  153. ->setNumber($data['Number'])
  154. ->setComplement($data['Complement'])
  155. ->setCity($data['City'])
  156. ->setRegion($data['Region'])
  157. ->setZipCode($data['ZipCode'])
  158. ->setMember($data['Member'])
  159. ->setConfirmed($data['Confirmed'])
  160. ->setMinister($data['Minister'])
  161. ->setUnityName($data['UnityName'])
  162. ->setSpecialNeed($data['SpecialNeed'])
  163. ->setComment($data['Comment'])
  164. ->setQuota($data['Quota'])
  165. ->setPrice($price)
  166. ->setVisitor((int) $data['Visitante'])
  167. ->setDate(time())
  168. ->setLanguage($language);
  169. if (isset($data['TrainResponsible'])) {
  170. $subscribe->setTrainResponsible($data['TrainResponsible']);
  171. }
  172. $user = new User();
  173. $user->setGroupId(2)
  174. ->setName($data['Name'])
  175. ->setEmail($data['Email'])
  176. ->setSalt(md5(uniqid(null, true)));
  177. $factory = $this->get('security.encoder_factory');
  178. $encoder = $factory->getEncoder($user);
  179. $password = $encoder->encodePassword($data['Password'], $user->getSalt());
  180. $user->setPassword($password);
  181. $subscribe->setUser($user);
  182. $dueDate = date("Y-m-10");
  183. if ((int) date("d") >= 10) {
  184. if ($data['Quota'] == 9
  185. || $data['Quota'] == 8
  186. || $data['Quota'] == 7) {
  187. $dueDate = date("Y-m-d", strtotime("+5 days"));
  188. } else {
  189. $dueDate = date("Y-m-10", strtotime("+1 month"));
  190. }
  191. }
  192. $quotaPrice = $price / $data['Quota'];
  193. $quota = new SubscribePayment();
  194. $quota->setCreateDate(time())
  195. ->setPrice($quotaPrice)
  196. ->setFirst(1)
  197. ->setDueDate($dueDate);
  198. if ($price == 0) {
  199. $quota->setPaid(0)
  200. ->setPaymentDate(time());
  201. $subscribe->setFree(1);
  202. }
  203. $subscribe->addSubscribePayment($quota);
  204. $subscribe->save();
  205. $token = new UsernamePasswordToken($user, null, 'secured_area', $user->getRoles());
  206. $security = $this->container->get('security.context');
  207. $security->setToken($token);
  208. try {
  209. $emailBody = $this->renderView("AppBundle:Includes:registration.html.twig", array(
  210. 'locale' => $this->getLocale($request),
  211. ));
  212. if ($this->getLocale($request) == 'es') {
  213. $subject = "¡Su reserva esta Confirmada!";
  214. } else {
  215. $subject = "Sua reserva está Confirmada!";
  216. }
  217. $message = \Swift_Message::newInstance($subject)
  218. ->setFrom($configuration['mail.sender'], 'Latino Americano 2017')
  219. ->setTo($subscribe->getEmail(), $subscribe->getName())
  220. ->setBody($emailBody, 'text/html', 'utf-8');
  221. $this->getMailer()->send($message);
  222. } catch(\Exception $em) {}
  223. $conn->commit();
  224. return $this->redirect($this->generateUrl('subscribe_area'));
  225. } catch (Exception $ex) {
  226. $conn->rollBack();
  227. }
  228. } else {
  229. $form->get('Email')->addError(new FormError('form.exists.email'));
  230. }
  231. }
  232. }
  233. return $this->prepareView(array(
  234. 'form' => $form->createView(),
  235. ));
  236. } else {
  237. return $this->prepareView();
  238. }
  239. }
  240. }