<?php
namespace JF\JuridicusBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use JF\JuridicusBundle\Form\KundeType;
use JF\JuridicusBundle\Form\PruefungsamtSelectType;
use JF\JuridicusBundle\Entity\Kunde;
use JF\JuridicusBundle\Entity\Email;
use JF\JuridicusBundle\Entity\Gebuehr;
use JF\JuridicusBundle\Entity\Pruefungsamt;
use JF\JuridicusBundle\Entity\User;
use JF\JuridicusBundle\Entity\MailTemplate;
use JF\JuridicusBundle\Entity\Bundesland;
use JF\JuridicusBundle\Services\PdfCreator;
use Swift_Mailer;
use Swift_Message;
use Doctrine\ORM\EntityManagerInterface;
use JF\JuridicusBundle\Services\Sms;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* @Route("/registration")
*/
class RegistrationController extends AbstractController
{
public function __construct(
private PdfCreator $pdfCreator,
private EntityManagerInterface $em,
private UserPasswordHasherInterface $passwordHasher,
private Swift_Mailer $mailer,
private Sms $smsService,
private LoggerInterface $logger ) {
}
/**
* @Route("/schritt-1", name="registration")
*/
public function registerSelectAction()
{
$form = $this->createForm(PruefungsamtSelectType::class, new Kunde());
return $this->render('@JFJuridicusBundle/Registration/register_select.html.twig', array(
'form' => $form->createView()
));
}
/**
*
* @Route("/schritt-2", name="registration_check_pruefungsamt_selection")
* @Method({"POST"})
*/
public function registerAction(Request $request)
{
$form = $this->createForm(PruefungsamtSelectType::class, null); //changedFrom
$form->handleRequest($request); //changedFrom bind
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
/*
$formData = $form->getData();
$examen = $formData['examen'];
$bundesland_id = $formData['bundesland'];
$entity = new Kunde();
$entity->setExamen($examen); */
$entity = $form->getData();
$examen = $entity->getExamen();
$bundesland_id = $entity->getBundesland()->getId();
$bundesland = $em->getRepository(Bundesland::class)->find($bundesland_id);
$entity->setBundesland($bundesland);
$pa = $em->getRepository(Pruefungsamt::class)->findByBundeslandAndExamen($bundesland_id, $examen);
/* @var $pa Pruefungsamt */
if (!$pa) {
throw $this->createNotFoundException('Prüfungsamt wurde nicht gefunden.');
}
$form = $this->createForm(KundeType::class, $entity, array(
'pruefungsamt' => $pa,
'em' => $em,
));
return $this->render('@JFJuridicusBundle/Registration/register.html.twig', array(
'pruefungsamt' => $pa,
'form' => $form->createView()
));
}
return $this->render('@JFJuridicusBundle/Registration/register_select.html.twig', array(
'form' => $form->createView()
));
}
/**
* @Route("/create", name="registration_create")
* @Method({"POST"})
*/
public function createAction(Request $request)
{
// zuerst Bundesland und Examen verifizieren
$params = $request->request->get('kunde');
$examen = $params['examen'];
$bundesland_id = $params['bundesland'];
if (!$bundesland_id || !$examen) {
return $this->redirect($this->generateUrl('registration'));
}
$em = $this->getDoctrine()->getManager();
$pa = $em->getRepository(Pruefungsamt::class)->findByBundeslandAndExamen($bundesland_id, $examen);
/* @var $pa \JF\JuridicusBundle\Entity\Pruefungsamt */
if (!$pa) {
throw $this->createNotFoundException('Prüfungsamt wurde nicht gefunden.');
}
$kunde = new Kunde();
$kunde->setAnrufErlaubt(false);
$kunde->setExportErlaubt(false);
$kunde->setVerkaeufer(false);
if (! $pa->hasVollbestand()) {
// Strafzahlung eintragen
$strafe = $pa->getCurrentGebuehrByTyp(Gebuehr::TYP_STRAFGEBUEHR);
if ($strafe) {
$kunde->setBetragStrafe($strafe->getBetrag());
$kunde->setStrafeBezahlt(false);
}
// Facebook-Pflicht
$kunde->setPflichtFacebookPost(true);
}
$form = $this->createForm(KundeType::class, $kunde, array(
'pruefungsamt' => $pa,
'em' => $em,
));
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$kunde = $form->getData();
$user = $em->getRepository(User::class)->findOneBy(['email' => $kunde->getEmail()]);
// alten User ggfs. umbiegen
if ($user) {
$kunde_old = $user->getKunde();
if ($kunde_old) {
$kunde_old->setUser(null);
$em->persist($kunde_old);
$em->flush();
} else {
$user->addRole("ROLE_KUNDE");
}
} else {
// entsprechenden User neu erstellen
$user = new User();
$user->addRole("ROLE_KUNDE");
$user->setUsername($kunde->getEmail());
$user->setEmail($kunde->getEmail());
$user->setPlainPassword(substr(uniqid(md5(rand())), 8, 8));
}
$token = uniqid(md5(rand()));
$user->setConfirmationToken($token);
$user->setPassword(uniqid(md5(rand())));
$user->setEnabled(false);
$em->persist($user);
$kunde->setUser($user);
$kunde->setLoggedIn(false);
$em->persist($kunde);
$this->pdfCreator->createStempel($kunde);
$em->flush();
// finde neuestes Template
$template = $em->getRepository(MailTemplate::class)->findCurrentByTyp(Email::REGISTRIERUNG);
$link = $this->generateUrl('registration_activate', array('token' => $token), UrlGeneratorInterface::ABSOLUTE_URL); //chagngedFrom true
$replacements = array(
'vorname' => $kunde->getVorname(),
'nachname' => $kunde->getNachname(),
'email' => $kunde->getEmail(),
'handynummer' => $kunde->getHandynummer(),
'link' => $link
);
$this->logger->info(sprintf('Link: %s ', $link));
$mailerBcc = $this->getParameter('mailer_bcc');
$mailUser = $this->getParameter('mailer_user');
$message = (new Swift_Message($template->getBetreff()))
->setFrom(array($mailUser => 'Juridicus'))
->setReplyTo('info@juridicus.de')
->setTo($kunde->getEmail())
->setBody($template->replace($replacements), 'text/html')
;
if (isset($mailerBcc)) {
$message->setBcc(array($mailerBcc));
}
if ($this->mailer->send($message)) {
// Versand speichern
$email = new Email();
$email
->setTyp(Email::REGISTRIERUNG)
->setKunde($kunde)
;
$em->persist($email);
$em->flush();
$this->get('session')->set('registration_email_success', $kunde->getEmail());
return $this->redirect($this->generateUrl('registration_email_success'));
} else {
//print_r("NICHT");
$this->get('session')->set('registration_email_error', $kunde->getEmail());
return $this->redirect($this->generateUrl('registration_email_error'));
}
}
return $this->render('@JFJuridicusBundle/Registration/register.html.twig', array(
'pruefungsamt' => $pa,
'form' => $form->createView()
));
}
/**
* Receive the confirmation token and send SMS with password
*
* @Route("/activate/{token}", name="registration_activate")
*/
public function activateAction($token)
{
$em = $this->getDoctrine()->getManager();
/* @var $sms_service \JF\JuridicusBundle\Services\Sms */
$user = $this->em->getRepository(User::class)->findOneBy(['confirmationToken' => $token]);
if (null === $user) {
throw $this->createNotFoundException('Der Aktivierungscode ist ungültig oder wurde schon verwendet.');
}
$kunde = $user->getKunde();
/* @var $kunde \JF\JuridicusBundle\Entity\Kunde */
if (null === $kunde) {
throw $this->createNotFoundException('Der Benutzer zu diesem Aktivierungscode ist nicht mehr vorhanden.');
}
$password_plain = substr(uniqid(md5(rand())), 8, 8);
$hashedPassword = $this->passwordHasher->hashPassword(
$user,
$password_plain
);
$user->setEnabled(true);
$user->setConfirmationToken(null);
$user->setPlainPassword($password_plain);
$user->setPassword($hashedPassword);
$em->persist($user);
$this->logger->info(sprintf('User: %s PW: %s', $user->getEmail(), $password_plain));
// Senden des Passwords per SMS
$template = $em->getRepository(MailTemplate::class)->findCurrentByTyp(Email::SMS);
$replacements = array(
'vorname' => $kunde->getVorname(),
'nachname' => $kunde->getNachname(),
'email' => $kunde->getEmail(),
'handynummer' => $kunde->getHandynummer(),
'password' => $password_plain
);
if ($this->smsService->send(html_entity_decode(strip_tags($template->replace($replacements))), $kunde->getHandynummer())) {
$kunde->setSmsSendAt(new \DateTime());
$kunde->setSmsStatusId($this->smsService->getStatusId());
$em->persist($kunde);
$em->flush();
$this->container->get('session')->set('registration_sms_success', $kunde->getEmail());
return $this->redirect($this->generateUrl('registration_sms_success'));
} else {
$session = $this->container->get('session');
$session->set('registration_sms_error', $kunde->getEmail());
$session->set('registration_sms_code', $sms_service->getSendStatusCode());
$session->set('registration_sms_message', $sms_service->getSendStatusMessage());
return $this->redirect($this->generateUrl('registration_sms_error'));
}
}
/**
* Tell the user to check his email provider
*
* @Route("/email/success", name="registration_email_success")
*/
public function emailSuccessAction()
{
$session = $this->container->get('session');
$email = $session->get('registration_email_success');
$session->remove('registration_email_success');
if (empty($email)) {
// the user does not come from the sendEmail action
return $this->redirect($this->generateUrl('homepage'));
}
$kunde = $this->em->getRepository(User::class)->findOneBy(['email' => $email])->getKunde();
return $this->render('@JFJuridicusBundle/Registration/email_success.html.twig', array(
'kunde' => $kunde
));
}
/**
* Tell the user that email sending failed
*
* @Route("/email/error", name="registration_email_error")
*/
public function emailErrorAction()
{
$session = $this->container->get('session');
$email = $session->get('registration_email_error');
$session->remove('registration_email_error');
if (empty($email)) {
// the user does not come from the sendEmail action
return $this->redirect($this->generateUrl('homepage'));
}
$kunde = $this->em->getRepository(User::class)->findOneBy(['email' => $email])->getKunde();
return $this->render('@JFJuridicusBundle/Registration/email_error.html.twig', array(
'kunde' => $kunde
));
}
/**
* Tell the user to check his sms
*
* @Route("/sms/success", name="registration_sms_success")
*/
public function smsSuccessAction()
{
$session = $this->get('session');
$email = $session->get('registration_sms_success');
$session->remove('registration_sms_success');
if (empty($email)) {
// the user does not come from the sendEmail action
return $this->redirect($this->generateUrl('homepage'));
}
$kunde = $this->em->getRepository(User::class)->findOneBy(['email' => $email])->getKunde();
return $this->render('@JFJuridicusBundle/Registration/sms_success.html.twig', array(
'kunde' => $kunde
));
}
/**
* Tell the user that sms sending failed
*
* @Route("/sms/error", name="registration_sms_error")
*/
public function smsErrorAction()
{
$session = $this->container->get('session');
$email = $session->get('registration_sms_error');
$code = $session->get('registration_sms_code');
$message = $session->get('registration_sms_message');
$session->remove('registration_sms_error');
$session->remove('registration_sms_code');
$session->remove('registration_sms_message');
if (empty($email) || empty($code) || empty($message)) {
// the user does not come from the sendSms action
return $this->redirect($this->generateUrl('homepage'));
}
$kunde = $this->em->getRepository(User::class)->findOneBy(['email' => $email])->getKunde();
return $this->render('@JFJuridicusBundle/Registration/sms_error.html.twig', array(
'kunde' => $kunde,
'code' => $code,
'message' => $message,
));
}
}