<?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 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;
class VisaController extends AbstractController
{
//Nombre de projets listés par page
const NB_INDEX = 20;
/**
* @Route("/visa", name="visa")
*/
public function index(
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
Request $theRequest,
PaginatorInterface $thePaginator,
Session $session
) {
//démarrage session
$session->start();
$session->set("lastPage", "visa");
if ($this->getUser() == null) {
$listProjets = 0;
} 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('visa/index.html.twig', [
'listProjets' => $listProjets
]);
}
/**
* @Route("/visa/nouveauProjet", name="visa_nouveau_projet")
*/
public function visa_nouveau_projet(EntityManagerInterface $em, Request $req, Session $session, Security $security)
{
//'Démarrage de session'
$session->start();
$session->set("lastPage", "visa_nouveau_projet");
$this->em = $em;
$this->user = $security->getUser();
//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);
}
$em->persist($nouveau_projet);
$em->flush();
return $this->redirectToRoute('visa');
}
return $this->render('visa/visa_nouveau_projet.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/visa/{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('visa/listeContacts.html.twig', [
'listContacts' => $listContacts,
'idProjet' => $idProjet,
'form' => $form->createView()
]);
}
/**
* @Route("/visa/{idProjet}/editContact/{idContact}", name="visa_edit_contact")
* @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
*/
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/visa_edit_contact.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/visa/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/visa_nouveau_contact.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/visa/{idProjet}/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,
$idProjet
) {
//démarrage session
$session->start();
$session->set("lastPage", "listeExigences");
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) {
$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', ['idProjet' => $idProjet]);
}
$listExigencesBuilder = $visaExigencesRepo->findAllIndexBuilder($idProjet);
$listExigences = $thePaginator->paginate(
$listExigencesBuilder,
$theRequest->get('page', 1),
self::NB_INDEX
);
return $this->render('visa/listeExigences.html.twig', [
'listExigences' => $listExigences,
'idProjet' => $idProjet,
'form' => $form->createView()
]);
}
/**
* @Route("/visa/{idProjet}/tri", 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,
$idProjet
) {
//démarrage session
$session->start();
$session->set("lastPage", "tri");
$session->set("idProjet", "$idProjet");
$VisaBilans = $visaBilansRepository->findBy([
'idProjet' => $idProjet,
]);
$projet = $visaProjetsRepo->find($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('visa/bilan.html.twig');
$email->textTemplate('visa/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', ['idProjet' => $idProjet]);
}
$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
];
}
//////////////////////////////////////
/// Ici démarre l'étude par cible
//////////////////////////////////////
$projet = $visaProjetsRepo->find($idProjet);
$listExigences = $visaExigencesRepo->findBy(array("idProjet" => $idProjet));
$cibles = [];
foreach ($listExigences as $exigence) {
$cibles[] = $exigence->getCibles();
}
$listeCibles = [];
$cibles = array_unique($cibles);
sort($cibles);
//dump($cibles);
$ciblesPropres = [];
foreach ($cibles as $cible) {
if ($cible == null){
$cible = "Sans cible";
}
$ciblePropre = str_replace(".", "POINT", $cible);
$ciblePropre = str_replace("/", "BARRE", $ciblePropre);
$ciblePropre = rawurlencode($ciblePropre);
$nbValides = 0;
$nbJustificatifs = 0;
$listExigencesCible = $visaExigencesRepo->findBy(array("idProjet" => $idProjet, "cibles" => $cible));
foreach ($listExigencesCible as $exigence) {
if ($exigence->getValidation()) {
$nbValides++;
}
if (count($exigence->getVisaJustificatifs())) {
$nbJustificatifs++;
}
}
$listeCibles[] = [
'cibles' => $cible,
'ciblePropre' => $ciblePropre,
'nbValides' => $nbValides,
'nbExigences' => count($listExigencesCible),
'nbJustificatifs' => $nbJustificatifs,
'pourcentage' => round($nbValides / count($listExigences) * 100),
//'sousLots' => $sousLots
];
}
//dump($projet);
return $this->render('visa/tri.html.twig', [
'lots' => $lots,
'listeLots' => $listeLots,
'listeCibles' => $listeCibles,
'ListeSouslots' => $listeSousLots,
'formEmail' => $formEmail ? $formEmail->createView() : '',
// 'formLotsEmails' => $formLotsEmailsView,
'idProjet' => $idProjet,
'projet' => $projet
]);
}
/**
* @Route("/visa/{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);
//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);
return $this->render('visa/lot.html.twig', [
'listExigences' => $listExigences,
'idProjet' => $idProjet,
'form' => $form->createView()
]);
}
/**
* @Route("/visa/{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('visa/bilan.html.twig');
$email->textTemplate('visa/bilan.text.twig');
$email->context([
'title' => $subject,
'preambule' => $formEmail->get('preambule')->getData(),
'listExigences' => $listExigences,
'idProjet' => $idProjet,
]);
// $message = $this->renderView('visa/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("/visa/{idProjet}/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,
$idProjet,
$lot
) {
//démarrage session
$session->start();
$session->set("lastPage", "lot");
$session->set("idProjet", "$idProjet");
$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->find($idProjet);
$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('visa/lot.html.twig', [
'listExigences' => $listExigences,
'idProjet' => $idProjet,
'lot' => $lot,
'contact' => $VisaContactUser,
'formEmail' => $formEmail ? $formEmail->createView() : '',
'form' => $form->createView(),
'projet' => $projet,
'listeSousLots' => $listeSousLots
]);
}
/**
* @Route("/visa/{idProjet}/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,
$idProjet,
$ciblePropre
) {
//démarrage session
$session->start();
$session->set("lastPage", "cible");
//De quel projet parle-t-on ?
$projet = $visaProjetsRepo->find($idProjet);
$ciblePropre = str_replace("POINT", ".", $ciblePropre);
$ciblePropre = str_replace("BARRE", "/", $ciblePropre);
$cible = rawurldecode($ciblePropre);
if ($cible == "Sans cible"){
$cible = null ;
}
$criteria = array("idProjet" => $idProjet, 'cibles' => $cible);
$listExigences = $visaExigencesRepo->findBy($criteria);
//dump($listExigences);
return $this->render('visa/cible.html.twig', [
'listExigences' => $listExigences,
'idProjet' => $idProjet,
'cible' => $cible,
]);
}
/**
* @Route("/visa/{idProjet}/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,
$idProjet,
$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->find($idProjet);
//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()) {
$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()) {
$em->persist($exigence);
$em->flush();
}
}
$criteria = array("exigence" => $exigence);
$listJustificatifs = $visaJustificatifsRepo->findBy($criteria);
return $this->render('visa/exigence.html.twig', [
'exigence' => $exigence,
'listJustificatifs' => $listJustificatifs,
'idProjet' => $idProjet,
'form' => $form->createView(),
'formEntreprise' => $formEntreprise->createView()
]);
}
/**
* @Route("/visa/{idProjet}/{lot}/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,
$idProjet, $lot
) {
//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->find($idProjet);
$user = $idUser ? $this->getDoctrine()->getRepository(User::class)->find($idUser) : null;
//formulaire de modification de l'exigence
$nouvelleExigence = new VisaExigences();
$form = $this->createForm(\App\Form\Visa\VisaNouvelleExigenceType::class , $nouvelleExigence);
$form->handleRequest($req);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$numeroExigence = $visaExigencesRepo->findMaxNumeroExigenceByProjet($projet);
$nouvelleExigence->setIdUser($user);
$nouvelleExigence->setIdProjet($projet);
$nouvelleExigence->setLot($lot);
$nouvelleExigence->setNumeroExigence($numeroExigence);
$em->persist($nouvelleExigence);
$em->flush();
}
}
return $this->render('visa/nouvelleExigence.html.twig', [
'idProjet' => $idProjet,
'lot' => $lot,
'form' => $form->createView()
]);
}
/**
* @Route("/visa/{idProjet}/lot/{idLot}/{idExigence}", name="exigenceSupp", options={"expose" : true})
*/
public function exigenceSupp(
VisaExigencesRepository $visaExigencesRepo,
EntityManagerInterface $em,
$idProjet,
$idLot,
$idExigence
) {
$exigence = $visaExigencesRepo->find($idExigence);
$em->remove($exigence);
$em->flush();
return $this->redirectToRoute('lot', ['idProjet' => $idProjet, 'lot' => $idLot]);
}
/**
* @Route("/visa/{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;
}
$fichier = $visaJustificatifsRepo->find($idFichier);
$projet = $fichier->getProjet();
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');
}
/**
* @Route("/visa/{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
) {
$fichier = $visaJustificatifsRepo->find($idFichier);
$em->remove($fichier);
$em->flush();
return $this->redirectToRoute('exigence', ['idProjet' => $idProjet, 'exigence' => $idExigence]);
}
/**
*
* @Route("/visa/{idProjet}/download", name="projetZip", options={"expose" : true})
*/
public function projetDownloadZipFiles(
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
VisaJustificatifsRepository $visaJustificatifsRepo,
$idProjet
) {
$projet = $visaProjetsRepo->find($idProjet);
$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("/visa/{idProjet}/cibledownload", name="projetZipCicle", options={"expose" : true})
*/
public function projetDownloadZipFilesByCible(
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
VisaJustificatifsRepository $visaJustificatifsRepo,
VisaExigencesRepository $visaExigencesRepo,
$idProjet
) {
$projet = $visaProjetsRepo->find($idProjet);
$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("/visa/{idProjet}/lot/{lot}/download", name="lotZip", options={"expose" : true})
*/
public function lotDownloadZipFiles(
\App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
VisaJustificatifsRepository $visaJustificatifsRepo,
VisaExigencesRepository $visaExigencesRepo,
$idProjet,
$lot
) {
$projet = $visaProjetsRepo->find($idProjet);
$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);
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 archive will be created only after closing object
$zip->close();
return $this->file($filename);
}
}