src/JuridicusBundle/Controller/RegistrationController.php line 49

Open in your IDE?
  1. <?php
  2. namespace JF\JuridicusBundle\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
  6. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  7. use JF\JuridicusBundle\Form\KundeType;
  8. use JF\JuridicusBundle\Form\PruefungsamtSelectType;
  9. use JF\JuridicusBundle\Entity\Kunde;
  10. use JF\JuridicusBundle\Entity\Email;
  11. use JF\JuridicusBundle\Entity\Gebuehr;
  12. use JF\JuridicusBundle\Entity\Pruefungsamt;
  13. use JF\JuridicusBundle\Entity\User;
  14. use JF\JuridicusBundle\Entity\MailTemplate;
  15. use JF\JuridicusBundle\Entity\Bundesland;
  16. use JF\JuridicusBundle\Services\PdfCreator;
  17. use Swift_Mailer;
  18. use Swift_Message;
  19. use Doctrine\ORM\EntityManagerInterface;
  20. use JF\JuridicusBundle\Services\Sms;
  21. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  22. use Psr\Log\LoggerInterface;
  23. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  24. /**
  25. * @Route("/registration")
  26. */
  27. class RegistrationController extends AbstractController
  28. {
  29. public function __construct(
  30. private PdfCreator $pdfCreator,
  31. private EntityManagerInterface $em,
  32. private UserPasswordHasherInterface $passwordHasher,
  33. private Swift_Mailer $mailer,
  34. private Sms $smsService,
  35. private LoggerInterface $logger ) {
  36. }
  37. /**
  38. * @Route("/schritt-1", name="registration")
  39. */
  40. public function registerSelectAction()
  41. {
  42. $form = $this->createForm(PruefungsamtSelectType::class, new Kunde());
  43. return $this->render('@JFJuridicusBundle/Registration/register_select.html.twig', array(
  44. 'form' => $form->createView()
  45. ));
  46. }
  47. /**
  48. *
  49. * @Route("/schritt-2", name="registration_check_pruefungsamt_selection")
  50. * @Method({"POST"})
  51. */
  52. public function registerAction(Request $request)
  53. {
  54. $form = $this->createForm(PruefungsamtSelectType::class, null); //changedFrom
  55. $form->handleRequest($request); //changedFrom bind
  56. if ($form->isSubmitted() && $form->isValid()) {
  57. $em = $this->getDoctrine()->getManager();
  58. /*
  59. $formData = $form->getData();
  60. $examen = $formData['examen'];
  61. $bundesland_id = $formData['bundesland'];
  62. $entity = new Kunde();
  63. $entity->setExamen($examen); */
  64. $entity = $form->getData();
  65. $examen = $entity->getExamen();
  66. $bundesland_id = $entity->getBundesland()->getId();
  67. $bundesland = $em->getRepository(Bundesland::class)->find($bundesland_id);
  68. $entity->setBundesland($bundesland);
  69. $pa = $em->getRepository(Pruefungsamt::class)->findByBundeslandAndExamen($bundesland_id, $examen);
  70. /* @var $pa Pruefungsamt */
  71. if (!$pa) {
  72. throw $this->createNotFoundException('Prüfungsamt wurde nicht gefunden.');
  73. }
  74. $form = $this->createForm(KundeType::class, $entity, array(
  75. 'pruefungsamt' => $pa,
  76. 'em' => $em,
  77. ));
  78. return $this->render('@JFJuridicusBundle/Registration/register.html.twig', array(
  79. 'pruefungsamt' => $pa,
  80. 'form' => $form->createView()
  81. ));
  82. }
  83. return $this->render('@JFJuridicusBundle/Registration/register_select.html.twig', array(
  84. 'form' => $form->createView()
  85. ));
  86. }
  87. /**
  88. * @Route("/create", name="registration_create")
  89. * @Method({"POST"})
  90. */
  91. public function createAction(Request $request)
  92. {
  93. // zuerst Bundesland und Examen verifizieren
  94. $params = $request->request->get('kunde');
  95. $examen = $params['examen'];
  96. $bundesland_id = $params['bundesland'];
  97. if (!$bundesland_id || !$examen) {
  98. return $this->redirect($this->generateUrl('registration'));
  99. }
  100. $em = $this->getDoctrine()->getManager();
  101. $pa = $em->getRepository(Pruefungsamt::class)->findByBundeslandAndExamen($bundesland_id, $examen);
  102. /* @var $pa \JF\JuridicusBundle\Entity\Pruefungsamt */
  103. if (!$pa) {
  104. throw $this->createNotFoundException('Prüfungsamt wurde nicht gefunden.');
  105. }
  106. $kunde = new Kunde();
  107. $kunde->setAnrufErlaubt(false);
  108. $kunde->setExportErlaubt(false);
  109. $kunde->setVerkaeufer(false);
  110. if (! $pa->hasVollbestand()) {
  111. // Strafzahlung eintragen
  112. $strafe = $pa->getCurrentGebuehrByTyp(Gebuehr::TYP_STRAFGEBUEHR);
  113. if ($strafe) {
  114. $kunde->setBetragStrafe($strafe->getBetrag());
  115. $kunde->setStrafeBezahlt(false);
  116. }
  117. // Facebook-Pflicht
  118. $kunde->setPflichtFacebookPost(true);
  119. }
  120. $form = $this->createForm(KundeType::class, $kunde, array(
  121. 'pruefungsamt' => $pa,
  122. 'em' => $em,
  123. ));
  124. $form->handleRequest($request);
  125. if ($form->isSubmitted() && $form->isValid()) {
  126. $kunde = $form->getData();
  127. $user = $em->getRepository(User::class)->findOneBy(['email' => $kunde->getEmail()]);
  128. // alten User ggfs. umbiegen
  129. if ($user) {
  130. $kunde_old = $user->getKunde();
  131. if ($kunde_old) {
  132. $kunde_old->setUser(null);
  133. $em->persist($kunde_old);
  134. $em->flush();
  135. } else {
  136. $user->addRole("ROLE_KUNDE");
  137. }
  138. } else {
  139. // entsprechenden User neu erstellen
  140. $user = new User();
  141. $user->addRole("ROLE_KUNDE");
  142. $user->setUsername($kunde->getEmail());
  143. $user->setEmail($kunde->getEmail());
  144. $user->setPlainPassword(substr(uniqid(md5(rand())), 8, 8));
  145. }
  146. $token = uniqid(md5(rand()));
  147. $user->setConfirmationToken($token);
  148. $user->setPassword(uniqid(md5(rand())));
  149. $user->setEnabled(false);
  150. $em->persist($user);
  151. $kunde->setUser($user);
  152. $kunde->setLoggedIn(false);
  153. $em->persist($kunde);
  154. $this->pdfCreator->createStempel($kunde);
  155. $em->flush();
  156. // finde neuestes Template
  157. $template = $em->getRepository(MailTemplate::class)->findCurrentByTyp(Email::REGISTRIERUNG);
  158. $link = $this->generateUrl('registration_activate', array('token' => $token), UrlGeneratorInterface::ABSOLUTE_URL); //chagngedFrom true
  159. $replacements = array(
  160. 'vorname' => $kunde->getVorname(),
  161. 'nachname' => $kunde->getNachname(),
  162. 'email' => $kunde->getEmail(),
  163. 'handynummer' => $kunde->getHandynummer(),
  164. 'link' => $link
  165. );
  166. $this->logger->info(sprintf('Link: %s ', $link));
  167. $mailerBcc = $this->getParameter('mailer_bcc');
  168. $mailUser = $this->getParameter('mailer_user');
  169. $message = (new Swift_Message($template->getBetreff()))
  170. ->setFrom(array($mailUser => 'Juridicus'))
  171. ->setReplyTo('info@juridicus.de')
  172. ->setTo($kunde->getEmail())
  173. ->setBody($template->replace($replacements), 'text/html')
  174. ;
  175. if (isset($mailerBcc)) {
  176. $message->setBcc(array($mailerBcc));
  177. }
  178. if ($this->mailer->send($message)) {
  179. // Versand speichern
  180. $email = new Email();
  181. $email
  182. ->setTyp(Email::REGISTRIERUNG)
  183. ->setKunde($kunde)
  184. ;
  185. $em->persist($email);
  186. $em->flush();
  187. $this->get('session')->set('registration_email_success', $kunde->getEmail());
  188. return $this->redirect($this->generateUrl('registration_email_success'));
  189. } else {
  190. //print_r("NICHT");
  191. $this->get('session')->set('registration_email_error', $kunde->getEmail());
  192. return $this->redirect($this->generateUrl('registration_email_error'));
  193. }
  194. }
  195. return $this->render('@JFJuridicusBundle/Registration/register.html.twig', array(
  196. 'pruefungsamt' => $pa,
  197. 'form' => $form->createView()
  198. ));
  199. }
  200. /**
  201. * Receive the confirmation token and send SMS with password
  202. *
  203. * @Route("/activate/{token}", name="registration_activate")
  204. */
  205. public function activateAction($token)
  206. {
  207. $em = $this->getDoctrine()->getManager();
  208. /* @var $sms_service \JF\JuridicusBundle\Services\Sms */
  209. $user = $this->em->getRepository(User::class)->findOneBy(['confirmationToken' => $token]);
  210. if (null === $user) {
  211. throw $this->createNotFoundException('Der Aktivierungscode ist ungültig oder wurde schon verwendet.');
  212. }
  213. $kunde = $user->getKunde();
  214. /* @var $kunde \JF\JuridicusBundle\Entity\Kunde */
  215. if (null === $kunde) {
  216. throw $this->createNotFoundException('Der Benutzer zu diesem Aktivierungscode ist nicht mehr vorhanden.');
  217. }
  218. $password_plain = substr(uniqid(md5(rand())), 8, 8);
  219. $hashedPassword = $this->passwordHasher->hashPassword(
  220. $user,
  221. $password_plain
  222. );
  223. $user->setEnabled(true);
  224. $user->setConfirmationToken(null);
  225. $user->setPlainPassword($password_plain);
  226. $user->setPassword($hashedPassword);
  227. $em->persist($user);
  228. $this->logger->info(sprintf('User: %s PW: %s', $user->getEmail(), $password_plain));
  229. // Senden des Passwords per SMS
  230. $template = $em->getRepository(MailTemplate::class)->findCurrentByTyp(Email::SMS);
  231. $replacements = array(
  232. 'vorname' => $kunde->getVorname(),
  233. 'nachname' => $kunde->getNachname(),
  234. 'email' => $kunde->getEmail(),
  235. 'handynummer' => $kunde->getHandynummer(),
  236. 'password' => $password_plain
  237. );
  238. if ($this->smsService->send(html_entity_decode(strip_tags($template->replace($replacements))), $kunde->getHandynummer())) {
  239. $kunde->setSmsSendAt(new \DateTime());
  240. $kunde->setSmsStatusId($this->smsService->getStatusId());
  241. $em->persist($kunde);
  242. $em->flush();
  243. $this->container->get('session')->set('registration_sms_success', $kunde->getEmail());
  244. return $this->redirect($this->generateUrl('registration_sms_success'));
  245. } else {
  246. $session = $this->container->get('session');
  247. $session->set('registration_sms_error', $kunde->getEmail());
  248. $session->set('registration_sms_code', $sms_service->getSendStatusCode());
  249. $session->set('registration_sms_message', $sms_service->getSendStatusMessage());
  250. return $this->redirect($this->generateUrl('registration_sms_error'));
  251. }
  252. }
  253. /**
  254. * Tell the user to check his email provider
  255. *
  256. * @Route("/email/success", name="registration_email_success")
  257. */
  258. public function emailSuccessAction()
  259. {
  260. $session = $this->container->get('session');
  261. $email = $session->get('registration_email_success');
  262. $session->remove('registration_email_success');
  263. if (empty($email)) {
  264. // the user does not come from the sendEmail action
  265. return $this->redirect($this->generateUrl('homepage'));
  266. }
  267. $kunde = $this->em->getRepository(User::class)->findOneBy(['email' => $email])->getKunde();
  268. return $this->render('@JFJuridicusBundle/Registration/email_success.html.twig', array(
  269. 'kunde' => $kunde
  270. ));
  271. }
  272. /**
  273. * Tell the user that email sending failed
  274. *
  275. * @Route("/email/error", name="registration_email_error")
  276. */
  277. public function emailErrorAction()
  278. {
  279. $session = $this->container->get('session');
  280. $email = $session->get('registration_email_error');
  281. $session->remove('registration_email_error');
  282. if (empty($email)) {
  283. // the user does not come from the sendEmail action
  284. return $this->redirect($this->generateUrl('homepage'));
  285. }
  286. $kunde = $this->em->getRepository(User::class)->findOneBy(['email' => $email])->getKunde();
  287. return $this->render('@JFJuridicusBundle/Registration/email_error.html.twig', array(
  288. 'kunde' => $kunde
  289. ));
  290. }
  291. /**
  292. * Tell the user to check his sms
  293. *
  294. * @Route("/sms/success", name="registration_sms_success")
  295. */
  296. public function smsSuccessAction()
  297. {
  298. $session = $this->get('session');
  299. $email = $session->get('registration_sms_success');
  300. $session->remove('registration_sms_success');
  301. if (empty($email)) {
  302. // the user does not come from the sendEmail action
  303. return $this->redirect($this->generateUrl('homepage'));
  304. }
  305. $kunde = $this->em->getRepository(User::class)->findOneBy(['email' => $email])->getKunde();
  306. return $this->render('@JFJuridicusBundle/Registration/sms_success.html.twig', array(
  307. 'kunde' => $kunde
  308. ));
  309. }
  310. /**
  311. * Tell the user that sms sending failed
  312. *
  313. * @Route("/sms/error", name="registration_sms_error")
  314. */
  315. public function smsErrorAction()
  316. {
  317. $session = $this->container->get('session');
  318. $email = $session->get('registration_sms_error');
  319. $code = $session->get('registration_sms_code');
  320. $message = $session->get('registration_sms_message');
  321. $session->remove('registration_sms_error');
  322. $session->remove('registration_sms_code');
  323. $session->remove('registration_sms_message');
  324. if (empty($email) || empty($code) || empty($message)) {
  325. // the user does not come from the sendSms action
  326. return $this->redirect($this->generateUrl('homepage'));
  327. }
  328. $kunde = $this->em->getRepository(User::class)->findOneBy(['email' => $email])->getKunde();
  329. return $this->render('@JFJuridicusBundle/Registration/sms_error.html.twig', array(
  330. 'kunde' => $kunde,
  331. 'code' => $code,
  332. 'message' => $message,
  333. ));
  334. }
  335. }