<?php
namespace App\Controller\Convocations;
use App\Entity\Convocations;
use App\Entity\StagiairesReports;
use App\Form\Convocations\ConvocationGenerateFormType;
use App\Form\Convocations\ConvocationModifyFormType;
use App\Form\Convocations\ConvocationReponseFormType;
use App\Repository\ConvocationsEtatsRepository;
use App\Repository\ConvocationsRepository;
use App\Repository\FormationsRepository;
use App\Repository\StagiairesReportsRepository;
use App\Repository\StagiairesRepository;
use DateTime;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\String\Slugger\SluggerInterface;
use ZipArchive;
class ConvocationsController extends AbstractController
{
private string $ConvocPdfDirectory; //Chemin d'uplaod des fichiers PDF 'config/services.yaml'
public function __construct(string $ConvocPdfDirectory)
{
$this->ConvocPdfDirectory = $ConvocPdfDirectory;
}
/**
* @Route("/convocations/", name="convocations")
*/
public function index(ConvocationsRepository $convocationsRepository, FormationsRepository $formationsRepository, StagiairesRepository $stagiairesRepository): Response
{
$convocations = $convocationsRepository->findAll();
return $this->render('convocations/convocationsListing.html.twig', [
'convocations' => $convocations,
]);
}
/**
* @Route("/convocations/cycle/generer/{idFormation}", name="convocations_generate")
*/
public function generate($idFormation=null, Request $request, ManagerRegistry $doctrine, StagiairesRepository $stagiairesRepository, FormationsRepository $formationsRepository): Response
{
// $convocation = new Convocations();
$formulaire = $this->createForm(ConvocationGenerateFormType::class, null, ['idFormation' => $idFormation]);
$formulaire->handleRequest($request);
if($formulaire->isSubmitted()) {
// dd($formulaire);
$nbreStagiaires = $formulaire->getExtraData('extraData')['nbreStagiaires'];
$idFormation = $formulaire->get('formation')->getData()->getId();
$listeIdStagiaires= "";
for($x=0; $x<$nbreStagiaires; $x++) {
if(isset($formulaire->getExtraData('extraData')['stagiairesCheck'.$x]) && $formulaire->getExtraData('extraData')['stagiairesCheck'.$x]=='on') {
$convocation = new Convocations();
$convocation = $formulaire->getData();
$formation = $formationsRepository->find($idFormation);
$convocation->setFormation($formation);
$listeIdStagiaires .= $formulaire->getExtraData('extraData')['stagiaireId'.$x];
$stagiaire = $stagiairesRepository->find($formulaire->getExtraData('extraData')['stagiaireId'.$x]);
$convocation->setStagiaire($stagiaire);
//TRAITEMENT DE L'ETAT DU STAGIAIRE
if($formation->getBloc()->getNumBloc() == 1) {
$stagiaire->setEtat(5);
} else {
$stagiaire->setEtat(6);
}
$convocation->setEtat(1);
$dateCreation = new DateTime('NOW');
$dateCreation->format('Y-m-d H:i');
$convocation->setDateCreation($dateCreation);
$entityManager = $doctrine->getManager();
$entityManager->persist($convocation);
$entityManager->persist($stagiaire);
$entityManager->flush();
$entityManager->clear();
}
}
return $this->redirectToRoute('formations_show_convocations', ['idFormation' => $idFormation]);
}
return $this->render('convocations/convocationsGenerer.html.twig', [
'formulaire' => $formulaire->createView(),
'idFormation' => $idFormation
]);
}
/**
* @Route("/convocations/afficher/{idConvocation}", name="convocations_show")
*/
public function show(
$idConvocation,
SluggerInterface $slugger,
ConvocationsRepository $convocationsRepository,
ConvocationsEtatsRepository $convocationsEtatsRepository,
Request $request,
FormationsRepository $formationsRepository,
StagiairesReportsRepository $stagiairesReportsRepository,
StagiairesRepository $stagiairesRepository,
ManagerRegistry $doctrine): Response
{
$convocation = $convocationsRepository->find($idConvocation);
$stagiaire = $stagiairesRepository->find($convocation->getStagiaire()->getId());
$convocationEtat = $convocationsEtatsRepository->find($convocation->getEtat());
$formation = $formationsRepository->find($convocation->getFormation()->getId());
$numBloc = $convocation->getFormation()->getBloc()->getNumBloc();
//Vérification si un report d'une convocation existe pour le bloc de la formation
$report = $stagiairesReportsRepository->findBy([
'stagiaires' => $stagiaire,
'numBloc' => $numBloc
]);
$formulaireReponse = $this->createForm(ConvocationReponseFormType::class, $convocation);
$formulaireReponse->handleRequest($request);
if($formulaireReponse->isSubmitted()) {
$convocation = $formulaireReponse->getData();
$dateTraitementReponse = new DateTime('NOW');
$dateTraitementReponse->format('Y-m-d H:i');
$convocation->setDateTraitementReponse($dateTraitementReponse);
// Traitement de l'upload du bulletin réponse
$bulletin_reponse = $formulaireReponse->get('bulletinReponseScan')->getData();
if ($bulletin_reponse) {
if($convocation->getBulletinReponseScan()) {
$nomFichier = $this->getParameter('files_directory_convocation_bulletins_reponses').'/'.$convocation->getBulletinReponseScan();
if(file_exists($nomFichier)) {
unlink($nomFichier);
}
}
$originalFilename = pathinfo($bulletin_reponse->getClientOriginalName(), PATHINFO_FILENAME);
$safeFilename = $slugger->slug($originalFilename);
$newFilename = 'convocation_'.$idConvocation.'_bulletinReponse_'.uniqid().'.'.$bulletin_reponse->guessExtension();
$bulletin_reponse->move(
$this->getParameter('files_directory_convocation_bulletins_reponses'),
$newFilename
);
$convocation->setBulletinReponseScan($newFilename);
}
$entityManager = $doctrine->getManager();
$entityManager->persist($convocation);
$entityManager->flush();
// // $entityManager->clear();
return $this->redirectToRoute('convocations_show', ['idConvocation'=>$idConvocation]);
}
return $this->render('convocations/convocationsAfficher.html.twig', [
'convocation' => $convocation,
'convocationEtat' => $convocationEtat,
'formulaireReponse' => $formulaireReponse->createView(),
'cheminFichierUpload' => $this->getParameter('files_directory_convocation_bulletins_reponses'),
'formation' => $formation,
'report' => $report,
'nav' => '4'
]);
}
/**
* @Route("/convocations/modifier/{idConvocation}", name="convocations_modify")
*/
public function modify($idConvocation, Request $request, ConvocationsRepository $convocationsRepository, ManagerRegistry $doctrine): Response
{
$convocation = $convocationsRepository->find($idConvocation);
$formulaire = $this->createForm(ConvocationModifyFormType::class, $convocation);
$formulaire->handleRequest($request);
if($formulaire->isSubmitted()) {
$entityManager = $doctrine->getManager();
$entityManager->persist($convocation);
$entityManager->flush();
$entityManager->clear();
return $this->redirectToRoute('convocations_show', ['idConvocation'=>$idConvocation]);
}
return $this->render('convocations/convocationsModifier.html.twig', [
'formulaire' => $formulaire->createView(),
'convocation' => $convocation
]);
}
/**
* @Route("/convocations/supprimer/{idConvocation}", name="convocations_del")
*/
public function delete($idConvocation, Request $request, ConvocationsRepository $convocationsRepository, StagiairesRepository $stagiairesRepository, ManagerRegistry $doctrine): Response
{
$convocation = $convocationsRepository->find($idConvocation);
$idFormation = $convocation->getFormation()->getId();
$stagiaire = $stagiairesRepository->find($convocation->getStagiaire()->getId());
$entityManager = $doctrine->getManager();
if($convocation->getEtat() == 1) {
$entityManager->remove($convocation);
//TRAITEMENT DE L'ETAT DU STAGIAIRE
if($convocation->getFormation()->getBloc()->getNumBloc() == 1) {
$stagiaire->setEtat(3);
} else {
$stagiaire->setEtat(4);
}
$entityManager->persist($stagiaire);
$entityManager->flush();
}
return $this->redirectToRoute('formations_show_convocations', ['idFormation' => $idFormation]);
}
/**
* @Route("/convocations/cloturer/{idConvocation}", name="convocations_enclose")
*/
public function enclose($idConvocation, Request $request, ConvocationsRepository $convocationsRepository, StagiairesRepository $stagiairesRepository, StagiairesReportsRepository $stagiairesReportsRepository, FormationsRepository $formationsRepository, ManagerRegistry $doctrine): Response
{
$convocation = $convocationsRepository->find($idConvocation);
$stagiaire = $stagiairesRepository->find($convocation->getStagiaire()->getId());
$numBloc = $convocation->getFormation()->getBloc()->getNumBloc();
$report = $stagiairesReportsRepository->findBy([
'stagiaires' => $stagiaire,
'numBloc' => $numBloc
]);
$reponse = $convocation->getReponse()->getId();
if($reponse==2) { // S'engage > Maintient de l'inscription
$convocation->setEtat(2);
}
else if($reponse==1) { // Pas de réponse > contentieux
$convocation->setEtat(4);
}
else if($reponse>=3 && empty($report)) { // Pas de réponse > Reconvocation
$convocation->setEtat(3);
}
else if($reponse>=3 && !empty($report)) { // Pas de réponse > Contentieux
$convocation->setEtat(4);
}
$entityManager = $doctrine->getManager();
$entityManager->persist($convocation);
$entityManager->flush();
$entityManager->clear();
return $this->redirectToRoute('convocations_show', ['idConvocation' => $idConvocation]);
}
/**
* @Route("/convocations/rouvrir/{idConvocation}", name="convocations_reopen")
*/
public function reopen($idConvocation, Request $request, ConvocationsRepository $convocationsRepository, ManagerRegistry $doctrine): Response
{
$convocation = $convocationsRepository->find($idConvocation);
$convocation->setEtat(1);
$entityManager = $doctrine->getManager();
$entityManager->persist($convocation);
$entityManager->flush();
return $this->redirectToRoute('convocations_show', ['idConvocation' => $idConvocation]);
}
/**
* @Route("/convocations/PDF/afficher/{idConvocation}", name="convocations_PDF_show")
*/
public function convocationPDFShow($idConvocation, ConvocationsRepository $convocationsRepository): Response
{
$convocation = $convocationsRepository->find($idConvocation);
$idFormation = $convocation->getFormation()->getId();
$idStagiaire = $convocation->getStagiaire()->getId();
return new BinaryFileResponse(
$this->ConvocPdfDirectory . '/idFormation-' . $idFormation . '/convocationPDF-idStagiaire-' . $idStagiaire . '-idConvocation-' . $idConvocation . '.pdf'
);
}
/**
* @Route("/convocations/bulletinReponse/afficher/{idConvocation}", name="convocations_bulletinReponse_show")
*/
public function bulletinReponseShow($idConvocation, ConvocationsRepository $convocationsRepository): Response
{
$convocation = $convocationsRepository->find($idConvocation);
return new BinaryFileResponse(
$this->getParameter('files_directory_convocation_bulletins_reponses').'/'.$convocation->getBulletinReponseScan()
);
}
/**
* @Route("/convocations/bulletinReponse/supprimer/{idConvocation}", name="convocations_bulletinReponse_del")
*/
public function bulletinReponseDel($idConvocation, ConvocationsRepository $convocationsRepository, ManagerRegistry $doctrine): Response
{
$convocation = $convocationsRepository->find($idConvocation);
if($convocation->getBulletinReponseScan()) {
$nomFichier = $this->getParameter('files_directory_convocation_bulletins_reponses').'/'.$convocation->getBulletinReponseScan();
if(file_exists($nomFichier)) {
unlink($nomFichier);
}
}
$entityManager = $doctrine->getManager();
$convocation->setBulletinReponseScan('');
$entityManager->persist($convocation);
$entityManager->flush();
return $this->redirectToRoute('convocations_show', ['idConvocation' => $idConvocation]);
}
/**
* @Route("/convocations/cloturer/toutes/{idFormation}", name="convocations_close_all")
*/
public function convocationCloseAll($idFormation, ConvocationsRepository $convocationsRepository, FormationsRepository $formationsRepository, StagiairesReportsRepository $stagiairesReportsRepository, StagiairesRepository $stagiairesRepository, ManagerRegistry $doctrine): Response
{
$formation = $formationsRepository->find($idFormation);
$convocations = $convocationsRepository->findBy([
'formation' => $formation
]);
foreach($convocations as $convocation) {
$stagiaire = $stagiairesRepository->find($convocation->getStagiaire()->getId());
$convocationTemp = $convocationsRepository->find($convocation->getId());
$numBloc = $convocation->getFormation()->getBloc()->getNumBloc();
$report = $stagiairesReportsRepository->findBy([
'stagiaires' => $stagiaire,
'numBloc' => $numBloc
]);
$reponse = $convocationTemp->getReponse()->getId();
if($reponse==2) { // S'engage > Maintient de l'inscription
$convocationTemp->setEtat(2);
}
else if($reponse==1 || $reponse==10 || $reponse==11) { // Pas de réponse OU Ne souhaite plus exercer le métier et renonce à l'agrément ou Souhaite suspendre temporairement son agrément > contentieux
$convocationTemp->setEtat(4);
}
else if($reponse>=3 && empty($report)) { // Pas de réponse > Reconvocation
$convocationTemp->setEtat(3);
}
else if($reponse>=3 && !empty($report)) { // Pas de réponse > Contentieux
$convocationTemp->setEtat(4);
}
$entityManager = $doctrine->getManager();
$entityManager->persist($convocationTemp);
$entityManager->flush();
$entityManager->clear();
}
return $this->redirectToRoute('formations_show_convocations', ['idFormation' => $idFormation]);
}
/**
* @Route("/convocations/genererZip/{idFormation}", name="convocations_generer_zip")
*/
public function convocationGenererZip(
$idFormation,
FormationsRepository $formationsRepository,
StagiairesRepository $stagiairesRepository
): Response
{
$formation = $formationsRepository->find($idFormation);
$formationIntitule = $formation->getIntitule();
$formationIntitule = str_replace(' ', '-', $formationIntitule);
// GENERATION DU ZIP DES
$zip = new ZipArchive();
$zipName = $this->ConvocPdfDirectory.'idFormation-'.$idFormation.'/'.$formationIntitule.'_Convocations_Bilan.zip';
if(file_exists($zipName)) {
unlink($zipName);
}
$zip->open($zipName, ZipArchive::CREATE);
$fichiers = scandir($this->ConvocPdfDirectory.'idFormation-'.$idFormation.'/');
// CREER UN REPERTOIRE TEMP > RENOMMER LES FICHIERS
$filesystem = new Filesystem();
$filesystem->mkdir($this->ConvocPdfDirectory.'idFormation-'.$idFormation.'/temp');
foreach($fichiers as $fichier) {
$idStagiaire = '';
if($fichier !== "." && $fichier !== ".." && $fichier !== "temp") {
for($x=0; $x<4; $x++) {
$num = substr("$fichier", 27+$x, 1);
if( $num != '-') {
$idStagiaire .= $num;
}
}
$stagiaire = $stagiairesRepository->find(intval($idStagiaire));
$filesystem->copy($this->ConvocPdfDirectory.'idFormation-'.$idFormation.'/'.$fichier, $this->ConvocPdfDirectory.'idFormation-'.$idFormation.'/temp/convocationPDF_'.$formationIntitule.'_'.$stagiaire->getNom().'-'.$stagiaire->getPrenom().'.pdf');
$zip->addFile($this->ConvocPdfDirectory.'idFormation-'.$idFormation.'/temp/convocationPDF_'.$formationIntitule.'_'.$stagiaire->getNom().'-'.$stagiaire->getPrenom().'.pdf', $fichier);
}
}
$zip->close();
$filesystem->remove($this->ConvocPdfDirectory.'idFormation-'.$idFormation.'/temp');
return (new BinaryFileResponse(
$this->ConvocPdfDirectory.'idFormation-'.$idFormation.'/'.$formationIntitule.'_Convocations_Bilan.zip'
))->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $formationIntitule.'_Convocations_Bilan.zip');
}
}