<?php
namespace App\Controller;
use App\Entity\Commande;
use App\Entity\EnterpriseRequest;
use App\Entity\Contact;
use App\Entity\ContactPropertyValue;
use App\Entity\Enterprise;
use App\Entity\User;
use App\Entity\Inscription;
use App\Form\CeInscriptionParentType;
use App\Entity\EnterpriseOptionSejourSession;
use App\Entity\Location;
use App\Entity\Media;
use App\Entity\MediaCategorie;
use App\Entity\Notification;
use App\Entity\Property;
use App\Factory\EnfantFactory;
use App\Factory\EnterpriseFactory;
use App\Factory\ParentFactory;
use App\Form\CommandeOptionType;
use App\Form\EnterpriseOptionSejourSessionType;
use App\Form\EnterpriseRequestType;
use App\Form\EnterpriseType;
use App\Form\FileUploadType;
use App\Form\FormFlow\CreateInscriptionFlow;
use App\Form\InscriptionCEType;
use App\Message\SendEmailMessage;
use App\Message\SendNotificationMessage;
use App\Storage\CommandeSessionStorage;
use App\Utility\PasswordGenerator;
use App\Utility\UpdateOptionCeSession;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use PhpOffice\PhpSpreadsheet\IOFactory;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\String\Slugger\SluggerInterface;
class EspaceCEController extends AbstractController
{
/**
* @Route("demande-ce-administrations.html", name="espace_ce")
*/
public function index(Request $request, MailerInterface $mailer, EntityManagerInterface $em, PasswordGenerator $pg, UserPasswordEncoderInterface $encoder): Response
{
$enterpriseRequest = new EnterpriseRequest();
return $this->render('espace_ce/index.html.twig');
}
/**
* @Route("ce-information-partenaire", name="espace_ce_information_partenaire")
*/
public function informationPartenaire(Request $request, EntityManagerInterface $em)
{
$enterprise = new Enterprise();
$enterprise->setContact($this->getUser()->getContact());
$form = $this->createForm(EnterpriseType::class, $enterprise);
$form->get('contact')->remove('email');
$form->get('contact')->add('email', null, ['attr' => ['class' => 'form-control', 'readonly' => true, 'placeholder' => 'Email']]);
return $this->render('espace_ce/formCreationCompte.html.twig', [
'form' => $form->createView(),
'pageTitle' => 'information partenaire'
]);
}
/**
* @Route("demande-ce-sejour-groupe", name="espace_ce_demande_groupe")
*/
public function demandeGroupe(Request $request, EntityManagerInterface $em, MailerInterface $mailer)
{
$enterpriseRequest = new EnterpriseRequest();
$form = $this->createForm(EnterpriseRequestType::class, $enterpriseRequest);
$form->handleRequest($request);
if ($form->isSubmitted() and $form->isValid()) {
$location = $enterpriseRequest->getEnterprise()->getLocation();
$contact = $enterpriseRequest->getEnterprise()->getContact();
$userExist = $em->getRepository(User::class)->findOneByEmail($contact->getEmail());
$em->persist($location);
$name = "";
if ($user->getContact() !== null) {
$name = $user->getContact()->getFirstName() . ' ' . $user->getContact()->getLastName();
}
$em->flush();
$em->persist($enterpriseRequest);
$em->flush();
$email =
(new TemplatedEmail())
//TODO: voir pour les adresses mails.
->from(new Address('siteinternet@croqvacances.org', 'Croqvacances'))
->to($user->getEmail())
->subject('Création compte acces au site de croqvacances')
->htmlTemplate('emails/creation_compte.html.twig')
->context([
'password' => $plainPassword,
'userEmail' => $user->getEmail(),
'name' => $name,
]);
$mailer->send($email);
$this->addFlash('success', 'Votre demande a été envoyée. Par ailleurs, nous vous avons envoyé un mail avec des identifiants pour vous connecter à l\'espace CE');
return $this->redirectToRoute('espace_ce_general');
}
return $this->render('espace_ce/_formDemandeGroupe.html.twig', ['form' => $form->createView()]);
}
/**
* @Route("espace-ce",name="espace_ce_general")
*/
public function espaceCeGeneral(EntityManagerInterface $em, PaginatorInterface $paginator, Request $request): Response
{
$optionOuvert = $em->getRepository(EnterpriseOptionSejourSession::class)->findBy(['enterprise' => $this->getUser()->getContact()->getEnterprise()]);
if ($this->getUser()->getContact()->getEnterprise() == null)
return $this->redirectToRoute("espace_ce_creation_entreprise");
$dql = "SELECT r FROM " . EnterpriseRequest::class . " r WHERE r.enterprise =" . $this->getUser()->getContact()->getEnterprise()->getId();
$query = $em->createQuery($dql);
$pagination = $paginator->paginate(
$query, /* query NOT result */
$request->query->getInt('page', 1), /*page number*/
10 /*limit per page*/
);
// parameters to template
return $this->render('espace_ce/list.html.twig', [
'pagination' => $pagination,
'options' => $optionOuvert
]);
}
/**
* @Route("espace-ce/creation-entreprise", name="espace_ce_creation_entreprise")
*/
public function creationEnteprise(EntityManagerInterface $em, Request $request, EnterpriseFactory $enterpriseFactory)
{
$enterprise = $enterpriseFactory->createEnterprise();
if ($this->getUser() !== null)
$enterprise->setContact($this->getUser()->getContact());
$cpv = new ContactPropertyValue();
$property = $em->getRepository(Property::class)->findOneByName('Telephone');
$cpv->setProperty($property);
$enterprise->getContact()->addContactPropertyValue($cpv);
$form = $this->createForm(EnterpriseType::class, $enterprise);
$form->get('contact')->remove('email');
$form->get('contact')->add('email', null, ['attr' => ['class' => 'form-control', 'readonly' => true, 'placeholder' => 'Email']]);
$form->handleRequest($request);
if ($form->isSubmitted() and $form->isValid()) {
$loc = $enterprise->getLocation();
$em->persist($loc);
$enterprise->setLocation($loc);
$em->persist($enterprise);
$em->flush();
$this->getUser()->getContact()->setEnterprise($enterprise);
$em->flush();
return $this->redirectToRoute('espace_ce_general');
}
return $this->render('espace_ce/formCreationCompte.html.twig', [
'form' => $form->createView(),
'pageTitle' => 'Création du compte partenaire'
]);
}
/**
* @Route("espace-ce-vue-option/{id}",name="espace_ce_vue_option")
*/
public function ajoutInscriptionParent2(
EntityManagerInterface $em,
int $id,
ParentFactory $pf,
EnfantFactory $ef,
UpdateOptionCeSession $uocs,
Request $request,
PasswordGenerator $pg,
UserPasswordEncoderInterface $encoder,
MessageBusInterface $bus,
MailerInterface $mailer,
CommandeSessionStorage $css
): Response {
$option = $em->getRepository(EnterpriseOptionSejourSession::class)->findOneById($id);
//TODO: mettre voters.
$parent = $pf->createContact();
$enfant = $ef->createContact();
$sejourSession = $option->getSejourSession();
$inscription = new Inscription();
$inscription->setSejourSession($sejourSession);
$inscription->setEnterpriseOptionSejourSession($option);
$inscription->setParent($parent);
$commande = new Commande();
$commande->addInscription($inscription);
$em->persist($commande);
$em->persist($inscription);
$em->flush();
$uocs->updateSingleOption($option);
$em->flush();
return $this->redirectToRoute("mesCommande_infos_ce");
}
/**
* @Route("/espace-ce/nouvelle_demande",name="espace_ce_nouvelle_demande")
*/
public function nouvelleDemande(Request $request, EntityManagerInterface $em, MessageBusInterface $bus)
{
$er = new EnterpriseRequest();
$er->setEnterprise($this->getUser()->getContact()->getEnterprise());
$form = $this->createForm(EnterpriseRequestType::class, $er);
$form->handleRequest($request);
if ($form->isSubmitted() and $form->isValid()) {
$url = $this->generateUrl('admin_request_index');
$notif = (new Notification())
->setRole("ROLE_COMPTA")
->setTitle("Nouvelle demande de séjour collectif")
->setSubtitle($er->getEnterprise()->getName())
->setStatut(Notification::STATUT_OPEN)
->setUrl($url);
$em->persist($notif);
$em->persist($er);
$em->flush();
$bus->dispatch(new SendEmailMessage('inscription_ce_demande_collective', Inscription::class, $er->getId(), null));
$this->addFlash('success', 'demande bien prise en compte');
return $this->redirectToRoute('espace_ce_general');
}
return $this->render('espace_ce/_formDemandeGroupe.html.twig', [
'form' => $form->createView(),
'pageTitle' => 'Nouvelle demande '
]);
}
/**
* @Route("/espace-ce/inscription-enfant/{id}", name="espace_ce_inscription_enfant")
*/
public function ajoutInscriptionEnfant(EntityManagerInterface $em, int $id, Request $request, MessageBusInterface $bus)
{
$eoss = $em->getRepository(EnterpriseOptionSejourSession::class)->findOneBy([
'id' => $id,
'enterprise' => $this->getUser()->getContact()->getEnterprise()
]);
if ($eoss == null) {
$this->addFlash('success', 'attention, vous ne pouvez plus effectué de réservation sur cette option. Toutes les places sont dédiées');
return $this->redirectToRoute('index');
}
if ($eoss->getNbreBooke() >= $eoss->getNbreSouhaite()) {
$this->addFlash('success', 'attention, vous ne pouvez plus effectué de réservation sur cette option. Toutes les places sont dédiées');
return $this->redirectToRoute('index');
}
$inscription = new Inscription();
$inscription->setEnterpriseOptionSejourSession($eoss);
$inscription->setSejourSession($eoss->getSejourSession());
$inscription->setParent($this->getUser()->getContact());
$form = $this->createForm(InscriptionCEType::class, $inscription);
$form->remove('parent');
$form->add('valider', SubmitType::class);
$form->handleRequest($request);
if ($form->IsSubmitted() and $form->isValid()) {
$em->persist($inscription);
$eoss->setNbreBooke($eoss->getNbreBooke() + 1);
$em->flush();
$bus->dispatch(new SendEmailMessage('email_inscription_parent_ce', Inscription::class, $inscription->getId(), $inscription->getParent()->getEmail()));
$this->addFlash('success', 'inscription effectuée. Le parent va recevoir un email de connexion à l\'espace parent');
return $this->redirectToRoute('espace_ce_general');
}
return $this->render('espace_ce/_formInscriptionEnfant.html.twig', ['form' => $form->createView(), 'pageTitle' => 'Inscription à un séjour']);
}
/**
* @Route("/espace-ce/inscription-parent/{id}",name="espace_ce_inscription_parent")
*/
public function ajoutInscriptionParent(
int $id,
EntityManagerInterface $em,
Request $request,
MessageBusInterface $bus,
UserPasswordHasherInterface $userPasswordHasher,
) {
$eoss = $em->getRepository(EnterpriseOptionSejourSession::class)->findOneBy([
'id' => $id,
'enterprise' => $this->getUser()->getContact()->getEnterprise()
]);
if ($eoss == null) {
$this->addFlash('success', 'attention, vous ne pouvez plus effectué de réservation sur cette option. Toutes les places sont dédiées');
return $this->redirectToRoute('espace_ce_general');
}
if ($eoss->getNbreBooke() >= $eoss->getNbreSouhaite()) {
$this->addFlash('success', 'attention, vous ne pouvez plus effectué de réservation sur cette option. Toutes les places sont dédiées');
return $this->redirectToRoute('espace_ce_general');
}
$inscription = new Inscription();
$inscription->setEnterpriseOptionSejourSession($eoss);
$inscription->setSejourSession($eoss->getSejourSession());
$inscription->setStatut(Inscription::OPTION);
$form = $this->createForm(InscriptionCEType::class, $inscription);
$form->add('valider', SubmitType::class, ['attr' => ['class' => 'btn btn-primary']]);
$form->handleRequest($request);
if ($form->IsSubmitted() and $form->isValid()) {
$debutSejour = $inscription->getSejourSession()->getDateDebut();
$age = $inscription->getEnfant()->getAgeComplete($debutSejour);
$age2 = $inscription->getEnfant()->getAge();
$dateNaissance = $inscription->getEnfant()->getBirthDate();
//$age = date_diff($dateNaissance, $debutSejour)->y;
$sejour = $inscription->getSejourSession()->getSejour();
if ($age < $sejour->getAgeMin() || $age2 > $sejour->getAgeMax()) {
$this->addFlash('warning', 'Votre enfant n\'a pas l\'âge requis pour le séjour L\'enfant a ' . $age . ' ans . Pour le séjour son âge doit être entre ' . $sejour->getAgeMin() . ' et ' . $sejour->getAgeMax() . ' ans');
return $this->render('espace_ce/_formInscriptionEnfant.html.twig', ['form' => $form->createView(), 'pageTitle' => 'Inscription à un séjour']);
}
$email = $inscription->getParent()->getEmail();
$contact = $em->getRepository(Contact::class)->findOneByEmail($email);
if ($contact !== null) {
$inscription->setParent($contact);
if ($contact->getUser() == null) {
$user = new User();
$user->setContact($contact);
$user->addRole(User::ROLE_PARENT);
$user->setEmail($contact->getEmail());
$user->setIsVerified(true);
$password = $userPasswordHasher->hashPassword($user, uniqid());
$user->setPassword($password);
$inscription->getParent()->setUser($user);
}
} else {
$contact = $inscription->getParent();
$user = new User();
$user->setContact($contact);
$user->addRole(User::ROLE_PARENT);
$user->setEmail($contact->getEmail());
$user->setIsVerified(true);
$password = $userPasswordHasher->hashPassword($user, uniqid());
$user->setPassword($password);
$contact->setUser($user);
$inscription->setParent($contact);
}
$inscription->getEnfant()->setParent($inscription->getParent());
$em->persist($inscription);
$eoss->setNbreBooke($eoss->getNbreBooke() + 1);
$em->flush();
$bus->dispatch(new SendEmailMessage('email_inscription_parent_ce', Inscription::class, $inscription->getId(), $inscription->getParent()->getEmail()));
$this->addFlash('success', 'inscription effectuée. Le parent va recevoir un email de connexion à l\'espace parent');
return $this->redirectToRoute('espace_ce_general');
}
return $this->render('espace_ce/_formInscriptionEnfant.html.twig', ['form' => $form->createView(), 'pageTitle' => 'Inscription à un séjour']);
}
/**
* @Route("/espace-ce/upload/{id}",name="espace_ce_upload_fichier")
*/
public function uploadFichier(Request $request, EntityManagerInterface $em, $id, SluggerInterface $slugger)
{
$option = $em->getRepository(EnterpriseOptionSejourSession::class)->findOneById($id);
$this->denyAccessUnlessGranted('POST_EDIT', $option);
$form = $this->createForm(FileUploadType::class);
$form->handleRequest($request);
if ($form->isSubmitted() and $form->isValid()) {
$file = $request->files->get('file_upload')["file"];
$originalFilename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
// this is needed to safely include the file name as part of the URL
$safeFilename = $slugger->slug($originalFilename);
$newFilename = $safeFilename . '-' . uniqid() . '.' . $file->guessExtension();
// Move the file to the directory where brochures are stored
try {
$file->move(
$this->getParameter('import_directory'),
$newFilename
);
} catch (FileException $e) {
dump($e);
// ... handle exception if something happens during file upload
}
$file = IOFactory::load($this->getParameter('import_directory') . "/" . $newFilename);
$data = [];
foreach ($file->getWorksheetIterator() as $worksheet) {
$worksheetTitle = "import";
$data[$worksheetTitle] = [
'columnNames' => [],
'columnValues' => [],
];
foreach ($worksheet->getRowIterator() as $row) {
$rowIndex = $row->getRowIndex();
if ($rowIndex > 2) {
$data[$worksheetTitle]['columnValues'][$rowIndex] = [];
}
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false); // Loop over all cells, even if it is not set
foreach ($cellIterator as $cell) {
if ($rowIndex === 2) {
$data[$worksheetTitle]['columnNames'][] = $cell->getValue();
}
if ($rowIndex > 2) {
$data[$worksheetTitle]['columnValues'][$rowIndex][] = $cell->getValue();
}
}
}
}
$data = $data["import"];
$error = [];
$sejourSession = $option->getSejourSession();
$nbreInscription = count($option->getInscriptions());
foreach ($data as $inscriptionRaw) {
if (count($inscriptionRaw) == 0) continue;
$nbreInscription++;
//session a assez de place
$placesDispo = $sejourSession->getPlaceDispo();
if ($placesDispo <= 0)
$error[] = "Aucune place de disponible sur ce séjour";
//options a encore des places
$placesAvailable = $option->getNbreSouhaite();
if ($nbreInscription >= $placesAvailable)
$error[] = "Vous avez alloué tous vos séjours:";
//enfants passe dans l'age
$age = 8;
$age2 = 8;
$sejour = $sejourSession->getSejour();
if ($age < $sejour->getAgeMin() || $age2 > $sejour->getAgeMax()) {
$error[] = 'Votre enfant n\'a pas l\'âge requis pour le séjour L\'enfant a ' . $age . ' ans . Pour le séjour son âge doit être entre ' . $sejour->getAgeMin() . ' et ' . $sejour->getAgeMax() . ' ans';
}
if (count($error) > 0) {
$this->addFlash("warning", implode("\n", $error));
} else {
$user = $em->getRepository(User::class)->findOneByEmail($inscriptionRaw[3]);
if ($user == null) {
$contact = (new Contact())
->setEmail($inscriptionRaw[3])
->setFirstName($inscriptionRaw[1])
->setLastName($inscriptionRaw[2])
->setSexe($inscriptionRaw[0] == "Md" ? "F" : "M");
$user = (new User())
->setEmail($inscriptionRaw[3])
->setContact($contact)
->setIsActive(true)
->setRoles(["ROLE_USER"])
->setPassword(uniqid());
$enfant = (new Contact())
->setSexe($inscriptionRaw[9] == "M" ? "M" : "F")
->setFirstName($inscriptionRaw[10])
->setLastName($inscriptionRaw[11])
->setBirthDate((new \DateTime())->setTimestamp(($inscriptionRaw[12] - 25569) * 86400));
$location = (new Location())
->setHouseNumber($inscriptionRaw[4])
->setStreet($inscriptionRaw[5])
->setZipCode($inscriptionRaw[6])
->setCity($inscriptionRaw[7])
->setCountry($inscriptionRaw[8]);
$contact->setLocation($location);
$em->persist($user);
} else {
$exist = false;
foreach ($user->getContact()->getChildren() as $child) {
if ($child->getFirstName() == $inscriptionRaw[10] and $child->getLastName() == $inscriptionRaw[11]) {
$exist = true;
$enfant = $child;
}
}
if (!$exist) {
$enfant = (new Contact())
->setBirthDate((new \DateTime())->setTimestamp(($inscriptionRaw[12] - 25569) * 86400))
->setFirstName($inscriptionRaw[10])
->setLastName($inscriptionRaw[11]);
$user->getContact()->addChild($enfant);
}
}
$inscription = new Inscription();
$inscription->setEnterpriseOptionSejourSession($option)
->setEnfant($enfant)
->setParent($user->getContact())
->setSejourSession($option->getSejourSession());
$inscription->setStatut("option");
$em->persist($inscription);
}
}
$em->flush();
$this->addFlash('success', 'import effectué avec succès');
return $this->redirectToRoute('espace_ce_general');
}
return ($this->render('frontend/form.html.twig', ['form' => $form->createView(), 'pageTitle' => 'Import inscriptions']));
}
/**
* @Route("/espace-ce/demande_sejour_individuel",name="espace_ce_demande_sejour_individuel")
*/
public function demandeSejourIndividuel(Request $request, EntityManagerInterface $em, MessageBusInterface $bus)
{
$eoss = new EnterpriseOptionSejourSession();
$eoss->setEnterprise($this->getUser()->getContact()->getEnterprise());
$eoss->setIsIndividuel(true);
$date = new \Datetime();
$di = new \DateInterval('P7D');
$di->invert = true;
$date->add($di);
$eoss->setEndDate($date);
$form = $this->createForm(EnterpriseOptionSejourSessionType::class, $eoss, ['places' => false]);
$form->remove('endDate');
$form->remove('statut');
$form->add('submit', SubmitType::class, ['attr' => ['class' => 'submit bounce bounce_green mt1']]);
$form->handleRequest($request);
if ($form->isSubmitted() and $form->isValid()) {
$notif = new Notification();
$notif->setRole("ROLE_COMPTA");
$notif->setStatut(Notification::STATUT_OPEN);
$notif->setTitle('Nouvelle demande individuelle');
$notif->setSubtitle($eoss->getEnterprise()->getName());
$notif->setUrl('');
$em->persist($notif);
$em->persist($eoss);
$em->flush();
$this->addFlash('success', "Votre demande d'inscription a été enregistrée et sera étudiée prochainement. Vous recevrez un retour par mail.");
//$bus->dispatch(new SendNotificationMessage('demandeContact', '', $demandeContact->getId()));
return $this->redirectToRoute("espace_ce_general");
}
return $this->render('frontend/form.html.twig', [
'form' => $form->createView(),
'pageTitle' => 'Nouvelle demande individuelle Partenaire',
'message' => 'Pour un séjour de 2 semaines, veuillez effectuer une demande pour chaque semaine'
]);
}
/**
* @Route("recapitulatif-sejour/{id}",name="espace_ce_recapitulatif_sejour")
*/
public function recapitulatifSejour(EnterpriseOptionSejourSession $eoss, int $id)
{
$option = $eoss->findOneById($id);
return $this->render('espace-ce/recapitulatif-session.html.twig', ['option' => $option]);
}
}