<?php
namespace App\Controller\Visa;
use App\Entity\Visa\VisaBilans;
use App\Entity\User\User;
use App\Form\Visa\VisaContactEmail;
use App\Form\Visa\VisaLotBilan;
use App\Form\Visa\VisaProjetBilan;
use App\Form\Visa\VisaProjetsFormType;
use App\Entity\Visa\VisaProjets;
use App\Repository\Visa\VisaBilansRepository;
use App\Repository\Visa\VisaProjetsRepository;
use App\Form\Visa\VisaContactsType;
use App\Entity\Visa\VisaContacts;
use App\Repository\Visa\VisaContactsRepository;
use App\Entity\Visa\VisaExigences;
use App\Repository\Visa\VisaExigencesRepository;
use App\Entity\Visa\VisaJustificatifs;
use App\Repository\Visa\VisaJustificatifsRepository;
use DateInterval;
use App\DTO\UploadFichierDTO;
use App\Form\UploadFichierType;
use App\Service\Sanitize;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\Mailer;
use Symfony\Component\Mailer\Transport;
use Symfony\Component\Mailer\Transport\Transports;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\String\Slugger\SluggerInterface;
use PhpOffice;
use PhpOffice\PhpSpreadsheet\IOFactory;
use ZipArchive;
use ZipStream\Option\Archive;
use Stripe\Stripe;
class VisaController extends AbstractController
{
//Nombre de projets listés par page
const NB_INDEX = 20;
const MSG_DEMO = 'Non autorisé en mode démo';
#[Route(path: '/', name: 'index')]
public function index(
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
PaginatorInterface $thePaginator,
Session $session
) {
//démarrage session
$session->start();
$session->set("lastPage", "index");
if ($this->getUser() == null) {
$listProjetsBuilder[] = $visaProjetsRepo->find(1);
$listProjets = $thePaginator->paginate(
$listProjetsBuilder,
$theRequest->get('page', 1),
self::NB_INDEX
);
} else {
if (!$this->isGranted('ROLE_ADMIN')) {
$typeFormFilter = 'utilisateur';
// $idUser = $this->getUser()->getId();
$idUser = $this->getUser() ? $this->getUser()->getId() : null;;
} else {
$typeFormFilter = 'admin';
$idUser = null;
}
$listProjetsBuilder = $visaProjetsRepo->findAllIndexBuilder($idUser);
$listProjets = $thePaginator->paginate(
$listProjetsBuilder,
$theRequest->get('page', 1),
self::NB_INDEX
);
}
return $this->render('index.html.twig', [
'listProjets' => $listProjets
]);
}
#[Route(path: '/stripeCheckout', name: 'stripeCheckout')]
public function stripeCheckout() {
$stripeSecretKey = 'sk_test_51Oqe8aHLiE2EvO77DadYRAHrMCNQBMAShpYTps5GSd7Q9tge1AZ1XcDwYewCv4fuljnqFnovZMmvvR1z0DbuEhCp005wNC7H9C';
\Stripe\Stripe::setApiKey($stripeSecretKey);
header('Content-Type: application/json');
$YOUR_DOMAIN = 'http://localhost:8000';
$checkout_session = \Stripe\Checkout\Session::create([
'line_items' => [[
# Provide the exact Price ID (e.g. pr_1234) of the product you want to sell
'price' => 'price_1OqedGHLiE2EvO77A9acKMfR',
'quantity' => 1,
]],
'mode' => 'payment',
'success_url' => $YOUR_DOMAIN . '/success',
'cancel_url' => $YOUR_DOMAIN . '/cancel',
]);
return new \Symfony\Component\HttpFoundation\RedirectResponse($checkout_session->url);
}
#[Route(path: '/success', name: 'success')]
public function success() {
return $this->render('success.html.twig');
}
#[Route(path: '/cancel', name: 'cancel')]
public function cancel() {
return $this->render('cancel.html.twig');
}
#[Route(path: 'nouveauProjet', name: 'visa_nouveau_projet')]
public function visa_nouveau_projet(EntityManagerInterface $em, Request $req, Session $session, Security $security, SluggerInterface $slugger,)
{
//'Démarrage de session'
$session->start();
$session->set("lastPage", "visa_nouveau_projet");
$this->em = $em;
$this->user = $security->getUser();
//verif compte user
if ($this->user == null) {
return $this->redirectToRoute('user_security_login');
}
//création d'un nouvel object
$nouveau_projet = new VisaProjets();
$form = $this->createForm(VisaProjetsFormType::class, $nouveau_projet);
$form->handleRequest($req);
//Action si envoyé
if ($form->isSubmitted() && $form->isValid()) {
//ajout du compte user
if ($this->user != null) {
$nouveau_projet->setIdUser($this->user);
}
$nom = $nouveau_projet->getNomDuProjet();
// On donne un code au nom qui sera la page d'accès:
$nomNormalise = $slugger->slug($nom);
$nomTronque = substr($nomNormalise, 0, 40);
$numero = rand(100,999);
$code = $numero . "-" . $nomTronque;
$nouveau_projet->setCode($code);
$session->set("code", $code );
//on définit la date de création du projet :
// Créer un objet DateTimeInterface représentant la date du jour
$dateDuJour = new \DateTimeImmutable(); // Utilisation de DateTimeImmutable pour une meilleure immutabilité
// Récupérer la date au format MySQL
$nouveau_projet->setDateCreation($dateDuJour);
$dateFinPaiement = new \DateTimeImmutable();
$dateFinPaiement = $dateFinPaiement->modify('+31 days');
$nouveau_projet->setDateFinPaiement($dateFinPaiement);
$em->persist($nouveau_projet);
$em->flush();
return $this->redirectToRoute('index');
}
return $this->render('visa_nouveau_projet.html.twig', [
'form' => $form->createView()
]);
}
#[Route(path: '{code}/modifProjet', name: 'modifProjet')]
public function modifProjet(EntityManagerInterface $em, Request $req, Session $session,
Security $security, SluggerInterface $slugger,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo, $code)
{
//'Démarrage de session'
$session->start();
$session->set("lastPage", "modifProjet");
$this->em = $em;
$this->user = $security->getUser();
//verif compte user
if ($this->user == null) {
return $this->redirectToRoute('user_security_login');
}
//création d'un nouvel object
$projet = $visaProjetsRepo->findOneBy(array("code" => $code));
$form = $this->createForm(VisaProjetsFormType::class, $projet);
$form->handleRequest($req);
//Action si envoyé
if ($form->isSubmitted() && $form->isValid()) {
//ajout du compte user
if ($this->user != null) {
$projet->setIdUser($this->user);
}
$nom = $projet->getNomDuProjet();
$nomNormalise = $slugger->slug($nom);
$nomTronque = substr($nomNormalise, 0, 40);
$numero = rand(100,999);
$code = $numero . "-" . $nomTronque;
$projet->setCode($code);
$session->set("code", $code );
$em->persist($projet);
$em->flush();
return $this->redirectToRoute('index');
}
return $this->render('modifProjet.html.twig', [
'form' => $form->createView()
]);
}
#[Route(path: '{idProjet}/listeContacts', name: 'listeContacts', options: ['expose' => true])]
public function listeContacts(
VisaContactsRepository $visaContactsRepo,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
PaginatorInterface $thePaginator,
EntityManagerInterface $em,
Session $session,
Request $req,
SluggerInterface $slugger,
$idProjet
) {
//démarrage session
$session->start();
$session->set("lastPage", "listeContacts");
if (!$this->isGranted('ROLE_ADMIN')) {
$typeFormFilter = 'utilisateur';
// $idUser = $this->getUser()->getId();
$idUser = $this->getUser() ? $this->getUser()->getId() : null;;
} else {
$typeFormFilter = 'admin';
$idUser = null;
}
//création du formulaire de nouveau fichier
$nouveau_fichier = new UploadFichierDTO;
$form = $this->createForm(UploadFichierType::class, $nouveau_fichier);
$form->handleRequest($req);
//Action si envoyé
if ($form->isSubmitted() && $form->isValid()) {
$files = $form->get('fichier')->getData();
if ($files) {
foreach ($files as $file) {
$filename = $file->getClientOriginalName();
$originalFilename = pathinfo($filename, PATHINFO_FILENAME);
$safeFilename = $slugger->slug($originalFilename);
$newFilename = $safeFilename . '-' . uniqid() . '.' . $file->guessExtension();
$data = [];
// open the file
$f = fopen($file, 'r');
if ($f === false) {
die('Cannot open the file ' . $filename);
}
// read each line in CSV file at a time
while (($row = fgetcsv($f)) !== false) {
$data[] = $row;
}
// close the file
fclose($f);
$numeroLigne = 0;
foreach ($data as $ligne) {
if ($numeroLigne != 0) {
$colonneArray = explode(";", $ligne['0']);
$nouveau_contact = new \App\Entity\Visa\VisaContacts();
$nouveau_contact->setPrenom($colonneArray['1']);
$nouveau_contact->setNom($colonneArray['2']);
$nouveau_contact->setSociete($colonneArray['3']);
//ajout du compte user
if ($this->getUser() != null) {
$nouveau_contact->setIdUser($this->getUser());
}
//ajout de l'ID du projet
$projet = $visaProjetsRepo->find($idProjet);
$nouveau_contact->setIdProjet($projet);
$em->persist($nouveau_contact);
$em->flush();
}
$numeroLigne = $numeroLigne + 1;
}
}
}
return $this->redirectToRoute('listeContacts', ['idProjet' => $idProjet]);
}
$listContactsBuilder = $visaContactsRepo->findAllIndexBuilder($idProjet);
$listContacts = $thePaginator->paginate(
$listContactsBuilder,
$theRequest->get('page', 1),
self::NB_INDEX
);
return $this->render('listeContacts.html.twig', [
'listContacts' => $listContacts,
'idProjet' => $idProjet,
'form' => $form->createView()
]);
}
/**
* @param EntityManagerInterface $em
* @param Request $req
* @param Session $session
* @param Security $security
* @param $idProjet
* @param $idContact
* @param \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo
* @param VisaContactsRepository $visaContactsRepo
* @return Response
*/
#[Route(path: '{idProjet}/editContact/{idContact}', name: 'visa_edit_contact')]
public function visa_edit_contact(
EntityManagerInterface $em,
Request $req,
Session $session,
Security $security,
$idProjet,
$idContact,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
VisaContactsRepository $visaContactsRepo
) {
$session->start();
$session->set("lastPage", "visa_edit_contact");
$this->em = $em;
$this->user = $security->getUser();
//création d'un nouvel object
$contact = $visaContactsRepo->findOneBy(['id' => $idContact]);
$form = $this->createForm(\App\Form\Visa\VisaContactsType::class, $contact);
$form->handleRequest($req);
//Action si envoyé
if ($form->isSubmitted() && $form->isValid()) {
$em->persist($contact);
$em->flush();
return $this->redirectToRoute('listeContacts', ['idProjet' => $idProjet]);
}
$form->setData($contact);
return $this->render('visa_edit_contact.html.twig', [
'form' => $form->createView()
]);
}
#[Route(path: 'nouveauContact/{idProjet}', name: 'visa_nouveau_contact', options: ['expose' => true])]
public function visa_nouveau_contact(
EntityManagerInterface $em,
Request $req,
Session $session,
Security $security,
$idProjet,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo
) {
//'Démarrage de session'
$session->start();
$session->set("lastPage", "visa_nouveau_contact");
$this->em = $em;
$this->user = $security->getUser();
//création d'un nouvel object
$nouveau_contact = new \App\Entity\Visa\VisaContacts();
$form = $this->createForm(\App\Form\Visa\VisaContactsType::class, $nouveau_contact);
$form->handleRequest($req);
//Action si envoyé
if ($form->isSubmitted() && $form->isValid()) {
//ajout du compte user
if ($this->user != null) {
$nouveau_contact->setIdUser($this->user);
}
//ajout de l'ID du projet
$projet = $visaProjetsRepo->find($idProjet);
$nouveau_contact->setIdProjet($projet);
$em->persist($nouveau_contact);
$em->flush();
return $this->redirectToRoute('/listeContacts', ['idProjet' => $idProjet]);
}
return $this->render('visa_nouveau_contact.html.twig', [
'form' => $form->createView()
]);
}
#[Route(path: '{code}/listeExigences', name: 'listeExigences', options: ['expose' => true])]
public function listeExigences(
VisaExigencesRepository $visaExigencesRepo,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
PaginatorInterface $thePaginator,
EntityManagerInterface $em,
Session $session,
Request $req,
SluggerInterface $slugger,
$code
) {
//démarrage session
$session->start();
$session->set("lastPage", "listeExigences");
$session->set("code", "$code");
//De quel projet parle-t-on ?
$projet = $visaProjetsRepo->findOneBy(array("code" => $code));
$idProjet = $projet->getId();
if (!$this->isGranted('ROLE_ADMIN')) {
$typeFormFilter = 'utilisateur';
// $idUser = $this->getUser()->getId();
$idUser = $this->getUser() ? $this->getUser()->getId() : null;;
} else {
$typeFormFilter = 'admin';
$idUser = null;
}
//création du formulaire de nouveau fichier
$nouveau_fichier = new UploadFichierDTO;
$form = $this->createForm(UploadFichierType::class, $nouveau_fichier);
$form->handleRequest($req);
//Action si envoyé
if ($form->isSubmitted() && $form->isValid()) {
$files = $form->get('fichier')->getData();
if ($files) {
foreach ($files as $file) {
$sheetData = [];
//ouverture de la feuille Excel
$spreadsheet = IOFactory::load($file);
$sheetData = $spreadsheet->getActiveSheet()->toArray();
// //dump($sheetData);
$numeroLigne = 0;
foreach ($sheetData as $ligne) {
//dump($ligne);
if ($numeroLigne != 0 and $ligne['1'] != null ) {
$exigence = $visaExigencesRepo->findBy(array(
"idProjet" => $idProjet,
"numeroExigence" => $ligne['0']
));
if ($exigence) {
$nouvelleExigence = $exigence['0'];
} else {
$nouvelleExigence = new \App\Entity\Visa\VisaExigences();
}
//
//ajout du compte user
$nouvelleExigence->setIdUser($this->getUser());
//ajout de l'ID du projet
$projet = $visaProjetsRepo->find($idProjet);
$nouvelleExigence->setIdProjet($projet);
$nouvelleExigence->setNumeroExigence($ligne['0']);
$nouvelleExigence->setLot($ligne['1']);
$nouvelleExigence->setSousLot($ligne['2']);
$nouvelleExigence->setCibles($ligne['3']);
$nouvelleExigence->setElementsConcernes($ligne['4']);
$nouvelleExigence->setExigences($ligne['5']);
$nouvelleExigence->setCommentairesEntreprise($ligne['6']);
$nouvelleExigence->setCommentairesMOE($ligne['7']);
$nouvelleExigence->setLocalisation($ligne['8']);
$em->persist($nouvelleExigence);
$em->flush();
}
$numeroLigne = $numeroLigne + 1;
}
}
}
return $this->redirectToRoute('listeExigences', ['code' => $code]);
}
$listExigencesBuilder = $visaExigencesRepo->findAllIndexBuilder($idProjet);
$listExigences = $thePaginator->paginate(
$listExigencesBuilder,
$theRequest->get('page', 1),
self::NB_INDEX
);
//dump($listExigences);
return $this->render('listeExigences.html.twig', [
'listExigences' => $listExigences,
'idProjet' => $idProjet,
'projet' => $projet,
'form' => $form->createView()
]);
}
#[Route(path: 'p-{code}/', name: 'tri', options: ['expose' => true])]
public function tri(
VisaExigencesRepository $visaExigencesRepo,
VisaBilansRepository $visaBilansRepository,
MailerInterface $mailer,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
PaginatorInterface $thePaginator,
EntityManagerInterface $em,
Session $session,
Request $req,
SluggerInterface $slugger,
$code
) {
//démarrage session
$session->start();
$session->set("lastPage", "tri");
//$session->set("idProjet", "$idProjet");
$session->set("code", $code);
$projet = $visaProjetsRepo->findOneBy(array("code" => $code));
$idProjet = $projet->getId();
//le projet est en mode démo ?
$dateFinPaiement = $projet->getDateFinPaiement();
$dateActuelle = new \DateTime();
$dateDans31Jours = clone $dateActuelle;
$dateDans31Jours->modify('+31 days');
$diff = isset($dateFinPaiement) ? $dateActuelle->diff($projet->getDateFinPaiement()) : null;
$formattedInterval = $diff->format('%d');
if ($dateFinPaiement < $dateActuelle ){
$this->addFlash('success', 'Le projet est en mode démo');
}
if ($dateFinPaiement > $dateActuelle and $dateFinPaiement < $dateDans31Jours ){
$this->addFlash('success', 'Le projet passe en mode démo dans ' . $formattedInterval . ' jour(s).');
}
$VisaBilans = $visaBilansRepository->findBy([
'idProjet' => $idProjet,
]);
$listExigences = $visaExigencesRepo->findBy(array("idProjet" => $idProjet));
$lots = [];
/// Commence ici l'étude par lot
foreach ($listExigences as $exigence) {
$lots [] = $exigence->getLot();
}
$listeLots = [];
$lots = array_unique($lots);
sort($lots);
$formLots = [];
$loop = 0;
foreach ($lots as $index => $lot) {
$visaBilanItem = $visaBilansRepository->findOneBy([
'idProjet' => $idProjet,
'lot' => $lot
]);
if (!$visaBilanItem) {
$visaBilanItem = new VisaBilans();
$visaBilanItem->setIdProjet($projet);
$visaBilanItem->setLot($lot);
}
$formLots[++$loop] = $visaBilanItem;
}
$listeSousLots=[];
$nbJustificatifsTotal = 0;
$listExigencesTotal = $visaExigencesRepo->findBy(array("idProjet" => $idProjet));
foreach ($lots as $lot) {
$nbValides = 0;
$nbJustificatifs = 0;
$listExigences = $visaExigencesRepo->findBy(array("idProjet" => $idProjet, "lot" => $lot));
$sousLots = [];
foreach ($listExigences as $exigence) {
if ($exigence->getValidation()) {
$nbValides++;
}
if (count($exigence->getVisaJustificatifs())) {
$nbJustificatifs++;
$nbJustificatifsTotal++;
}
$sousLots [] = $exigence->getSousLot();
}
$sousLots = array_unique($sousLots);
$listeSousLots [$lot] = $sousLots;
$listeLots[] = [
'lot' => $lot,
'nbValides' => $nbValides,
'nbExigences' => count($listExigences),
'nbJustificatifs' => $nbJustificatifs,
'pourcentage' => round($nbValides / count($listExigences) * 100),
'sousLots' => $sousLots
];
}
$tauxJustifTotal = round($nbJustificatifsTotal / max(count($listExigencesTotal),1)*100);
//dump($nbJustificatifsTotal);
//dump($listExigences);
//////////////////////////////////////
/// Ici démarre l'étude par cible
//////////////////////////////////////
$projet = $visaProjetsRepo->find($idProjet);
$listExigences = $visaExigencesRepo->findBy(array("idProjet" => $idProjet));
$ciblesSeparees = [];
$ciblesRecomposees= [];
$listeCibles = [];
foreach ($listExigences as $exigence) {
$cibles = $exigence->getCibles();
$ciblesSeparees = explode(";",$cibles);
foreach ($ciblesSeparees as $cibleSeule){
$tableauNbExigenceParCible[$cibleSeule] = 0;
$tableauNbExigenceValideeParCible[$cibleSeule] = 0;
$tableauNbJustificatifParCible[$cibleSeule] = 0;
}
}
foreach ($listExigences as $exigence) {
$ListeIdExigencesParCible = [];
$cibles = $exigence->getCibles();
$idExigence = $exigence->getId();
$ciblesSeparees = explode(";", $cibles);
foreach ($ciblesSeparees as $cibleSeule) {
if ($cibleSeule == null) {
$cibleSeule = "Sans cible";
}
// Vérifie si la cible existe déjà dans le tableau
if (!isset($tableauIdExigencesParCible[$cibleSeule])) {
$tableauIdExigencesParCible[$cibleSeule] = []; // Initialise un tableau vide pour cette cible
}
// Ajoute l'ID d'exigence à la liste des ID pour cette cible
$tableauIdExigencesParCible[$cibleSeule][] = $idExigence;
$tableauNbExigenceParCible[$cibleSeule] = $tableauNbExigenceParCible[$cibleSeule] + 1;
if ($exigence->getValidation()) {
$tableauNbExigenceValideeParCible[$cibleSeule] = $tableauNbExigenceValideeParCible[$cibleSeule] + 1;
}
if (count($exigence->getVisaJustificatifs())) {
$tableauNbJustificatifParCible[$cibleSeule] = $tableauNbJustificatifParCible[$cibleSeule] + 1;
}
$listeCibles[$cibleSeule] = [
'cibles' => $cibleSeule,
'ciblePropre' => $slugger->slug($cibleSeule),
'idExigences' => $tableauIdExigencesParCible[$cibleSeule],
'nbValides' => $tableauNbExigenceValideeParCible[$cibleSeule],
'nbExigences' => $tableauNbExigenceParCible[$cibleSeule],
'nbJustificatifs' => $tableauNbJustificatifParCible[$cibleSeule],
'pourcentage' => round($tableauNbExigenceValideeParCible[$cibleSeule] / $tableauNbExigenceParCible[$cibleSeule] * 100)
];
}
}
$session->set("listeCibles", $listeCibles);
return $this->render('tri.html.twig', [
'lots' => $lots,
'listeLots' => $listeLots,
'listeCibles' => $listeCibles,
'ListeSouslots' => $listeSousLots,
'idProjet' => $idProjet,
'projet' => $projet,
'tauxJustifTotal' => $tauxJustifTotal,
'dateDans31Jours' => $dateDans31Jours,
'diff' => $diff
]);
}
#[Route(path: '{code}/publipostage', name: 'publipostage', options: ['expose' => true])]
public function publipostage(
VisaExigencesRepository $visaExigencesRepo,
VisaBilansRepository $visaBilansRepository,
MailerInterface $mailer,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
PaginatorInterface $thePaginator,
EntityManagerInterface $em,
Session $session,
Request $req,
SluggerInterface $slugger,
$code
) {
//démarrage session
$session->start();
$session->set("lastPage", "publipostage");
//$session->set("idProjet", "$idProjet");
$session->set("code", "$code");
$projet = $visaProjetsRepo->findOneBy(array("code" => $code));
$idProjet = $projet->getId();
$VisaBilans = $visaBilansRepository->findBy([
'idProjet' => $idProjet,
]);
$listExigences = $visaExigencesRepo->findBy(array("idProjet" => $idProjet));
$lots = [];
/// Commence ici l'étude par lot
foreach ($listExigences as $exigence) {
$lots [] = $exigence->getLot();
}
$listeLots = [];
$lots = array_unique($lots);
sort($lots);
$formLots = [];
$loop = 0;
foreach ($lots as $index => $lot) {
$visaBilanItem = $visaBilansRepository->findOneBy([
'idProjet' => $idProjet,
'lot' => $lot
]);
if (!$visaBilanItem) {
$visaBilanItem = new VisaBilans();
$visaBilanItem->setIdProjet($projet);
$visaBilanItem->setLot($lot);
}
$formLots[++$loop] = $visaBilanItem;
}
$formEmail = $this->createForm(VisaProjetBilan::class, ['lots' => $formLots], [
'idProjet' => $idProjet,
]);
$formEmail->handleRequest($req);
if ($formEmail->isSubmitted() && $formEmail->isValid()) {
$items = [];
$lots = $formEmail->get('lots')->getData();
foreach ($lots as $lotEmail) {
if ($lotEmail->getEmail() != null) {
$lotEmail->setIdProjet($projet);
$lotEmail->setCopieA($formEmail->get('copie_a')->getData());
$lotEmail->setRepondreA($this->getUser() ? $this->getUser()->getEmail() : null);
$lotEmail->setPreambule($formEmail->get('preambule')->getData());
$em->persist($lotEmail);
$em->flush();
$items[] = $lotEmail;
} else {
if ($lotEmail->getId()) {
$em->remove($lotEmail);
$em->flush();
}
}
}
/* @var VisaBilans $visaBilanItem */
if ($items && count($items)) {
foreach ($items as $visaBilanItem) {
if ($visaBilanItem->getEnvoiEmail()) {
$listExigences = $visaExigencesRepo->findBy(array(
"idProjet" => $idProjet,
"lot" => $visaBilanItem->getLot()
));
$from = $this->getUser() ? $this->getUser()->getEmail() : new Address($visaBilanItem->getEmail());
$to = new Address($visaBilanItem->getEmail());
$subject = "Liste des exigences pour le lot " . $visaBilanItem->getLot() . " du projet " . $projet->getNomDuProjet();
$email = (new TemplatedEmail());
$email->htmlTemplate('bilan.html.twig');
$email->textTemplate('bilan.text.twig');
$email->context([
'title' => $subject,
'preambule' => $visaBilanItem->getPreambule(),
'listExigences' => $listExigences,
'idProjet' => $idProjet,
]);
$email->from($from)
->to($to);
if (trim($visaBilanItem->getCopieA())) {
$email->cc($visaBilanItem->getCopieA());
}
if ($visaBilanItem->getRepondreA()) {
$email->replyTo($visaBilanItem->getRepondreA());
}
$email->getHeaders()
->addTextHeader('X-Priority', '1')
->addTextHeader('X-MSMail-Priority', 'High')
->addTextHeader('X-UIDL', md5(uniqid(time())));
$email->subject($subject);
try {
$mailer->send($email);
$this->addFlash('success', 'Le mail a bien été envoyé à ' . $visaBilanItem->getEmail());
} catch (TransportExceptionInterface $e) {
$this->addFlash('error', $e->getMessage());
}
}
}
}
// Redirection vers la page de tri
return $this->redirectToRoute('tri', ['code' => $code]);
}
$listeSousLots=[];
foreach ($lots as $lot) {
$nbValides = 0;
$nbJustificatifs = 0;
$listExigences = $visaExigencesRepo->findBy(array("idProjet" => $idProjet, "lot" => $lot));
$sousLots = [];
foreach ($listExigences as $exigence) {
if ($exigence->getValidation()) {
$nbValides++;
}
if (count($exigence->getVisaJustificatifs())) {
$nbJustificatifs++;
}
$sousLots [] = $exigence->getSousLot();
}
$sousLots = array_unique($sousLots);
$listeSousLots [$lot] = $sousLots;
$listeLots[] = [
'lot' => $lot,
'nbValides' => $nbValides,
'nbExigences' => count($listExigences),
'nbJustificatifs' => $nbJustificatifs,
'pourcentage' => round($nbValides / count($listExigences) * 100),
'sousLots' => $sousLots
];
}
return $this->render('publipostage.html.twig', [
'lots' => $lots,
'listeLots' => $listeLots,
'ListeSouslots' => $listeSousLots,
'formEmail' => $formEmail ? $formEmail->createView() : '',
// 'formLotsEmails' => $formLotsEmailsView,
'idProjet' => $idProjet,
'projet' => $projet
]);
}
#[Route(path: '{idProjet}/exigencedz/{idExigence}', name: 'exigencedz', options: ['expose' => true])]
public function exigencedz(
VisaExigencesRepository $visaExigencesRepo,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
PaginatorInterface $thePaginator,
EntityManagerInterface $em,
Session $session,
Request $req,
SluggerInterface $slugger,
$idProjet,
$idExigence
) {
//démarrage session
$session->start();
$session->set("lastPage", "lot");
if (!$this->isGranted('ROLE_ADMIN')) {
$typeFormFilter = 'utilisateur';
// $idUser = $this->getUser()->getId();
$idUser = $this->getUser() ? $this->getUser()->getId() : null;
} else {
$typeFormFilter = 'admin';
$idUser = null;
}
// On récupère l'objet Exigence
$exigence = $visaExigencesRepo->find($idExigence);
// On récupère le lot associé
$lot = $exigence->getLot();
//De quel projet parle-t-on ?
$projet = $visaProjetsRepo->find($idProjet);
//le projet est en mode démo ?
$dateFinPaiement = $projet->getDateFinPaiement();
$code = $projet->getCode();
$dateActuelle = new \DateTime();
if ($dateFinPaiement > $dateActuelle ){
//création du formulaire de nouveau fichier ////// => à transformer en plusieurs dropzones
$nouveau_fichier = new UploadFichierDTO;
$form = $this->createForm(UploadFichierType::class, $nouveau_fichier);
$form->handleRequest($req);
$file = $req->files->get('fichier');
if ($file) {
$filename = $file->getClientOriginalName();
$originalFilename = pathinfo($filename, PATHINFO_FILENAME);
$safeFilename = $slugger->slug($originalFilename);
$newFilename = $safeFilename . '-' . uniqid() . '.' . $file->guessExtension();
// Check if directory exists with $IdProjet at end
if (!is_dir('IMPORTSVISA/JUSTIFICATIFS/' . $idProjet)) {
mkdir('IMPORTSVISA/JUSTIFICATIFS/' . $idProjet, 0777, true);
}
$file->move('IMPORTSVISA/JUSTIFICATIFS/' . $idProjet, $newFilename);
$justif = new \App\Entity\Visa\VisaJustificatifs();
$justif->setNomDuFichier($newFilename);
$time = date('d/m/y H:i');
$justif->setDate($time);
$justif->setExigence($exigence);
$justif->setProjet($projet);
$em->persist($justif);
$em->flush();
}
$criteria = array("idProjet" => $idProjet, "lot" => $lot);
$listExigences = $visaExigencesRepo->findBy($criteria);
} else {
$this->addFlash('success', self::MSG_DEMO);
}
// return $this->redirectToRoute('lot', ['code' => $code, 'lot' => $lot]);
return $this->render('lot.html.twig', [
'listExigences' => $listExigences,
'idProjet' => $idProjet,
'form' => $form->createView(),
'code' => $code
]);
}
#[Route(path: '{idProjet}/lot/{lot}/email', name: 'emailLot', options: ['expose' => true])]
public function EmailLot(
MailerInterface $mailer,
VisaContactsRepository $visaContactsRepository,
VisaExigencesRepository $visaExigencesRepo,
VisaBilansRepository $visaBilansRepository,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
PaginatorInterface $thePaginator,
EntityManagerInterface $em,
Session $session,
Request $req,
SluggerInterface $slugger,
$idProjet,
$lot
) {
$session->start();
$session->set("lastPage", "lot");
if (!$this->isGranted('ROLE_ADMIN')) {
$typeFormFilter = 'utilisateur';
$idUser = $this->getUser() ? $this->getUser()->getId() : null;;
} else {
$typeFormFilter = 'admin';
$idUser = null;
}
//De quel projet parle-t-on ?
$projet = $visaProjetsRepo->find($idProjet);
$criteria = ['idProjet' => $idProjet, 'Lot' => $lot];
/** @var VisaContacts $VisaContactUser */
$VisaContactUser = $visaContactsRepository->findOneBy($criteria);
$criteria = array("idProjet" => $idProjet, "lot" => $lot);
$listExigences = $visaExigencesRepo->findBy($criteria);
$formEmail = $this->createForm(VisaLotBilan::class, null, [
'idProjet' => $idProjet,
'lot' => $lot
]);
$formEmail->handleRequest($req);
if ($formEmail->isSubmitted() && $formEmail->isValid()) {
$from = new Address($formEmail->get('email')->getData());
$to = new Address($formEmail->get('email')->getData());
$subject = "Liste des exigences pour le lot " . $lot . " du projet " . $projet->getNomDuProjet();
$email = (new TemplatedEmail());
$email->htmlTemplate('bilan.html.twig');
$email->textTemplate('bilan.text.twig');
$email->context([
'title' => $subject,
'preambule' => $formEmail->get('preambule')->getData(),
'listExigences' => $listExigences,
'idProjet' => $idProjet,
]);
// $message = $this->renderView('bilan.html.twig', [
// 'title' => $subject,
// 'preambule' => $formEmail->get('preambule')->getData(),
// 'listExigences' => $listExigences,
// 'idProjet' => $idProjet,
// ]);
// $email = (new Email())
$email->from($from)
->to($to);
if (trim($formEmail->get('copie_a')->getData())) {
$email->cc($formEmail->get('copie_a')->getData());
}
if ($formEmail->get('repondre_a')->getData()) {
$email->replyTo($formEmail->get('repondre_a')->getData());
}
$email->getHeaders()
->addTextHeader('X-Priority', '1')
->addTextHeader('X-MSMail-Priority', 'High')
->addTextHeader('X-UIDL', md5(uniqid(time())));
$email->subject($subject);
// $email->html($message);
try {
$mailer->send($email);
$this->addFlash('success', 'Le mail a bien été envoyé');
// Mise à jour des données VisaBilans
$VisaBilans = $visaBilansRepository->findOneBy(['idProjet' => $idProjet, 'lot' => $lot]);
if (!$VisaBilans) {
$VisaBilans = new VisaBilans();
$VisaBilans->setIdProjet($projet);
$VisaBilans->setLot($lot);
}
$VisaBilans->setEmail($formEmail->get('email')->getData());
$VisaBilans->setRappel($formEmail->get('rappel')->getData());
$VisaBilans->setCopieA($formEmail->get('copie_a')->getData());
$VisaBilans->setRepondreA($formEmail->get('repondre_a')->getData());
$VisaBilans->setPreambule($formEmail->get('preambule')->getData());
$em->persist($VisaBilans);
$em->flush();
} catch (TransportExceptionInterface $e) {
$this->addFlash('error', $e->getMessage());
}
} else {
// Si le formulaire n'est pas soumis ou n'est pas valide, on retourne un message d'erreur
$this->addFlash('error', 'Une erreur est survenue de la saisie des informations');
if ($formEmail->getErrors(true)->count() > 0) {
foreach ($formEmail->getErrors(true) as $error) {
$this->addFlash('error', $error->getMessage());
}
}
}
return $this->redirectToRoute('lot', ['idProjet' => $idProjet, 'lot' => $lot]);
}
#[Route(path: '{code}/lot-{lot}', name: 'lot', options: ['expose' => true])]
public function lot(
VisaContactsRepository $visaContactsRepository,
VisaBilansRepository $visaBilansRepository,
VisaExigencesRepository $visaExigencesRepo,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
PaginatorInterface $thePaginator,
EntityManagerInterface $em,
Session $session,
Request $req,
SluggerInterface $slugger,
$code,
$lot
) {
//démarrage session
$session->start();
$session->set("lastPage", "lot");
$session->set("code", "$code");
$session->set("lot", "$lot");
if (!$this->isGranted('ROLE_ADMIN')) {
$typeFormFilter = 'utilisateur';
// $idUser = $this->getUser()->getId();
$user = $this->getUser();
$idUser = $user ? $user->getId() : null;
// $idUser = $this->getUser()->getId();
} else {
$typeFormFilter = 'admin';
$idUser = null;
}
//De quel projet parle-t-on ?
$projet = $visaProjetsRepo->findOneBy(array("code" => $code));
$idProjet = $projet->getId();
$criteria = ['idProjet' => $idProjet, 'Lot' => $lot];
/** @var VisaContacts $VisaContactUser */
$VisaContactUser = $visaContactsRepository->findOneBy($criteria);
//création du formulaire de nouveau fichier ////// => à transformer en plusieurs dropzones
$nouveau_fichier = new UploadFichierDTO;
$form = $this->createForm(UploadFichierType::class, $nouveau_fichier);
$form->handleRequest($req);
$exigence = $visaExigencesRepo->find(229); /////// à changer : l'id de l'exigence doit être variable en fonction de là où on drope
$criteria = array("idProjet" => $idProjet, "lot" => $lot);
$listExigences = $visaExigencesRepo->findBy($criteria);
$VisaBilans = $visaBilansRepository->findOneBy([
'idProjet' => $idProjet,
'lot' => $lot
]);
$formEmail = $this->createForm(VisaLotBilan::class, $VisaBilans,
[
'action' => $this->generateUrl('emailLot', ['idProjet' => $idProjet, 'lot' => $lot]),
'idProjet' => $idProjet,
'lot' => $lot
]);
//Action si envoyé
if ($form->isSubmitted() && $form->isValid()) {
$files = $form->get('fichier')->getData();
if ($files) {
foreach ($files as $file) {
$filename = $file->getClientOriginalName();
$originalFilename = pathinfo($filename, PATHINFO_FILENAME);
$safeFilename = $slugger->slug($originalFilename);
$newFilename = $safeFilename . '-' . uniqid() . '.' . $file->guessExtension();
// Check if directory exists with $IdProjet at end
if (!is_dir('IMPORTSVISA/JUSTIFICATIFS/' . $idProjet)) {
mkdir('IMPORTSVISA/JUSTIFICATIFS/' . $idProjet, 0777, true);
}
$file->move('IMPORTSVISA/JUSTIFICATIFS/' . $idProjet, $newFilename);
$justif = new \App\Entity\Visa\VisaJustificatifs();
$justif->setNomDuFichier($newFilename);
$time = date('d/m/y H:i');
$justif->setDate($time);
$justif->setExigence($exigence);
$justif->setProjet($projet);
$em->persist($justif);
$em->flush();
}
}
}
//Définition des sous lots pour affichage
$listExigences = $visaExigencesRepo->findBy(array("idProjet" => $idProjet, "lot" => $lot));
$sousLots = [];
foreach ($listExigences as $exigence) {
$sousLots [] = $exigence->getSousLot();
}
$sousLots = array_unique($sousLots);
$listeSousLots [$lot] = $sousLots;
////dump($listeSousLots);
return $this->render('lot.html.twig', [
'listExigences' => $listExigences,
'idProjet' => $idProjet,
'lot' => $lot,
'contact' => $VisaContactUser,
'formEmail' => $formEmail ? $formEmail->createView() : '',
'form' => $form->createView(),
'projet' => $projet,
'listeSousLots' => $listeSousLots
]);
}
#[Route(path: '{code}/cible-{ciblePropre}', name: 'cible', options: ['expose' => true])]
public function cible(
VisaContactsRepository $visaContactsRepository,
VisaBilansRepository $visaBilansRepository,
VisaExigencesRepository $visaExigencesRepo,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
PaginatorInterface $thePaginator,
EntityManagerInterface $em,
Session $session,
Request $req,
SluggerInterface $slugger,
$code,
$ciblePropre
) {
//démarrage session
$session->start();
$session->set("lastPage", "cible");
$listeCibles = $session->get("listeCibles");
//De quel projet parle-t-on ?
$projet = $visaProjetsRepo->findOneBy(array("code" => $code));
$idProjet = $projet->getId();
foreach ($listeCibles as $cible){
if ($cible["ciblePropre"] == $ciblePropre){
$listeIdExigences = $cible["idExigences"];
$nomCible = $cible["cibles"];
}
}
foreach ($listeIdExigences as $idExigence){
$listExigences[] = $visaExigencesRepo->find($idExigence);
}
return $this->render('cible.html.twig', [
'listExigences' => $listExigences,
'idProjet' => $idProjet,
'nomCible' => $nomCible,
'code' => $code,
'cible' => $cible,
]);
}
#[Route(path: 'nonValides/{code}', name: 'nonValides', options: ['expose' => true])]
public function nonValides(
VisaExigencesRepository $visaExigencesRepo,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
PaginatorInterface $thePaginator,
EntityManagerInterface $em,
Session $session,
Request $req,
SluggerInterface $slugger,
$code
) {
//démarrage session
$session->start();
$session->set("lastPage", "cible");
//De quel projet parle-t-on ?
$projet = $visaProjetsRepo->findOneBy(array("code" => $code));
$idProjet = $projet->getId();
$arrayCriteres = ["idProjet" => $idProjet, "validation" => null];
$listExigences[] = $visaExigencesRepo->findBy($arrayCriteres);
return $this->render('nonValides.html.twig', [
'listExigences' => $listExigences,
'idProjet' => $idProjet,
'code' => $code
]);
}
#[Route(path: '{code}/exigence-{exigence}', name: 'exigence', options: ['expose' => true])]
public function exigence(
VisaExigencesRepository $visaExigencesRepo,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
PaginatorInterface $thePaginator,
EntityManagerInterface $em,
VisaJustificatifsRepository $visaJustificatifsRepo,
Session $session,
Request $req,
SluggerInterface $slugger,
$code,
$exigence
) {
//démarrage session
$session->start();
$session->set("lastPage", "import");
if (!$this->isGranted('ROLE_ADMIN')) {
$typeFormFilter = 'utilisateur';
// $idUser = $this->getUser()->getId();
$idUser = $this->getUser() ? $this->getUser()->getId() : null;
} else {
$typeFormFilter = 'admin';
$idUser = null;
}
//De quel projet parle-t-on ?
$projet = $visaProjetsRepo->findOneBy(array("code" => $code));
$idProjet = $projet->getId();
//De quelle exigence parle-t-on ?
$exigence = $visaExigencesRepo->find($exigence);
//formulaire de modification de l'exigence
$form = $this->createForm(\App\Form\Visa\VisaExigencesType::class, $exigence);
$form->handleRequest($req);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$projet = $visaProjetsRepo->find($idProjet);
//le projet est en mode démo ?
$dateFinPaiement = $projet->getDateFinPaiement();
$code = $projet->getCode();
$dateActuelle = new \DateTime();
if ($dateFinPaiement < $dateActuelle ){
$this->addFlash('success', self::MSG_DEMO);
return $this->redirectToRoute('tri', ['code' => $code]);
}
$em->persist($exigence);
$em->flush();
}
}
//formulaire de modification du commentaire entreprise
$formEntreprise = $this->createForm(\App\Form\Visa\VisaCommentaireEntrepriseType::class, $exigence);
$formEntreprise->handleRequest($req);
if ($formEntreprise->isSubmitted()) {
if ($formEntreprise->isValid()) {
$projet = $visaProjetsRepo->find($idProjet);
//le projet est en mode démo ?
$dateFinPaiement = $projet->getDateFinPaiement();
$code = $projet->getCode();
$dateActuelle = new \DateTime();
if ($dateFinPaiement < $dateActuelle ){
$this->addFlash('success', self::MSG_DEMO);
return $this->redirectToRoute('tri', ['code' => $code]);
}
$em->persist($exigence);
$em->flush();
}
}
$criteria = array("exigence" => $exigence);
$listJustificatifs = $visaJustificatifsRepo->findBy($criteria);
return $this->render('exigence.html.twig', [
'exigence' => $exigence,
'listJustificatifs' => $listJustificatifs,
'projet' => $projet,
'idProjet' => $idProjet,
'form' => $form->createView(),
'formEntreprise' => $formEntreprise->createView()
]);
}
#[Route(path: '{code}/nouvelleExigence', name: 'nouvelleExigence', options: ['expose' => true])]
public function nouvelleExigence(
VisaExigencesRepository $visaExigencesRepo,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
EntityManagerInterface $em,
Session $session,
Request $req,
SluggerInterface $slugger,
$code
) {
//démarrage session
$session->start();
//$session->set("lastPage", "nouvelleExigence");
if (!$this->isGranted('ROLE_ADMIN')) {
$typeFormFilter = 'utilisateur';
// $idUser = $this->getUser()->getId();
$idUser = $this->getUser() ? $this->getUser()->getId() : null;
} else {
$typeFormFilter = 'admin';
$idUser = null;
}
//De quel projet parle-t-on ?
$projet = $visaProjetsRepo->findOneBy(array("code" => $code));
$idProjet = $projet->getId();
//le projet est en mode démo ?
$dateFinPaiement = $projet->getDateFinPaiement();
$dateActuelle = new \DateTime();
$dateDans31Jours = clone $dateActuelle;
$dateDans31Jours->modify('+31 days');
$diff = isset($dateFinPaiement) ? $dateActuelle->diff($projet->getDateFinPaiement()) : null;
$user = $idUser ? $this->getDoctrine()->getRepository(User::class)->find($idUser) : null;
//formulaire de modification de l'exigence
$nouvelleExigence = new VisaExigences();
$lastPage = $session->get('lastPage');
if ($lastPage == 'lot') {
$form = $this->createForm(\App\Form\Visa\VisaNouvelleExigenceAvecLotType::class, $nouvelleExigence);
$lot = $session->get('lot');
$nouvelleExigence->setLot($lot);
} else {
$form = $this->createForm(\App\Form\Visa\VisaNouvelleExigenceType::class, $nouvelleExigence);
}
$form->handleRequest($req);
if ($form->isSubmitted() and $dateFinPaiement > date()) {
if ($form->isValid()) {
$numeroExigence = $visaExigencesRepo->findMaxNumeroExigenceByProjet($projet) + 1;
$nouvelleExigence->setIdUser($user);
$nouvelleExigence->setIdProjet($projet);
$nouvelleExigence->setNumeroExigence($numeroExigence);
$em->persist($nouvelleExigence);
$em->flush();
}
if ($lastPage == 'lot'){
return $this->redirectToRoute('lot', ['code' => $code, 'lot' => $lot]);
} else {
return $this->redirectToRoute('tri', ['code' => $code]);
}
}
return $this->render('nouvelleExigence.html.twig', [
'nouvelleExigence' => $nouvelleExigence,
'idProjet' => $idProjet,
'projet' => $projet,
'code' => $code,
'form' => $form->createView(),
'dateDans31Jours' => $dateDans31Jours,
'diff' => $diff
]);
}
#[Route(path: 'suppExigence/{idProjet}/lot/{idLot}/{idExigence}', name: 'exigenceSupp', options: ['expose' => true])]
public function exigenceSupp(
VisaExigencesRepository $visaExigencesRepo,
EntityManagerInterface $em,
VisaProjetsRepository $visaProjetsRepo,
$idProjet,
$idLot,
$idExigence
) {
$projet = $visaProjetsRepo->find($idProjet);
//le projet est en mode démo ?
$dateFinPaiement = $projet->getDateFinPaiement();
$code = $projet->getCode();
$dateActuelle = new \DateTime();
if ($dateFinPaiement < $dateActuelle ){
$this->addFlash('success', self::MSG_DEMO);
return $this->redirectToRoute('tri', ['code' => $code]);
}
$exigence = $visaExigencesRepo->find($idExigence);
$em->remove($exigence);
$em->flush();
return $this->redirectToRoute('lot', ['idProjet' => $idProjet, 'lot' => $idLot]);
}
#[Route(path: '{idProjet}/lot/{idLot}/fichier/{idFichier}', name: 'fichierLot', options: ['expose' => true])]
public function fichierLot(
VisaExigencesRepository $visaExigencesRepo,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
PaginatorInterface $thePaginator,
EntityManagerInterface $em,
VisaJustificatifsRepository $visaJustificatifsRepo,
Session $session,
Request $req,
SluggerInterface $slugger,
$idProjet,
$idLot,
$idFichier
) {
$session->start();
$session->set("lastPage", "lot");
if (!$this->isGranted('ROLE_ADMIN')) {
$typeFormFilter = 'utilisateur';
// $idUser = $this->getUser()->getId();
$idUser = $this->getUser() ? $this->getUser()->getId() : null;
} else {
$typeFormFilter = 'admin';
$idUser = null;
}
$projet = $visaProjetsRepo->find($idProjet);
//le projet est en mode démo ?
$dateFinPaiement = $projet->getDateFinPaiement();
$code = $projet->getCode();
$dateActuelle = new \DateTime();
if ($dateFinPaiement > $dateActuelle ){
$fichier = $visaJustificatifsRepo->find($idFichier);
if ($fichier && $fichier->getId()) {
// Pour compatibilité avec les anciens fichiers
if (file_exists('IMPORTSVISA/JUSTIFICATIFS/' . $fichier->getNomDuFichier())) {
return $this->file('IMPORTSVISA/JUSTIFICATIFS/' . $fichier->getNomDuFichier());
} elseif (file_exists('IMPORTSVISA/JUSTIFICATIFS/' . $projet->getId() . '/' . $fichier->getNomDuFichier())) {
return $this->file('IMPORTSVISA/JUSTIFICATIFS/' . $projet->getId() . '/' . $fichier->getNomDuFichier());
}
}
throw $this->createNotFoundException('Fichier inexistant');
} else {
$this->addFlash('success', self::MSG_DEMO);
return $this->redirectToRoute('tri', ['code' => $code]);
}
}
#[Route(path: '{idProjet}/lot/{idLot}/fichierSupp/{idFichier}/{idExigence}', name: 'fichierSupp', options: ['expose' => true])]
public function fichierSupp(
VisaExigencesRepository $visaExigencesRepo,
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
EntityManagerInterface $em,
VisaJustificatifsRepository $visaJustificatifsRepo,
Session $session,
Request $req,
SluggerInterface $slugger,
$idProjet,
$idLot,
$idFichier,
$idExigence
) {
$projet = $visaProjetsRepo->find($idProjet);
//le projet est en mode démo ?
$dateFinPaiement = $projet->getDateFinPaiement();
$code = $projet->getCode();
$dateActuelle = new \DateTime();
if ($dateFinPaiement > $dateActuelle ){
$fichier = $visaJustificatifsRepo->find($idFichier);
$em->remove($fichier);
$em->flush();
} else {
$this->addFlash('success', self::MSG_DEMO);
}
return $this->redirectToRoute('exigence', ['code' => $code, 'exigence' => $idExigence]);
}
#[Route(path: '{idProjet}/download', name: 'projetZip', options: ['expose' => true])]
public function projetDownloadZipFiles(
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
VisaJustificatifsRepository $visaJustificatifsRepo,
$idProjet
) {
$projet = $visaProjetsRepo->find($idProjet);
//le projet est en mode démo ?
$dateFinPaiement = $projet->getDateFinPaiement();
$code = $projet->getCode();
$dateActuelle = new \DateTime();
if ($dateFinPaiement < $dateActuelle ){
$this->addFlash('success', self::MSG_DEMO);
return $this->redirectToRoute('tri', ['code' => $code]);
}
$zip = new ZipArchive();
// sanitize projet name
$filename = '../var/projet_' . Sanitize::sanitize_file_name($projet->getNomDuProjet()) . '.zip';
$zip->open($filename, ZipArchive::CREATE | ZipArchive::OVERWRITE);
// get all VisaJustificatifs for this projet
$justificatifs = $visaJustificatifsRepo->findBy(['projet' => $projet]);
foreach ($justificatifs as $justificatif) {
$exigence = $justificatif->getExigence();
$lot = Sanitize::sanitize_file_name($exigence->getLot());
// Pour compatibilité avec les anciens fichiers
if (file_exists('IMPORTSVISA/JUSTIFICATIFS/' . $justificatif->getNomDuFichier())) {
$zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' . $justificatif->getNomDuFichier(),
$lot . '/' . $justificatif->getNomDuFichier());
} elseif (file_exists('IMPORTSVISA/JUSTIFICATIFS/' . $projet->getId() . '/' . $justificatif->getNomDuFichier())) {
$zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' . $projet->getId() . '/' . $justificatif->getNomDuFichier(),
$lot . '/' . $justificatif->getNomDuFichier());
}
}
// Zip archive will be created only after closing object
$zip->close();
return $this->file($filename);
}
#[Route(path: '{idProjet}/cibledownload', name: 'projetZipCicle', options: ['expose' => true])]
public function projetDownloadZipFilesByCible(
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
VisaJustificatifsRepository $visaJustificatifsRepo,
VisaExigencesRepository $visaExigencesRepo,
$idProjet
) {
$projet = $visaProjetsRepo->find($idProjet);
//le projet est en mode démo ?
$dateFinPaiement = $projet->getDateFinPaiement();
$code = $projet->getCode();
$dateActuelle = new \DateTime();
if ($dateFinPaiement < $dateActuelle ){
$this->addFlash('success', self::MSG_DEMO);
return $this->redirectToRoute('tri', ['code' => $code]);
}
$zip = new ZipArchive();
// sanitize projet name
$filename = '../var/projet_' . Sanitize::sanitize_file_name($projet->getNomDuProjet()) . '.zip';
// $criteria = array("idProjet" => $idProjet);
// $listExigences = $visaExigencesRepo->findBy($criteria);
// $listCibles = [];
// foreach ($listExigences as $exigence) {
// $cibles = explode(',',$exigence->getCibles());
// if($cibles) {
// $cibles=array_filter(array_map(function($e) {return trim($e);},$cibles));
// }
// if($cibles) {
// foreach($cibles as $cible) {
// if(!isset($listCibles[$cible])) $listCibles[$cible]=[];
// $listCibles[$cible][]= $exigence;
// }
// }
// }
$zip->open($filename, ZipArchive::CREATE | ZipArchive::OVERWRITE);
// foreach($listCibles as $cible => $exigences) {
// $lots = [];
// }
//
$exigences =
// get all VisaJustificatifs for this projet
$justificatifs = $visaJustificatifsRepo->findBy(['projet' => $projet]);
foreach ($justificatifs as $justificatif) {
$exigence = $justificatif->getExigence();
$lot = Sanitize::sanitize_file_name($exigence->getLot());
$cibles = explode(',', $exigence->getCibles());
if ($cibles) {
$cibles = array_filter(array_map(function ($e) {
return trim($e);
}, $cibles));
}
// Pour compatibilité avec les anciens fichiers
if (file_exists('IMPORTSVISA/JUSTIFICATIFS/' . $justificatif->getNomDuFichier())) {
if ($cibles) {
foreach ($cibles as $cible) {
$cible = Sanitize::sanitize_file_name($cible);
$zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' . $justificatif->getNomDuFichier(),
$cible . '/lot-' . $lot . '/' . $justificatif->getNomDuFichier());
}
} else {
$zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' . $justificatif->getNomDuFichier(),
'SANS-CIBLE/lot-' . $lot . '/' . $justificatif->getNomDuFichier());
}
} elseif (file_exists('IMPORTSVISA/JUSTIFICATIFS/' . $projet->getId() . '/' . $justificatif->getNomDuFichier())) {
if ($cibles) {
foreach ($cibles as $cible) {
$cible = Sanitize::sanitize_file_name($cible);
$zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' . $projet->getId() . '/' . $justificatif->getNomDuFichier(),
$cible . '/lot-' . $lot . '/' . $justificatif->getNomDuFichier());
}
} else {
$zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' . $projet->getId() . '/' . $justificatif->getNomDuFichier(),
'SANS-CIBLE/lot-' . $lot . '/' . $justificatif->getNomDuFichier());
}
}
}
// Zip archive will be created only after closing object
$zip->close();
return $this->file($filename);
}
#[Route(path: '{idProjet}/lot/{lot}/download', name: 'lotZip', options: ['expose' => true])]
public function lotDownloadZipFiles(
VisaProjetsRepository $visaProjetsRepo,
VisaJustificatifsRepository $visaJustificatifsRepo,
VisaExigencesRepository $visaExigencesRepo,
$idProjet,
$lot
) {
//dump($idProjet);
$projet = $visaProjetsRepo->find($idProjet);
//le projet est en mode démo ?
$dateFinPaiement = $projet->getDateFinPaiement();
$code = $projet->getCode();
$dateActuelle = new \DateTime();
if ($dateFinPaiement < $dateActuelle ){
$this->addFlash('success', self::MSG_DEMO);
return $this->redirectToRoute('tri', ['code' => $code]);
}
$zip = new ZipArchive();
// sanitize projet name
$filename = '../var/projet_' . Sanitize::sanitize_file_name($projet->getNomDuProjet()) . '_lot_' . $lot . '.zip';
$zip->open($filename, ZipArchive::CREATE | ZipArchive::OVERWRITE);
$criteria = array("idProjet" => $idProjet, "lot" => $lot);
$listExigences = $visaExigencesRepo->findBy($criteria);
$criteria = array("projet" => $projet, "exigence" => $listExigences);
// get all VisaJustificatifs for this projet
$justificatifs = $visaJustificatifsRepo->findBy($criteria);
if (isset($justificatifs)){
foreach ($justificatifs as $justificatif) {
$exigence = $justificatif->getExigence();
$lot = Sanitize::sanitize_file_name($exigence->getLot());
// Pour compatibilité avec les anciens fichiers
if (file_exists('IMPORTSVISA/JUSTIFICATIFS/' . $justificatif->getNomDuFichier())) {
$zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' . $justificatif->getNomDuFichier(),
$justificatif->getNomDuFichier());
} elseif (file_exists('IMPORTSVISA/JUSTIFICATIFS/' . $projet->getId() . '/' . $justificatif->getNomDuFichier())) {
$zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' . $projet->getId() . '/' . $justificatif->getNomDuFichier(),
$justificatif->getNomDuFichier());
}
}
$zip->close();
return $this->file($filename);
} else {
$this->addFlash('success', 'Il n\'y a pas de fichier pour ce lot');
return $this->redirectToRoute('tri', ['code' => $code]);
}
// Zip archive will be created only after closing object
}
// /**
// * @Route("/fichierExemple", name="fichierExemple", options={"expose" : true})
// */
// public function fichierExemple(): \Symfony\Component\HttpFoundation\BinaryFileResponse {
//
//
// return $this->redirect('http://www.quiplusest.coop');
// }
}