<?php
namespace App\Controller;
use App\Entity\Center;
use App\Entity\Config;
use App\Entity\FormationGroup;
use App\Entity\Formulaire;
use App\Entity\FormulaireFieldChoiceValue;
use App\Entity\Periode;
use App\Entity\Preinscription;
use App\Entity\PreinscriptionData;
use Doctrine\ORM\EntityManagerInterface;
use Dompdf\Dompdf;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\Routing\Annotation\Route;
class PreinscriptionController extends AbstractController
{
/**
* @Route("/{center}/preinscription/{slug}/{formulaire}",
* name="mmpp_preinscription",
* defaults={"formulaire": null}
* )
* @Route("/{center}/preinscription/{slug}/{formulaire}/{currentYear}",
* name="mmpp_preinscription_current_year",
* defaults={"formulaire": null}
* )
* @ParamConverter("center", options={"mapping": {"center" = "slug"}})
*
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
*/
public function indexAction(
EntityManagerInterface $em,
Request $request,
MailerInterface $mailer,
Center $center, $slug,
Formulaire $formulaire = null,
$currentYear = null
) {
$this->formationGroups = $em->getRepository(FormationGroup::class)
->findWithFormationByCenter($center);
if (null === $formulaire) {
throw $this->createNotFoundException('Cette page est désactivée');
}
$periode = $em->getRepository(Periode::class)->findOneBy(array('isDefault' => true));
// Conditions pour fermer les inscriptions
if (!$formulaire->isIsActive()) {
return $this->redirectToRoute('mmpp_preinscription_closed', array(
'center' => $center->getSlug(),
'slug' => $slug,
'formulaire' => $formulaire->getId()
));
}
// verification de l'IP
//$reader = new Reader('/var/www/geoip/GeoLite2-Country.mmdb');
//$record = $reader->country($_SERVER['REMOTE_ADDR']);
//if (!empty($record->country->isoCode)) {
// on redirige et on marque en session pour ne plus rediriger
/*if ( (in_array($record->country->isoCode, array('MQ', 'GP'))) && ($center_slug == 'bordeaux') && ($this->session->get('redirected') == false) ) {
$this->session->set('redirected', true);
return $this->redirect($this->generateUrl('mmpp_front_homepage3', array('center_slug' => 'antilles')));
// on est déjà sur le site antilles, on marque pour ne plus rediriger
} elseif ( (in_array($record->country->isoCode, array('MQ', 'GP'))) && ($center_slug == 'bordeaux') ) {
$this->session->set('redirected', true);
}*/
//}
$errors = array();
$datas = array();
$studentMail = null;
$parentMail = null;
if ($request->isMethod('POST')) {
// on check les required vides
foreach ($formulaire->getBlocks() as $block) {
foreach ($block->getFields() as $field) {
$value = $request->request->get('field_'.$field->getId());
if ($field->getRequired() && empty($value)) {
// depend d'aucun autre champ, donc si absent et required, pas bien
if (null == $field->getDependsOn()) {
$errors[] = 'Le champ '.$field->getLabel(). ' est obligatoire';
// peut dependre d'un autre chose. Si c'est autre champ n'a pas la valeur correspondante,
// ce champ n'apparait pas et donc n'est pas obligatoire
} else {
// valeur
$dependsOn = $field->getDependsOn();
// champ d'origine de la dépendance
$dependsField = $dependsOn->getField();
$dependsPost = $request->request->get('field_'.$dependsField->getId());
// bonne valeur, donc affiché, donc si absent et required, pas bon
if ( $dependsPost == $dependsOn) {
$errors[] = 'Le champ '.$field->getLabel(). ' est obligatoire';
}
}
}
if ($field->getSlug() == 'adresse-e-mail') {
$existings = $em->getRepository(Preinscription::class)
->findWithDatas($center, array('email' => $value, 'today' => true));
if (count($existings) > 0) {
$errors[] = 'Une pré-inscription existe déjà avec cette adresse Email';
}
$studentMail = $value;
}
if ($field->getSlug() == 'adresse-e-mail-des-parents') {
$parentMail = $value;
}
if ($field->getSlug() == 'bac-serie') {
$precisezBac = $request->request->get('field_301');
if ( ($value == 414) && (empty($precisezBac)) ) { // autre bac
$errors[] = 'Vous devez précisez votre bac';
}
}
}
}
if ($studentMail == $parentMail) {
$errors[] = 'Les adresses email des parents et de l\'élève ne peuvent pas être identiques';
}
$datas = $request->request->all();
$payment = $request->request->get('payment');
// pour le pdf
$tabDatas = array();
// pour l'email
$content = '<html><body><h3>Pré-inscription</h3><table style="min-width: 600px;border:solid 1px #00007e">';
// on sauvegarde les infos
if (empty($errors)) {
$preinscription = new Preinscription();
$preinscription->setCenter($center);
$preinscription->setGeneratedKey( $this->generateKey() );
$preinscription->setValidated(false);
$preinscription->setEmailSend(false);
$preinscription->setDeleted(false);
$preinscription->setState(1);
$preinscription->setFormulaire($formulaire);
$preinscription->setPaymentType($payment);
$preinscription->setCreatedOn(new \DateTime());
$preinscription->setUpdatedOn(new \DateTime());
$preinscription->setPeriode($periode);
$bac = $request->request->get('field_297');
foreach ($formulaire->getBlocks() as $block) {
if ($block->getName() == 'formation_man') {
foreach ($block->getFields() as $field) {
$value = $request->request->get('field_'.$field->getId());
if($field->getType() == 'select'){
$choiceValue = $em->getRepository(FormulaireFieldChoiceValue::class)
->find($value);
$value = $choiceValue->getValue();
switch ($value){
case 'Ergotherapie':
$preinscription->setFormulaire($em->getRepository(Formulaire::class)->findOneBy([
'slug' => 'mise-a-niveau-scientifique-ergotherapie'
]));
break;
case 'Orthoptiste':
$preinscription->setFormulaire($em->getRepository(Formulaire::class)->findOneBy([
'slug' => 'mise-a-niveau-scientifique-orthoptiste'
]));
break;
case 'Autres concours':
$preinscription->setFormulaire($em->getRepository(Formulaire::class)->findOneBy([
'slug' => 'mise-a-niveau-scientifique-autres-concours'
]));
break;
case 'PASS/LAS-autre concours':
$preinscription->setFormulaire($em->getRepository(Formulaire::class)->findOneBy([
'slug' => 'mise-a-niveau-scientifique-pass-las-autres-concours'
]));
break;
case 'Filières étrangères':
$preinscription->setFormulaire($em->getRepository(Formulaire::class)->findOneBy([
'slug' => 'mise-a-niveau-scientifique-filieres-etrangeres'
]));
break;
case 'Filières étrangères avec option espagnol':
$preinscription->setFormulaire($em->getRepository(Formulaire::class)->findOneBy([
'slug' => 'mise-a-niveau-scientifique-filiere-etrangeres-option-espagnol'
]));
break;
}
}
}
}
if ($block->getName() == 'formation_param') {
foreach ($block->getFields() as $field) {
$value = $request->request->get('field_'.$field->getId());
if($field->getType() == 'select'){
$choiceValue = $em->getRepository(FormulaireFieldChoiceValue::class)
->find($value);
$value = $choiceValue->getValue();
switch ($value){
case 'Ergotherapie':
$preinscription->setFormulaire($em->getRepository(Formulaire::class)->findOneBy([
'slug' => 'paramedical-ergotherapie'
]));
break;
case 'Psychomotricite':
$preinscription->setFormulaire($em->getRepository(Formulaire::class)->findOneBy([
'slug' => 'paramedical-psychomotricite'
]));
break;
case 'Podologie':
$preinscription->setFormulaire($em->getRepository(Formulaire::class)->findOneBy([
'slug' => 'paramedical-podologie'
]));
break;
case 'Orthoptie':
$preinscription->setFormulaire($em->getRepository(Formulaire::class)->findOneBy([
'slug' => 'paramedical-orthoptie'
]));
break;
case 'Audioprothésiste':
$preinscription->setFormulaire($em->getRepository(Formulaire::class)->findOneBy([
'slug' => 'paramedical-audioprothesiste'
]));
break;
}
}
}
}
foreach ($block->getFields() as $field) {
$value = $request->request->get('field_'.$field->getId());
if(isset($value)){
// nothing
if ($field->getType() == 'static') {
$value = $field->getValue();
// one integer
} elseif ($field->getType() == 'radio') {
$choiceValue = $em->getRepository(FormulaireFieldChoiceValue::class)
->find($value);
$value = $choiceValue->getValue();
$tabDatas[$field->getSlug()] = $choiceValue->getSlug();
} elseif ($field->getType() == 'select') {
$choiceValue = $em->getRepository(FormulaireFieldChoiceValue::class)
->find($value);
$value = $choiceValue->getValue();
$tabDatas[$field->getSlug()] = $choiceValue->getValue();
// array of int
} elseif ( ($field->getType() == 'checkbox') && (!empty($value))) {
$values = array();
$slugs = array();
foreach ($value as $id) {
$choiceValue = $em->getRepository(FormulaireFieldChoiceValue::class)
->find($id);
$values[] = $choiceValue->getValue();
$slugs[] = $choiceValue->getSlug();
}
$value = implode(', ', $values);
$tabDatas[$field->getSlug()] = $slugs;
} else {
$tabDatas[$field->getSlug()] = $value;
}
//$content .= $field->getLabel().': '.$value."\n";
if ( ($field->getSlug() != 'annee-d-obtention' ) || ($bac != 401)) {
$content .= '<tr><td style="border-bottom: dashed 1px #d0d0F0; padding:4px;border-right: dotted 1px #00007e">'.$field->getLabel().'</td><td style="border-bottom: dashed 1px #d0d0F0; padding: 4px;">'.$value.'</td></tr>';
}
$line = new PreinscriptionData();
$line->setKey($field->getLabel());
$line->setValue($value);
$line->setPreinscription($preinscription);
$em->persist($line);
if ($field->getSlug() == 'prenom') {
$preinscription->setFirstname(ucfirst($value));
}
if ($field->getSlug() == 'nom') {
$preinscription->setLastname(strtoupper($value));
}
}
}
}
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
$ipLine = (new PreinscriptionData())
->setPreinscription($preinscription)
->setValue($ip)
->setKey('IP');
$em->persist($ipLine);
$em->persist($preinscription);
$em->flush();
$content .= '</table></body></html>';
// email
$message = (new Email())
->subject('Pré-inscription MMPP')
->from(new Address('contact@mmpp.fr', $tabDatas['prenom'].' '.$tabDatas['nom']))
->replyTo(new Address($tabDatas['adresse-e-mail'], $tabDatas['prenom'].' '.$tabDatas['nom']))
->to('contact@mmpp.fr')
->html($content);
$mailer->send($message);
if ($payment == 'cb') {
return $this->redirectToRoute('mmpp_front_switch_payment', [
'center' => $center->getSlug(),
'id' => $preinscription->getId()
]);
}
// Pdf
$html = $this->renderView('preinscription/Pdf/'.$formulaire->getSlug().'.html.twig', array('datas' => $tabDatas));
$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$dompdf->setPaper('a4', 'portrait');
$dompdf->render();
$pdfoutput = $dompdf->output();
$response = new Response($pdfoutput);
$disposition = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
'preinscription_mmpp.pdf'
);
$response->headers->set('Content-Disposition', $disposition);
return $response;
}
}
$configAll = $em->getRepository(Config::class)
->findAll();
foreach ($configAll as $c) {
$config[$c->getKey()] = $c->getValue();
}
return $this->render('preinscription/index.html.twig', array(
'center' => $center,
'formationGroups' => $this->formationGroups,
'formulaire' => $formulaire,
'errors' => $errors,
'datas' => $datas,
'path' => null,
'periode' => $periode,
'config' => $config
));
}
/**
* @Route("/{center}/closed/{slug}/{formulaire}", name="mmpp_preinscription_closed")
* @ParamConverter("center", options={"mapping": {"center" = "slug"}})
*/
public function closedAction(EntityManagerInterface $em, Center $center, Formulaire $formulaire)
{
$this->formationGroups = $em->getRepository(FormationGroup::class)
->findWithFormationByCenter($center);
return $this->render('preinscription/closed.html.twig', array(
'center' => $center,
'formationGroups' => $this->formationGroups,
'formulaire' => $formulaire,
));
}
/**
* @Route("/{center}/payment/switch/{id}", name="mmpp_front_switch_payment")
* @ParamConverter("center", options={"mapping": {"center" = "slug"}})
*/
public function switchPaymentAction(
Center $center,
Preinscription $preinscription
) {
return $this->render('payment/switch.html.twig', [
'center_slug' => $center->getSlug(),
'center' => $center,
'preinscription' => $preinscription
]);
}
/**
* @Route("/{center}/display/payment/pr/{id}", name="mmpp_front_display_pr_payment")
* @ParamConverter("center", options={"mapping": {"center" = "slug"}})
*/
public function displayPrPaymentAction(
Center $center,
Preinscription $preinscription
) {
return $this->render('payment/payment-pr.html.twig', [
'center_slug' => $center->getSlug(),
'center' => $center,
'preinscription' => $preinscription
]);
}
private function generateKey()
{
$symbols = array(
'a','b','c','d','e','f','g','h','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'2','3','4','5','6','7','8','9'
);
$key = '';
for ($i=0; $i<8; $i++) {
$key .= $symbols[array_rand($symbols)];
}
return strtoupper($key);
}
}