<?php
namespace App\Controller;
use App\Repository\EvenementRepository;
use App\Repository\FactureCandidatRepository;
use App\Repository\FactureFormateurRepository;
use App\Repository\ModuleRepository;
use App\Repository\InscriptionRepository;
use App\Repository\SeanceRepository;
use App\Repository\UserRepository;
use App\Repository\CycleRepository;
use App\Repository\SessionRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use App\Entity\Inscription;
use App\Entity\InscriptionModule;
use App\Form\DemandeInscriptionType;
use App\Entity\FactureCandidat;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\String\Slugger\SluggerInterface;
use DateTime;
use Dompdf\Dompdf;
use Dompdf\Options;
use Symfony\Component\Mailer\MailerInterface;
use App\Factory\Email;
use App\Entity\User;
use App\Entity\Cycle;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class SiteController extends AbstractController
{
public function __construct(private UrlGeneratorInterface $urlGenerator, private MailerInterface $mailer, private Email $email)
{
}
#[Route('/', name: 'accueil_site')]
public function accueil(): Response
{
return $this->render('site/accueil.html.twig', [
]);
}
#[Route('/contact', name: 'contact_site')]
public function contact(): Response
{
return $this->render('site/contact.html.twig', []);
}
#[Route('/espace-etudiant', name: 'profil_site')]
public function profil(SeanceRepository $seanceRepository): Response
{
$user = $this->getUser();
$currentInscription = null;
$insciptionSession = 0;
foreach ($user->getInscriptions() as $inscription) {
if ($inscription->getSession()->getId() > $insciptionSession) {
$insciptionSession = $inscription->getSession()->getId();
$currentInscription = $inscription;
}
}
$seances = $seanceRepository->findByInscription($currentInscription);
$facture = null;
$factures = $currentInscription->getFactureCandidats();
if (count($factures) > 0) {
$facture = $factures[0];
}
if ($user && in_array('ROLE_CANDIDATE', $user->getRoles(), true)) {
return $this->render('site/profil.html.twig', [
'user' => $user,
'seances' => $seances,
'facture' => $facture
]);
} else {
return new RedirectResponse($this->urlGenerator->generate('accueil_site'));
}
}
#[Route('/nos-formations', name: 'formation_site')]
public function formations(): Response
{
return $this->render('site/formation.html.twig', []);
}
#[Route('/qui-sommes-nous', name: 'qui-sommes-nous_site')]
public function presentation(): Response
{
return $this->render('site/presentation.html.twig', []);
}
#[Route('/nos-evenements/{id}', name: 'details_evenement_site')]
public function evenement(Request $request, Evenementrepository $evenementrepository): Response
{
return $this->render('site/details-evenement.html.twig', [
'evenement' => $evenementrepository->find($request->attributes->get('id'))
]);
}
#[Route('/nos-evenements', name: 'evenements_site')]
public function evenements(Evenementrepository $evenementrepository): Response
{
return $this->render('site/evenements.html.twig', [
'evenements' => $evenementrepository->findBy([], ['id' => 'DESC'])
]);
}
#[Route('/releve', name: 'releve_note_site')]
public function bulletin(UserRepository $userRepository): Response
{
$user = $this->getUser();
$currentInscription = null;
$insciptionSession = 0;
foreach ($user->getInscriptions() as $inscription) {
if ($inscription->getSession()->getId() > $insciptionSession) {
$insciptionSession = $inscription->getSession()->getId();
$currentInscription = $inscription;
}
}
$inscriptionModules = $currentInscription->getInscriptionModules();
$moduleNotes = null;
$nbNotes = 0;
$somme = 0;
foreach ($inscriptionModules as $inscriptionModule) {
$formateur = $userRepository->findFormateurByModuleAndInscription($inscriptionModule->getModule()->getId(), $currentInscription);
$note[0] = $inscriptionModule->getModule()->getLibele();
$note[1] = $inscriptionModule->getNote();
$note[2] = "";
if ($formateur) {
$note[2] = $formateur->getNom() . " " . $formateur->getPrenom();
}
$moduleNotes[] = $note;
$somme += $note[1];
if ($note[1] != null && $note[1] != "")
$nbNotes++;
}
$moyenne = "--";
//if (count($inscriptionModules) == $nbNotes)
if ($nbNotes > 0)
$moyenne = $somme / $nbNotes;
$pdfOptions = new Options();
// Police par défaut
$pdfOptions->set('defaultFont', 'Arial');
$pdfOptions->setIsRemoteEnabled(true);
// On instancie Dompdf
$dompdf = new Dompdf($pdfOptions);
$context = stream_context_create([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
],
]);
$dompdf->setHttpContext($context);
$html = $this->renderView(
'inscription/releve-notes.html.twig',
[
'moduleNotes' => $moduleNotes,
'moyenne' => $moyenne,
'currentInscription' => $currentInscription
]
);
$dompdf->loadHtml($html);
$dompdf->setPaper('A3', 'portrait');
$dompdf->render();
// On génère un nom de fichier
$fichier = 'releve-des-notes-' . $currentInscription->getCandidat()->getNom() . '.pdf';
// On envoie le PDF au navigateur
return new Response($dompdf->output(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="' . $fichier . '"',
]);
}
#[Route('/attestation', name: 'app_attestation_inscription', methods: ['GET', 'POST'])]
public function indexmail(
Request $request,
InscriptionRepository $inscriptionRepository
): Response {
$candidat = $this->getUser();
$id = $candidat->getId();
$email = $candidat->getEmail();
$adresse = $candidat->getAdresse();
$zip = $candidat->getCodePostal();
$ville = $candidat->getVille();
$nom = $candidat->getNom();
$tel = $candidat->getTel();
$prenom = $candidat->getPrenom();
$dateNaissance = $candidat->getDateNaissance();
$currentInscription = null;
$insciptionSession = 0;
foreach ($candidat->getInscriptions() as $inscription) {
if ($inscription->getSession()->getId() > $insciptionSession) {
$insciptionSession = $inscription->getSession()->getId();
$currentInscription = $inscription;
}
}
$cycle = $currentInscription->getCycle()->getLibele();
$pdfOptions = new Options();
// Police par défaut
$pdfOptions->set('defaultFont', 'Arial');
$pdfOptions->setIsRemoteEnabled(true);
// On instancie Dompdf
$dompdf = new Dompdf($pdfOptions);
$context = stream_context_create([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
],
]);
$dompdf->setHttpContext($context);
$html = $this->renderView(
'inscription/attestationinscription.html.twig',
[
'email' => $email,
'adresse' => $adresse,
'zip' => $zip,
'ville' => $ville,
'nom' => $nom,
'prenom' => $prenom,
'tel' => $tel,
'id' => $id,
'session' => $insciptionSession,
'cycle' => $cycle,
'dateNaissance' => $dateNaissance
]
);
$dompdf->loadHtml($html);
$dompdf->setPaper('A3', 'portrait');
$dompdf->render();
// On génère un nom de fichier
$fichier = 'attestation-inscription-' . $prenom . '.pdf';
// On envoie le PDF au navigateur
return new Response($dompdf->output(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="' . $fichier . '"',
]);
}
#[Route('/telechargerfacture/{id}', name: 'app_facture_candidat_telecharger', methods: ['GET', 'POST'])]
public function telechargerFactureCandidat(
Request $request,
FactureCandidatRepository $factureCandidatRepository
): Response {
$id = $request->attributes->get('id');
$facture = $factureCandidatRepository->find($id);
$factureId = $facture->getId();
$candidat = $facture->getInscription()->getCandidat();
$cycle = $facture
->getInscription()
->getCycle()
->getLibele();
$session = $facture
->getInscription()
->getSession()
->getLibele();
$inscriptions = $facture->getInscription()->getInscriptionModules();
$email = $candidat->getEmail();
$adresse = $candidat->getAdresse();
$zip = $candidat->getCodePostal();
$ville = $candidat->getVille();
$nom = $candidat->getNom();
$tel = $candidat->getTel();
$prenom = $candidat->getPrenom();
$pdfOptions = new Options();
// Police par défaut
$pdfOptions->set('defaultFont', 'Arial');
$pdfOptions->setIsRemoteEnabled(true);
// On instancie Dompdf
$dompdf = new Dompdf($pdfOptions);
$context = stream_context_create([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
],
]);
$dompdf->setHttpContext($context);
$html = $this->renderView('facturemail/facturcandidatmail.html.twig', [
'factureId' => $factureId,
'facture' => $facture,
'email' => $email,
'adresse' => $adresse,
'zip' => $zip,
'ville' => $ville,
'nom' => $nom,
'prenom' => $prenom,
'tel' => $tel,
'cycle' => $cycle,
'session' => $session,
'inscriptions' => $inscriptions,
]);
// $html = $this->renderView(
// 'facturemail/facturcandidatretenu.html.twig',
// [
// 'factureId' => $factureId,
// 'email' => $email,
// 'adresse' => $adresse,
// 'zip' => $zip,
// 'ville' => $ville,
// 'nom' => $nom,
// 'prenom' => $prenom,
// 'tel' => $tel,
// 'cycle' => $cycle,
// 'session' => $session,
// 'inscriptions' => $inscriptions,
// ]
// );
$dompdf->loadHtml($html);
$dompdf->setPaper('letter', 'portrait');
$dompdf->render();
// On génère un nom de fichier
$fichier = 'facture-' . $prenom . '.pdf';
// On envoie le PDF au navigateur
return new Response($dompdf->output(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="' . $fichier . '"',
]);
}
#[Route('/sendContactMail', name: 'envoi_mail_contact_site', methods: ['GET', 'POST'])]
public function new(
Request $request,
): JsonResponse {
$TEMPLATE_CONTACT = 'site/email-contact.html.twig';
$parameters = [
'nom' => $request->request->get('nom'),
'sujet' => $request->request->get('sujet'),
'email' => $request->request->get('email'),
'telephone' => $request->request->get('telephone'),
'message' => $request->request->get('message'),
];
$email = $this->email->create(
'contact@iaa-tunisie.tn',
['helmi.mattoussi@gmail.com'],
'IAA - Contact',
$TEMPLATE_CONTACT,
$parameters
);
$res = $this->mailer->send($email);
return new JsonResponse(['response' => $res]);
}
#[Route('/demande-inscrption', name: 'demande_inscription_site', methods: ['GET', 'POST'])]
public function demande(
Request $request,
InscriptionRepository $inscriptionRepository,
ModuleRepository $moduleRepository,
FactureCandidatRepository $factureCandidatRepository,
UserPasswordHasherInterface $userPasswordHasher,
UserRepository $userRepository,
CycleRepository $cycleRepository,
SessionRepository $sessionRepository
): Response {
$factureCandidat = new FactureCandidat();
$candidat = new User();
$inscription = new Inscription();
$form = $this->createForm(DemandeInscriptionType::class, $inscription);
$form->handleRequest($request);
#dd($request->request->all());
if (1) {
$dateCreation = new DateTime();
$candidat->setNom($request->request->get('firstName'));
$candidat->setPrenom($request->request->get('lastName'));
$candidat->setEmail($request->request->get('username'));
$candidat->setUsername($request->request->get('username'));
$comb =
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$shfl = str_shuffle($comb);
$password = substr($shfl, 0, 8);
$candidat->setRoles(["ROLE_CANDIDATE"]);
$candidat->setPassword(
$userPasswordHasher->hashPassword($candidat, $password)
);
$cycle = $cycleRepository->find($request->request->get('cycle'));
$session = $sessionRepository->getSessionActive();
$inscription->setDateCreation($dateCreation);
$inscription->setCandidat($candidat);
$inscription->setCycle($cycle);
$inscription->setSession($session);
$factureCandidat->setEtatPaiement(0);
$factureCandidat->setInscription($inscription);
$factureCandidat->setDate($dateCreation);
$modules = $moduleRepository->findAll();
foreach ($modules as $module) {
$inscription->addInscriptionModule(
new InscriptionModule($module)
);
}
$userRepository->save($candidat, true);
$cycleRepository->save($cycle, true);
$inscriptionRepository->save($inscription, true);
$factureCandidatRepository->save($factureCandidat, true);
$candidate_template = 'site/email-demande-inscription-candidat.html.twig';
$parameters = [
'nom' => $request->request->get('firstName'),
'email' => $request->request->get('username'),
'prenom' => $request->request->get('lastName'),
'cycle' => $cycle->getLibele()
];
$email = $this->email->create(
'contact@iaa-tunisie.tn',
[$request->request->get('username')],
'IAA - Demande de pré-inscription',
$candidate_template,
$parameters
);
$res = $this->mailer->send($email);
$admin_template = 'site/email-demande-inscription-admin.html.twig';
$email = $this->email->create(
'contact@iaa-tunisie.tn',
['helmi.mattoussi@gmail.com'],
'IAA - Demande de pré-inscription',
$admin_template,
$parameters
);
$res = $this->mailer->send($email);
return $this->redirectToRoute(
'accueil_site',
[],
Response::HTTP_SEE_OTHER
);
}
}
}