src/Controller/Visa/VisaController.php line 576

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Visa;
  3. use App\Entity\Visa\VisaBilans;
  4. use App\Entity\User\User;
  5. use App\Form\Visa\VisaContactEmail;
  6. use App\Form\Visa\VisaLotBilan;
  7. use App\Form\Visa\VisaProjetBilan;
  8. use App\Form\Visa\VisaProjetsFormType;
  9. use App\Entity\Visa\VisaProjets;
  10. use App\Repository\Visa\VisaBilansRepository;
  11. use App\Repository\Visa\VisaProjetsRepository;
  12. use App\Form\Visa\VisaContactsType;
  13. use App\Entity\Visa\VisaContacts;
  14. use App\Repository\Visa\VisaContactsRepository;
  15. use App\Entity\Visa\VisaExigences;
  16. use App\Repository\Visa\VisaExigencesRepository;
  17. use App\Entity\Visa\VisaJustificatifs;
  18. use App\Repository\Visa\VisaJustificatifsRepository;
  19. use DateInterval;
  20. use App\DTO\UploadFichierDTO;
  21. use App\Form\UploadFichierType;
  22. use App\Service\Sanitize;
  23. use Doctrine\ORM\EntityManagerInterface;
  24. use Knp\Component\Pager\PaginatorInterface;
  25. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  26. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpFoundation\Response;
  29. use Symfony\Component\HttpFoundation\Session\Session;
  30. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  31. use Symfony\Component\Mailer\Mailer;
  32. use Symfony\Component\Mailer\Transport;
  33. use Symfony\Component\Mailer\Transport\Transports;
  34. use Symfony\Component\Mime\Address;
  35. use Symfony\Component\Mime\Email;
  36. use Symfony\Component\Mailer\MailerInterface;
  37. use Symfony\Component\Routing\Annotation\Route;
  38. use Symfony\Component\Security\Core\Security;
  39. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  40. use Symfony\Component\HttpFoundation\File\UploadedFile;
  41. use Symfony\Component\String\Slugger\SluggerInterface;
  42. use PhpOffice;
  43. use PhpOffice\PhpSpreadsheet\IOFactory;
  44. use ZipArchive;
  45. use ZipStream\Option\Archive;
  46. use Stripe\Stripe;
  47. class VisaController extends AbstractController
  48. {
  49.     //Nombre de projets listés par page
  50.     const NB_INDEX 20;
  51.         const MSG_DEMO 'Non autorisé en mode démo';
  52.         
  53.         
  54.     #[Route(path'/'name'index')]
  55.     public function index(
  56.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  57.         Request $theRequest,
  58.         PaginatorInterface $thePaginator,
  59.         Session $session
  60.     ) {
  61.         //démarrage session
  62.         $session->start();
  63.         $session->set("lastPage""index");
  64.         if ($this->getUser() == null) {
  65.         $listProjetsBuilder[] = $visaProjetsRepo->find(1);
  66.                 
  67.                             $listProjets $thePaginator->paginate(
  68.                 $listProjetsBuilder,
  69.                 $theRequest->get('page'1),
  70.                 self::NB_INDEX
  71.             );
  72.         } else {
  73.             if (!$this->isGranted('ROLE_ADMIN')) {
  74.                 $typeFormFilter 'utilisateur';
  75. //            $idUser = $this->getUser()->getId();
  76.                 $idUser $this->getUser() ? $this->getUser()->getId() : null;;
  77.             } else {
  78.                 $typeFormFilter 'admin';
  79.                 $idUser null;
  80.             }
  81.             $listProjetsBuilder $visaProjetsRepo->findAllIndexBuilder($idUser);
  82.             $listProjets $thePaginator->paginate(
  83.                 $listProjetsBuilder,
  84.                 $theRequest->get('page'1),
  85.                 self::NB_INDEX
  86.             );
  87.         }
  88.         return $this->render('index.html.twig', [
  89.             'listProjets' => $listProjets
  90.         ]);
  91.     }
  92.         
  93.         
  94.                 #[Route(path'/stripeCheckout'name'stripeCheckout')]
  95.     public function stripeCheckout() {
  96.         
  97. $stripeSecretKey 'sk_test_51Oqe8aHLiE2EvO77DadYRAHrMCNQBMAShpYTps5GSd7Q9tge1AZ1XcDwYewCv4fuljnqFnovZMmvvR1z0DbuEhCp005wNC7H9C';
  98.         
  99.         \Stripe\Stripe::setApiKey($stripeSecretKey);
  100.         header('Content-Type: application/json');
  101.         $YOUR_DOMAIN 'http://localhost:8000';
  102.         $checkout_session \Stripe\Checkout\Session::create([
  103.                     'line_items' => [[
  104.                     # Provide the exact Price ID (e.g. pr_1234) of the product you want to sell
  105.                     'price' => 'price_1OqedGHLiE2EvO77A9acKMfR',
  106.                     'quantity' => 1,
  107.                         ]],
  108.                     'mode' => 'payment',
  109.                     'success_url' => $YOUR_DOMAIN '/success',
  110.                     'cancel_url' => $YOUR_DOMAIN '/cancel',
  111.         ]);
  112.         return new \Symfony\Component\HttpFoundation\RedirectResponse($checkout_session->url);
  113.     }
  114.     
  115.                     #[Route(path'/success'name'success')]
  116.     public function success() {
  117.         return $this->render('success.html.twig');
  118.     }
  119.     
  120.                        #[Route(path'/cancel'name'cancel')]
  121.     public function cancel() {
  122.         return $this->render('cancel.html.twig');
  123.     }
  124.     
  125.     #[Route(path'nouveauProjet'name'visa_nouveau_projet')]
  126.     public function visa_nouveau_projet(EntityManagerInterface $emRequest $reqSession $sessionSecurity $securitySluggerInterface $slugger,)
  127.     {
  128.         //'Démarrage de session'
  129.         $session->start();
  130.         $session->set("lastPage""visa_nouveau_projet");
  131.         $this->em $em;
  132.         $this->user $security->getUser();
  133.                 
  134.                     //verif compte user
  135.             if ($this->user == null) {
  136.                 return $this->redirectToRoute('user_security_login');
  137.             }
  138.         //création d'un nouvel object
  139.         $nouveau_projet = new VisaProjets();
  140.         $form $this->createForm(VisaProjetsFormType::class, $nouveau_projet);
  141.         $form->handleRequest($req);
  142.         //Action si envoyé
  143.         if ($form->isSubmitted() && $form->isValid()) {
  144.             //ajout du compte user
  145.             if ($this->user != null) {
  146.                 $nouveau_projet->setIdUser($this->user);
  147.             }
  148.                         
  149.                         $nom $nouveau_projet->getNomDuProjet();
  150.                         
  151.                         // On donne un code au nom qui sera la page d'accès:
  152.                         $nomNormalise $slugger->slug($nom);
  153.                         $nomTronque substr($nomNormalise040);
  154.                         $numero rand(100,999);
  155.                         $code $numero "-" $nomTronque;
  156.                         
  157.                         $nouveau_projet->setCode($code);
  158.                         
  159.                         $session->set("code"$code );                        
  160.                         
  161.                         //on définit la date de création du projet :
  162.                         // Créer un objet DateTimeInterface représentant la date du jour
  163.                         $dateDuJour = new \DateTimeImmutable(); // Utilisation de DateTimeImmutable pour une meilleure immutabilité
  164.                         // Récupérer la date au format MySQL
  165.                         $nouveau_projet->setDateCreation($dateDuJour);
  166.                         
  167.                         $dateFinPaiement = new \DateTimeImmutable();
  168.                         $dateFinPaiement $dateFinPaiement->modify('+31 days');
  169.                         $nouveau_projet->setDateFinPaiement($dateFinPaiement);
  170.                         
  171.             $em->persist($nouveau_projet);
  172.             $em->flush();
  173.             return $this->redirectToRoute('index');
  174.         }
  175.         return $this->render('visa_nouveau_projet.html.twig', [
  176.             'form' => $form->createView()
  177.         ]);
  178.     }
  179.                #[Route(path'{code}/modifProjet'name'modifProjet')]
  180.     public function modifProjet(EntityManagerInterface $emRequest $reqSession $session
  181.             Security $securitySluggerInterface $slugger
  182.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo$code)
  183.     {
  184.         //'Démarrage de session'
  185.         $session->start();
  186.         $session->set("lastPage""modifProjet");
  187.         $this->em $em;
  188.         $this->user $security->getUser();
  189.                 
  190.                     //verif compte user
  191.             if ($this->user == null) {
  192.                 return $this->redirectToRoute('user_security_login');
  193.             }
  194.         //création d'un nouvel object
  195.         $projet $visaProjetsRepo->findOneBy(array("code" => $code));
  196.         $form $this->createForm(VisaProjetsFormType::class, $projet);
  197.         $form->handleRequest($req);
  198.         //Action si envoyé
  199.         if ($form->isSubmitted() && $form->isValid()) {
  200.             //ajout du compte user
  201.             if ($this->user != null) {
  202.                 $projet->setIdUser($this->user);
  203.             }
  204.                         
  205.                         $nom $projet->getNomDuProjet();
  206.                         $nomNormalise $slugger->slug($nom);
  207.                         $nomTronque substr($nomNormalise040);
  208.                         $numero rand(100,999);
  209.                         $code $numero "-" $nomTronque;
  210.                         
  211.                         $projet->setCode($code);
  212.                         
  213.                         
  214.                         $session->set("code"$code );
  215.             $em->persist($projet);
  216.             $em->flush();
  217.             return $this->redirectToRoute('index');
  218.         }
  219.         return $this->render('modifProjet.html.twig', [
  220.             'form' => $form->createView()
  221.         ]);
  222.     }
  223.         
  224.         
  225.     #[Route(path'{idProjet}/listeContacts'name'listeContacts'options: ['expose' => true])]
  226.     public function listeContacts(
  227.         VisaContactsRepository $visaContactsRepo,
  228.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  229.         Request $theRequest,
  230.         PaginatorInterface $thePaginator,
  231.         EntityManagerInterface $em,
  232.         Session $session,
  233.         Request $req,
  234.         SluggerInterface $slugger,
  235.         $idProjet
  236.     ) {
  237.         //démarrage session
  238.         $session->start();
  239.         $session->set("lastPage""listeContacts");
  240.         if (!$this->isGranted('ROLE_ADMIN')) {
  241.             $typeFormFilter 'utilisateur';
  242. //            $idUser = $this->getUser()->getId();
  243.             $idUser $this->getUser() ? $this->getUser()->getId() : null;;
  244.         } else {
  245.             $typeFormFilter 'admin';
  246.             $idUser null;
  247.         }
  248.         //création du formulaire de nouveau fichier
  249.         $nouveau_fichier = new UploadFichierDTO;
  250.         $form $this->createForm(UploadFichierType::class, $nouveau_fichier);
  251.         $form->handleRequest($req);
  252.         //Action si envoyé
  253.         if ($form->isSubmitted() && $form->isValid()) {
  254.             $files $form->get('fichier')->getData();
  255.             if ($files) {
  256.                 foreach ($files as $file) {
  257.                     $filename $file->getClientOriginalName();
  258.                     $originalFilename pathinfo($filenamePATHINFO_FILENAME);
  259.                     $safeFilename $slugger->slug($originalFilename);
  260.                     $newFilename $safeFilename '-' uniqid() . '.' $file->guessExtension();
  261.                     $data = [];
  262. // open the file
  263.                     $f fopen($file'r');
  264.                     if ($f === false) {
  265.                         die('Cannot open the file ' $filename);
  266.                     }
  267. // read each line in CSV file at a time
  268.                     while (($row fgetcsv($f)) !== false) {
  269.                         $data[] = $row;
  270.                     }
  271. // close the file
  272.                     fclose($f);
  273.                     $numeroLigne 0;
  274.                     foreach ($data as $ligne) {
  275.                         if ($numeroLigne != 0) {
  276.                             $colonneArray explode(";"$ligne['0']);
  277.                             $nouveau_contact = new \App\Entity\Visa\VisaContacts();
  278.                             $nouveau_contact->setPrenom($colonneArray['1']);
  279.                             $nouveau_contact->setNom($colonneArray['2']);
  280.                             $nouveau_contact->setSociete($colonneArray['3']);
  281.                             //ajout du compte user
  282.                             if ($this->getUser() != null) {
  283.                                 $nouveau_contact->setIdUser($this->getUser());
  284.                             }
  285.                             //ajout de l'ID du projet
  286.                             $projet $visaProjetsRepo->find($idProjet);
  287.                             $nouveau_contact->setIdProjet($projet);
  288.                             $em->persist($nouveau_contact);
  289.                             $em->flush();
  290.                         }
  291.                         $numeroLigne $numeroLigne 1;
  292.                     }
  293.                 }
  294.             }
  295.             return $this->redirectToRoute('listeContacts', ['idProjet' => $idProjet]);
  296.         }
  297.         $listContactsBuilder $visaContactsRepo->findAllIndexBuilder($idProjet);
  298.         $listContacts $thePaginator->paginate(
  299.             $listContactsBuilder,
  300.             $theRequest->get('page'1),
  301.             self::NB_INDEX
  302.         );
  303.         return $this->render('listeContacts.html.twig', [
  304.             'listContacts' => $listContacts,
  305.             'idProjet' => $idProjet,
  306.             'form' => $form->createView()
  307.         ]);
  308.     }
  309.     /**
  310.      * @param EntityManagerInterface $em
  311.      * @param Request $req
  312.      * @param Session $session
  313.      * @param Security $security
  314.      * @param $idProjet
  315.      * @param $idContact
  316.      * @param \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo
  317.      * @param VisaContactsRepository $visaContactsRepo
  318.      * @return Response
  319.      */
  320.     #[Route(path'{idProjet}/editContact/{idContact}'name'visa_edit_contact')]
  321.     public function visa_edit_contact(
  322.         EntityManagerInterface $em,
  323.         Request $req,
  324.         Session $session,
  325.         Security $security,
  326.         $idProjet,
  327.         $idContact,
  328.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  329.         VisaContactsRepository $visaContactsRepo
  330.     ) {
  331.         $session->start();
  332.         $session->set("lastPage""visa_edit_contact");
  333.         $this->em $em;
  334.         $this->user $security->getUser();
  335.         //création d'un nouvel object
  336.         $contact $visaContactsRepo->findOneBy(['id' => $idContact]);
  337.         $form $this->createForm(\App\Form\Visa\VisaContactsType::class, $contact);
  338.         $form->handleRequest($req);
  339.         //Action si envoyé
  340.         if ($form->isSubmitted() && $form->isValid()) {
  341.             $em->persist($contact);
  342.             $em->flush();
  343.             return $this->redirectToRoute('listeContacts', ['idProjet' => $idProjet]);
  344.         }
  345.         $form->setData($contact);
  346.         return $this->render('visa_edit_contact.html.twig', [
  347.             'form' => $form->createView()
  348.         ]);
  349.     }
  350.     #[Route(path'nouveauContact/{idProjet}'name'visa_nouveau_contact'options: ['expose' => true])]
  351.     public function visa_nouveau_contact(
  352.         EntityManagerInterface $em,
  353.         Request $req,
  354.         Session $session,
  355.         Security $security,
  356.         $idProjet,
  357.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo
  358.     ) {
  359.         //'Démarrage de session'
  360.         $session->start();
  361.         $session->set("lastPage""visa_nouveau_contact");
  362.         $this->em $em;
  363.         $this->user $security->getUser();
  364.         //création d'un nouvel object
  365.         $nouveau_contact = new \App\Entity\Visa\VisaContacts();
  366.         $form $this->createForm(\App\Form\Visa\VisaContactsType::class, $nouveau_contact);
  367.         $form->handleRequest($req);
  368.         //Action si envoyé
  369.         if ($form->isSubmitted() && $form->isValid()) {
  370.             //ajout du compte user
  371.             if ($this->user != null) {
  372.                 $nouveau_contact->setIdUser($this->user);
  373.             }
  374.             //ajout de l'ID du projet
  375.             $projet $visaProjetsRepo->find($idProjet);
  376.             $nouveau_contact->setIdProjet($projet);
  377.             $em->persist($nouveau_contact);
  378.             $em->flush();
  379.             return $this->redirectToRoute('/listeContacts', ['idProjet' => $idProjet]);
  380.         }
  381.         return $this->render('visa_nouveau_contact.html.twig', [
  382.             'form' => $form->createView()
  383.         ]);
  384.     }
  385.     #[Route(path'{code}/listeExigences'name'listeExigences'options: ['expose' => true])]
  386.     public function listeExigences(
  387.         VisaExigencesRepository $visaExigencesRepo,
  388.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  389.         Request $theRequest,
  390.         PaginatorInterface $thePaginator,
  391.         EntityManagerInterface $em,
  392.         Session $session,
  393.         Request $req,
  394.         SluggerInterface $slugger,
  395.         $code
  396.     ) {
  397.         //démarrage session
  398.         $session->start();
  399.         $session->set("lastPage""listeExigences");
  400.                 $session->set("code""$code");
  401.                 
  402.                         //De quel projet parle-t-on ?
  403.               $projet $visaProjetsRepo->findOneBy(array("code" => $code));
  404.                 $idProjet $projet->getId();
  405.         if (!$this->isGranted('ROLE_ADMIN')) {
  406.             $typeFormFilter 'utilisateur';
  407. //            $idUser = $this->getUser()->getId();
  408.             $idUser $this->getUser() ? $this->getUser()->getId() : null;;
  409.         } else {
  410.             $typeFormFilter 'admin';
  411.             $idUser null;
  412.         }
  413.         //création du formulaire de nouveau fichier
  414.         $nouveau_fichier = new UploadFichierDTO;
  415.         $form $this->createForm(UploadFichierType::class, $nouveau_fichier);
  416.         $form->handleRequest($req);
  417.         //Action si envoyé
  418.         if ($form->isSubmitted() && $form->isValid()) {
  419.             $files $form->get('fichier')->getData();
  420.             if ($files) {
  421.                 foreach ($files as $file) {
  422.                     $sheetData = [];
  423.                     //ouverture de la feuille Excel
  424.                     $spreadsheet IOFactory::load($file);
  425.                     $sheetData $spreadsheet->getActiveSheet()->toArray();
  426. //                    //dump($sheetData);
  427.                     $numeroLigne 0;
  428.                     foreach ($sheetData as $ligne) {
  429.                         //dump($ligne);
  430.                         if ($numeroLigne != and $ligne['1'] != null ) {
  431.                             $exigence $visaExigencesRepo->findBy(array(
  432.                                 "idProjet" => $idProjet,
  433.                                 "numeroExigence" => $ligne['0']
  434.                             ));
  435.                             if ($exigence) {
  436.                                 $nouvelleExigence $exigence['0'];
  437.                             } else {
  438.                                 $nouvelleExigence = new \App\Entity\Visa\VisaExigences();
  439.                             }
  440. //                                                    
  441.                             //ajout du compte user                            
  442.                             $nouvelleExigence->setIdUser($this->getUser());
  443.                             //ajout de l'ID du projet
  444.                             $projet $visaProjetsRepo->find($idProjet);
  445.                             $nouvelleExigence->setIdProjet($projet);
  446.                             $nouvelleExigence->setNumeroExigence($ligne['0']);
  447.                             $nouvelleExigence->setLot($ligne['1']);
  448.                             $nouvelleExigence->setSousLot($ligne['2']);
  449.                             $nouvelleExigence->setCibles($ligne['3']);
  450.                             $nouvelleExigence->setElementsConcernes($ligne['4']);
  451.                             $nouvelleExigence->setExigences($ligne['5']);
  452.                             $nouvelleExigence->setCommentairesEntreprise($ligne['6']);
  453.                             $nouvelleExigence->setCommentairesMOE($ligne['7']);
  454.                             $nouvelleExigence->setLocalisation($ligne['8']);
  455.                             $em->persist($nouvelleExigence);
  456.                             $em->flush();
  457.                         }
  458.                         $numeroLigne $numeroLigne 1;
  459.                     }
  460.                 }
  461.             }
  462.             return $this->redirectToRoute('listeExigences', ['code' => $code]);
  463.         }
  464.         $listExigencesBuilder $visaExigencesRepo->findAllIndexBuilder($idProjet);
  465.                 
  466.         $listExigences $thePaginator->paginate(
  467.             $listExigencesBuilder,
  468.             $theRequest->get('page'1),
  469.             self::NB_INDEX
  470.         );
  471.                 //dump($listExigences);
  472.         return $this->render('listeExigences.html.twig', [
  473.             'listExigences' => $listExigences,
  474.             'idProjet' => $idProjet,
  475.                     'projet' => $projet,
  476.             'form' => $form->createView()
  477.         ]);
  478.     }
  479.             #[Route(path'p-{code}/'name'tri'options: ['expose' => true])]
  480.     public function tri(
  481.         VisaExigencesRepository $visaExigencesRepo,
  482.         VisaBilansRepository $visaBilansRepository,
  483.         MailerInterface $mailer,
  484.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  485.         Request $theRequest,
  486.         PaginatorInterface $thePaginator,
  487.         EntityManagerInterface $em,
  488.         Session $session,
  489.         Request $req,
  490.         SluggerInterface $slugger,
  491.         $code
  492.     ) {
  493.         //démarrage session
  494.         $session->start();
  495.         $session->set("lastPage""tri");
  496.                 //$session->set("idProjet", "$idProjet");
  497.                 $session->set("code"$code);
  498.                 
  499.               $projet $visaProjetsRepo->findOneBy(array("code" => $code));
  500.                 $idProjet $projet->getId();
  501.                 
  502.                 //le projet est en mode démo ?
  503.                 $dateFinPaiement $projet->getDateFinPaiement();
  504.                 $dateActuelle = new \DateTime();
  505.                 $dateDans31Jours = clone $dateActuelle;
  506.                 $dateDans31Jours->modify('+31 days');
  507.                 $diff = isset($dateFinPaiement) ? $dateActuelle->diff($projet->getDateFinPaiement()) : null;
  508.                 $formattedInterval $diff->format('%d');
  509.                 
  510.                 if ($dateFinPaiement $dateActuelle ){
  511.                 $this->addFlash('success''Le projet est en mode démo');
  512.                 }
  513.                 
  514.                 if ($dateFinPaiement $dateActuelle and $dateFinPaiement $dateDans31Jours ){
  515.                 $this->addFlash('success''Le projet passe en mode démo dans ' $formattedInterval ' jour(s).');
  516.                 }
  517.                 
  518.                 
  519.                 
  520.         $VisaBilans $visaBilansRepository->findBy([
  521.             'idProjet' => $idProjet,
  522.         ]);
  523.         $listExigences $visaExigencesRepo->findBy(array("idProjet" => $idProjet));
  524.         $lots = [];
  525.                 
  526.                 /// Commence ici l'étude par lot
  527.         foreach ($listExigences as $exigence) {
  528.             $lots [] = $exigence->getLot();
  529.         }
  530.         $listeLots = [];
  531.         $lots array_unique($lots);
  532.         sort($lots);
  533.         $formLots = [];
  534.         $loop 0;
  535.         foreach ($lots as $index => $lot) {
  536.             $visaBilanItem $visaBilansRepository->findOneBy([
  537.                 'idProjet' => $idProjet,
  538.                 'lot' => $lot
  539.             ]);
  540.             if (!$visaBilanItem) {
  541.                 $visaBilanItem = new VisaBilans();
  542.                 $visaBilanItem->setIdProjet($projet);
  543.                 $visaBilanItem->setLot($lot);
  544.             }
  545.             $formLots[++$loop] = $visaBilanItem;
  546.         }
  547.                 
  548.                 $listeSousLots=[];
  549.                 $nbJustificatifsTotal 0;
  550.                 $listExigencesTotal $visaExigencesRepo->findBy(array("idProjet" => $idProjet));
  551.         foreach ($lots as $lot) {
  552.             $nbValides 0;
  553.             $nbJustificatifs 0;
  554.             $listExigences $visaExigencesRepo->findBy(array("idProjet" => $idProjet"lot" => $lot));
  555.             $sousLots = [];
  556.             foreach ($listExigences as $exigence) {
  557.                 if ($exigence->getValidation()) {
  558.                     $nbValides++;
  559.                 }
  560.                 if (count($exigence->getVisaJustificatifs())) {
  561.                     $nbJustificatifs++;
  562.                                         $nbJustificatifsTotal++;
  563.                 }
  564.                 $sousLots [] = $exigence->getSousLot();
  565.             }
  566.             $sousLots array_unique($sousLots);
  567.             $listeSousLots [$lot] = $sousLots;
  568.             $listeLots[] = [
  569.                 'lot' => $lot,
  570.                 'nbValides' => $nbValides,
  571.                 'nbExigences' => count($listExigences),
  572.                 'nbJustificatifs' => $nbJustificatifs,
  573.                 'pourcentage' => round($nbValides count($listExigences) * 100),
  574.                 'sousLots' => $sousLots
  575.             ];
  576.         }
  577.                 
  578.                 $tauxJustifTotal round($nbJustificatifsTotal max(count($listExigencesTotal),1)*100);
  579.                 //dump($nbJustificatifsTotal);
  580.                 //dump($listExigences);
  581.                 //////////////////////////////////////
  582.                 /// Ici démarre l'étude par cible
  583.                 //////////////////////////////////////
  584.         $projet $visaProjetsRepo->find($idProjet);
  585.         $listExigences $visaExigencesRepo->findBy(array("idProjet" => $idProjet));
  586.         
  587.                 $ciblesSeparees = [];
  588.                 $ciblesRecomposees= [];
  589.                 $listeCibles = [];
  590.                 
  591.                 
  592.                 foreach ($listExigences as $exigence) {
  593.             $cibles $exigence->getCibles();
  594.                         $ciblesSeparees explode(";",$cibles);
  595.                         foreach ($ciblesSeparees as $cibleSeule){
  596.                 $tableauNbExigenceParCible[$cibleSeule] = 0;
  597.                 $tableauNbExigenceValideeParCible[$cibleSeule] = 0;
  598.                 $tableauNbJustificatifParCible[$cibleSeule] = 0;
  599.                         }
  600.                 }
  601.                 
  602.         foreach ($listExigences as $exigence) {
  603.             $ListeIdExigencesParCible = [];
  604.             $cibles $exigence->getCibles();
  605.             $idExigence $exigence->getId();
  606.             $ciblesSeparees explode(";"$cibles);
  607.             foreach ($ciblesSeparees as $cibleSeule) {
  608.                 if ($cibleSeule == null) {
  609.                     $cibleSeule "Sans cible";
  610.                 }
  611.                 // Vérifie si la cible existe déjà dans le tableau
  612.                 if (!isset($tableauIdExigencesParCible[$cibleSeule])) {
  613.                     $tableauIdExigencesParCible[$cibleSeule] = []; // Initialise un tableau vide pour cette cible
  614.                 }
  615.                 // Ajoute l'ID d'exigence à la liste des ID pour cette cible
  616.                 $tableauIdExigencesParCible[$cibleSeule][] = $idExigence;
  617.                 $tableauNbExigenceParCible[$cibleSeule] = $tableauNbExigenceParCible[$cibleSeule] + 1;
  618.                 if ($exigence->getValidation()) {
  619.                     $tableauNbExigenceValideeParCible[$cibleSeule] = $tableauNbExigenceValideeParCible[$cibleSeule] + 1;
  620.                 }
  621.                 if (count($exigence->getVisaJustificatifs())) {
  622.                     $tableauNbJustificatifParCible[$cibleSeule] = $tableauNbJustificatifParCible[$cibleSeule] + 1;
  623.                 }
  624.                 $listeCibles[$cibleSeule] = [
  625.                     'cibles' => $cibleSeule,
  626.                     'ciblePropre' => $slugger->slug($cibleSeule),
  627.                     'idExigences' => $tableauIdExigencesParCible[$cibleSeule],
  628.                     'nbValides' => $tableauNbExigenceValideeParCible[$cibleSeule],
  629.                     'nbExigences' => $tableauNbExigenceParCible[$cibleSeule],
  630.                     'nbJustificatifs' => $tableauNbJustificatifParCible[$cibleSeule],
  631.                     'pourcentage' => round($tableauNbExigenceValideeParCible[$cibleSeule] / $tableauNbExigenceParCible[$cibleSeule] * 100)
  632.                 ];
  633.             }
  634.         }
  635.         
  636.         $session->set("listeCibles"$listeCibles);
  637.                 
  638.         return $this->render('tri.html.twig', [
  639.             'lots' => $lots,
  640.             'listeLots' => $listeLots,
  641.                         'listeCibles' => $listeCibles
  642.             'ListeSouslots' => $listeSousLots,
  643.             'idProjet' => $idProjet,
  644.                         'projet' => $projet,
  645.                         'tauxJustifTotal' => $tauxJustifTotal,                    
  646.                     'dateDans31Jours' => $dateDans31Jours,
  647.                     'diff' => $diff
  648.         ]);
  649.     }
  650.         
  651.     #[Route(path'{code}/publipostage'name'publipostage'options: ['expose' => true])]
  652.     public function publipostage(
  653.         VisaExigencesRepository $visaExigencesRepo,
  654.         VisaBilansRepository $visaBilansRepository,
  655.         MailerInterface $mailer,
  656.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  657.         Request $theRequest,
  658.         PaginatorInterface $thePaginator,
  659.         EntityManagerInterface $em,
  660.         Session $session,
  661.         Request $req,
  662.         SluggerInterface $slugger,
  663.         $code
  664.     ) {
  665.         //démarrage session
  666.         $session->start();
  667.         $session->set("lastPage""publipostage");
  668.                 //$session->set("idProjet", "$idProjet");
  669.                 $session->set("code""$code");
  670.                 
  671.               $projet $visaProjetsRepo->findOneBy(array("code" => $code));
  672.                 $idProjet $projet->getId();
  673.                 
  674.         $VisaBilans $visaBilansRepository->findBy([
  675.             'idProjet' => $idProjet,
  676.         ]);
  677.         $listExigences $visaExigencesRepo->findBy(array("idProjet" => $idProjet));
  678.         $lots = [];
  679.                 
  680.                 /// Commence ici l'étude par lot
  681.         foreach ($listExigences as $exigence) {
  682.             $lots [] = $exigence->getLot();
  683.         }
  684.         $listeLots = [];
  685.         $lots array_unique($lots);
  686.         sort($lots);
  687.         $formLots = [];
  688.         $loop 0;
  689.         foreach ($lots as $index => $lot) {
  690.             $visaBilanItem $visaBilansRepository->findOneBy([
  691.                 'idProjet' => $idProjet,
  692.                 'lot' => $lot
  693.             ]);
  694.             if (!$visaBilanItem) {
  695.                 $visaBilanItem = new VisaBilans();
  696.                 $visaBilanItem->setIdProjet($projet);
  697.                 $visaBilanItem->setLot($lot);
  698.             }
  699.             $formLots[++$loop] = $visaBilanItem;
  700.         }
  701.         $formEmail $this->createForm(VisaProjetBilan::class, ['lots' => $formLots], [
  702.             'idProjet' => $idProjet,
  703.         ]);
  704.         $formEmail->handleRequest($req);
  705.         if ($formEmail->isSubmitted() && $formEmail->isValid()) {
  706.             $items = [];
  707.             $lots $formEmail->get('lots')->getData();
  708.             foreach ($lots as $lotEmail) {
  709.                 if ($lotEmail->getEmail() != null) {
  710.                     $lotEmail->setIdProjet($projet);
  711.                     $lotEmail->setCopieA($formEmail->get('copie_a')->getData());
  712.                     $lotEmail->setRepondreA($this->getUser() ? $this->getUser()->getEmail() : null);
  713.                     $lotEmail->setPreambule($formEmail->get('preambule')->getData());
  714.                     $em->persist($lotEmail);
  715.                     $em->flush();
  716.                     $items[] = $lotEmail;
  717.                 } else {
  718.                     if ($lotEmail->getId()) {
  719.                         $em->remove($lotEmail);
  720.                         $em->flush();
  721.                     }
  722.                 }
  723.             }
  724.             /* @var VisaBilans $visaBilanItem */
  725.             if ($items && count($items)) {
  726.                 foreach ($items as $visaBilanItem) {
  727.                     if ($visaBilanItem->getEnvoiEmail()) {
  728.                         $listExigences $visaExigencesRepo->findBy(array(
  729.                             "idProjet" => $idProjet,
  730.                             "lot" => $visaBilanItem->getLot()
  731.                         ));
  732.                         $from $this->getUser() ? $this->getUser()->getEmail() : new Address($visaBilanItem->getEmail());
  733.                         $to = new Address($visaBilanItem->getEmail());
  734.                         $subject "Liste des exigences pour le lot  " $visaBilanItem->getLot() . " du projet " $projet->getNomDuProjet();
  735.                         $email = (new TemplatedEmail());
  736.                         $email->htmlTemplate('bilan.html.twig');
  737.                         $email->textTemplate('bilan.text.twig');
  738.                         $email->context([
  739.                             'title' => $subject,
  740.                             'preambule' => $visaBilanItem->getPreambule(),
  741.                             'listExigences' => $listExigences,
  742.                             'idProjet' => $idProjet,
  743.                         ]);
  744.                         $email->from($from)
  745.                             ->to($to);
  746.                         if (trim($visaBilanItem->getCopieA())) {
  747.                             $email->cc($visaBilanItem->getCopieA());
  748.                         }
  749.                         if ($visaBilanItem->getRepondreA()) {
  750.                             $email->replyTo($visaBilanItem->getRepondreA());
  751.                         }
  752.                         $email->getHeaders()
  753.                             ->addTextHeader('X-Priority''1')
  754.                             ->addTextHeader('X-MSMail-Priority''High')
  755.                             ->addTextHeader('X-UIDL'md5(uniqid(time())));
  756.                         $email->subject($subject);
  757.                         try {
  758.                             $mailer->send($email);
  759.                             $this->addFlash('success''Le mail a bien été envoyé à ' $visaBilanItem->getEmail());
  760.                         } catch (TransportExceptionInterface $e) {
  761.                             $this->addFlash('error'$e->getMessage());
  762.                         }
  763.                     }
  764.                 }
  765.             }
  766.             // Redirection vers la page de tri
  767.             return $this->redirectToRoute('tri', ['code' => $code]);
  768.         }
  769.                 
  770.                 $listeSousLots=[];
  771.         foreach ($lots as $lot) {
  772.             $nbValides 0;
  773.             $nbJustificatifs 0;
  774.             $listExigences $visaExigencesRepo->findBy(array("idProjet" => $idProjet"lot" => $lot));
  775.             $sousLots = [];
  776.             foreach ($listExigences as $exigence) {
  777.                 if ($exigence->getValidation()) {
  778.                     $nbValides++;
  779.                 }
  780.                 if (count($exigence->getVisaJustificatifs())) {
  781.                     $nbJustificatifs++;
  782.                 }
  783.                 $sousLots [] = $exigence->getSousLot();
  784.             }
  785.             $sousLots array_unique($sousLots);
  786.             $listeSousLots [$lot] = $sousLots;
  787.             $listeLots[] = [
  788.                 'lot' => $lot,
  789.                 'nbValides' => $nbValides,
  790.                 'nbExigences' => count($listExigences),
  791.                 'nbJustificatifs' => $nbJustificatifs,
  792.                 'pourcentage' => round($nbValides count($listExigences) * 100),
  793.                 'sousLots' => $sousLots
  794.             ];
  795.         }
  796.                
  797.         return $this->render('publipostage.html.twig', [
  798.             'lots' => $lots,
  799.             'listeLots' => $listeLots,
  800.             'ListeSouslots' => $listeSousLots,
  801.             'formEmail' => $formEmail $formEmail->createView() : '',
  802. //            'formLotsEmails' => $formLotsEmailsView,
  803.             'idProjet' => $idProjet,
  804.                         'projet' => $projet
  805.         ]);
  806.     }
  807.     #[Route(path'{idProjet}/exigencedz/{idExigence}'name'exigencedz'options: ['expose' => true])]
  808.     public function exigencedz(
  809.         VisaExigencesRepository $visaExigencesRepo,
  810.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  811.         Request $theRequest,
  812.         PaginatorInterface $thePaginator,
  813.         EntityManagerInterface $em,
  814.         Session $session,
  815.         Request $req,
  816.         SluggerInterface $slugger,
  817.         $idProjet,
  818.         $idExigence
  819.     ) {
  820.         //démarrage session
  821.         $session->start();
  822.         $session->set("lastPage""lot");
  823.         if (!$this->isGranted('ROLE_ADMIN')) {
  824.             $typeFormFilter 'utilisateur';
  825. //            $idUser = $this->getUser()->getId();
  826.             $idUser $this->getUser() ? $this->getUser()->getId() : null;
  827.         } else {
  828.             $typeFormFilter 'admin';
  829.             $idUser null;
  830.         }
  831.         // On récupère l'objet Exigence
  832.         $exigence $visaExigencesRepo->find($idExigence);
  833.         // On récupère le lot associé
  834.         $lot $exigence->getLot();
  835.         //De quel projet parle-t-on ?
  836.         $projet $visaProjetsRepo->find($idProjet);
  837.                 
  838.                 
  839.                 //le projet est en mode démo ?
  840.                 $dateFinPaiement $projet->getDateFinPaiement();
  841.                 $code $projet->getCode();
  842.                 $dateActuelle = new \DateTime();
  843.                 
  844.                 if ($dateFinPaiement $dateActuelle ){
  845.                         //création du formulaire de nouveau fichier ////// => à transformer en plusieurs dropzones
  846.                         $nouveau_fichier = new UploadFichierDTO;
  847.                         $form $this->createForm(UploadFichierType::class, $nouveau_fichier);
  848.                         $form->handleRequest($req);
  849.                         $file $req->files->get('fichier');
  850.                         if ($file) {
  851.                                 $filename $file->getClientOriginalName();
  852.                                 $originalFilename pathinfo($filenamePATHINFO_FILENAME);
  853.                                 $safeFilename $slugger->slug($originalFilename);
  854.                                 $newFilename $safeFilename '-' uniqid() . '.' $file->guessExtension();
  855.                                 // Check if directory exists with $IdProjet at end
  856.                                 if (!is_dir('IMPORTSVISA/JUSTIFICATIFS/' $idProjet)) {
  857.                                         mkdir('IMPORTSVISA/JUSTIFICATIFS/' $idProjet0777true);
  858.                                 }
  859.                                 $file->move('IMPORTSVISA/JUSTIFICATIFS/' $idProjet$newFilename);
  860.                                 $justif = new \App\Entity\Visa\VisaJustificatifs();
  861.                                 $justif->setNomDuFichier($newFilename);
  862.                                 $time date('d/m/y H:i');
  863.                                 $justif->setDate($time);
  864.                                 $justif->setExigence($exigence);
  865.                                 $justif->setProjet($projet);
  866.                                 $em->persist($justif);
  867.                                 $em->flush();
  868.                         }
  869.                         $criteria = array("idProjet" => $idProjet"lot" => $lot);
  870.                         $listExigences $visaExigencesRepo->findBy($criteria);
  871.                 
  872.                 } else {
  873.                     $this->addFlash('success'self::MSG_DEMO);
  874.                 }              
  875. //                return $this->redirectToRoute('lot', ['code' => $code, 'lot' => $lot]);
  876.         return $this->render('lot.html.twig', [
  877.             'listExigences' => $listExigences,
  878.             'idProjet' => $idProjet,
  879.             'form' => $form->createView(),
  880.                         'code' => $code
  881.         ]);
  882.     }
  883.     #[Route(path'{idProjet}/lot/{lot}/email'name'emailLot'options: ['expose' => true])]
  884.     public function EmailLot(
  885.         MailerInterface $mailer,
  886.         VisaContactsRepository $visaContactsRepository,
  887.         VisaExigencesRepository $visaExigencesRepo,
  888.         VisaBilansRepository $visaBilansRepository,
  889.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  890.         Request $theRequest,
  891.         PaginatorInterface $thePaginator,
  892.         EntityManagerInterface $em,
  893.         Session $session,
  894.         Request $req,
  895.         SluggerInterface $slugger,
  896.         $idProjet,
  897.         $lot
  898.     ) {
  899.         $session->start();
  900.         $session->set("lastPage""lot");
  901.         if (!$this->isGranted('ROLE_ADMIN')) {
  902.             $typeFormFilter 'utilisateur';
  903.             $idUser $this->getUser() ? $this->getUser()->getId() : null;;
  904.         } else {
  905.             $typeFormFilter 'admin';
  906.             $idUser null;
  907.         }
  908.         //De quel projet parle-t-on ?
  909.         $projet $visaProjetsRepo->find($idProjet);
  910.         $criteria = ['idProjet' => $idProjet'Lot' => $lot];
  911.         /** @var VisaContacts $VisaContactUser */
  912.         $VisaContactUser $visaContactsRepository->findOneBy($criteria);
  913.         $criteria = array("idProjet" => $idProjet"lot" => $lot);
  914.         $listExigences $visaExigencesRepo->findBy($criteria);
  915.         $formEmail $this->createForm(VisaLotBilan::class, null, [
  916.             'idProjet' => $idProjet,
  917.             'lot' => $lot
  918.         ]);
  919.         $formEmail->handleRequest($req);
  920.         if ($formEmail->isSubmitted() && $formEmail->isValid()) {
  921.             $from = new Address($formEmail->get('email')->getData());
  922.             $to = new Address($formEmail->get('email')->getData());
  923.             $subject "Liste des exigences pour le lot  " $lot " du projet " $projet->getNomDuProjet();
  924.             $email = (new TemplatedEmail());
  925.             $email->htmlTemplate('bilan.html.twig');
  926.             $email->textTemplate('bilan.text.twig');
  927.             $email->context([
  928.                 'title' => $subject,
  929.                 'preambule' => $formEmail->get('preambule')->getData(),
  930.                 'listExigences' => $listExigences,
  931.                 'idProjet' => $idProjet,
  932.             ]);
  933. //            $message = $this->renderView('bilan.html.twig', [
  934. //                'title' => $subject,
  935. //                'preambule' => $formEmail->get('preambule')->getData(),
  936. //                'listExigences' => $listExigences,
  937. //                'idProjet' => $idProjet,
  938. //            ]);
  939. //            $email = (new Email())
  940.             $email->from($from)
  941.                 ->to($to);
  942.             if (trim($formEmail->get('copie_a')->getData())) {
  943.                 $email->cc($formEmail->get('copie_a')->getData());
  944.             }
  945.             if ($formEmail->get('repondre_a')->getData()) {
  946.                 $email->replyTo($formEmail->get('repondre_a')->getData());
  947.             }
  948.             $email->getHeaders()
  949.                 ->addTextHeader('X-Priority''1')
  950.                 ->addTextHeader('X-MSMail-Priority''High')
  951.                 ->addTextHeader('X-UIDL'md5(uniqid(time())));
  952.             $email->subject($subject);
  953. //            $email->html($message);
  954.             try {
  955.                 $mailer->send($email);
  956.                 $this->addFlash('success''Le mail a bien été envoyé');
  957.                 // Mise à jour des données VisaBilans
  958.                 $VisaBilans $visaBilansRepository->findOneBy(['idProjet' => $idProjet'lot' => $lot]);
  959.                 if (!$VisaBilans) {
  960.                     $VisaBilans = new VisaBilans();
  961.                     $VisaBilans->setIdProjet($projet);
  962.                     $VisaBilans->setLot($lot);
  963.                 }
  964.                 $VisaBilans->setEmail($formEmail->get('email')->getData());
  965.                 $VisaBilans->setRappel($formEmail->get('rappel')->getData());
  966.                 $VisaBilans->setCopieA($formEmail->get('copie_a')->getData());
  967.                 $VisaBilans->setRepondreA($formEmail->get('repondre_a')->getData());
  968.                 $VisaBilans->setPreambule($formEmail->get('preambule')->getData());
  969.                 $em->persist($VisaBilans);
  970.                 $em->flush();
  971.             } catch (TransportExceptionInterface $e) {
  972.                 $this->addFlash('error'$e->getMessage());
  973.             }
  974.         } else {
  975.             // Si le formulaire n'est pas soumis ou n'est pas valide, on retourne un message d'erreur
  976.             $this->addFlash('error''Une erreur est survenue de la saisie des informations');
  977.             if ($formEmail->getErrors(true)->count() > 0) {
  978.                 foreach ($formEmail->getErrors(true) as $error) {
  979.                     $this->addFlash('error'$error->getMessage());
  980.                 }
  981.             }
  982.         }
  983.         return $this->redirectToRoute('lot', ['idProjet' => $idProjet'lot' => $lot]);
  984.     }
  985.     #[Route(path'{code}/lot-{lot}'name'lot'options: ['expose' => true])]
  986.     public function lot(
  987.         VisaContactsRepository $visaContactsRepository,
  988.         VisaBilansRepository $visaBilansRepository,
  989.         VisaExigencesRepository $visaExigencesRepo,
  990.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  991.         Request $theRequest,
  992.         PaginatorInterface $thePaginator,
  993.         EntityManagerInterface $em,
  994.         Session $session,
  995.         Request $req,
  996.         SluggerInterface $slugger,
  997.         $code,
  998.         $lot
  999.     ) {
  1000.         //démarrage session
  1001.         $session->start();
  1002.         $session->set("lastPage""lot");
  1003.                 $session->set("code""$code");
  1004.                 $session->set("lot""$lot");
  1005.         if (!$this->isGranted('ROLE_ADMIN')) {
  1006.             $typeFormFilter 'utilisateur';
  1007. //            $idUser = $this->getUser()->getId();
  1008.             $user $this->getUser();
  1009.             $idUser $user $user->getId() : null;
  1010. //            $idUser = $this->getUser()->getId();
  1011.         } else {
  1012.             $typeFormFilter 'admin';
  1013.             $idUser null;
  1014.         }
  1015.         //De quel projet parle-t-on ?
  1016.               $projet $visaProjetsRepo->findOneBy(array("code" => $code));
  1017.                 $idProjet $projet->getId();
  1018.         $criteria = ['idProjet' => $idProjet'Lot' => $lot];
  1019.         /** @var VisaContacts $VisaContactUser */
  1020.         $VisaContactUser $visaContactsRepository->findOneBy($criteria);
  1021.         //création du formulaire de nouveau fichier ////// => à transformer en plusieurs dropzones
  1022.         $nouveau_fichier = new UploadFichierDTO;
  1023.         $form $this->createForm(UploadFichierType::class, $nouveau_fichier);
  1024.         $form->handleRequest($req);
  1025.         $exigence $visaExigencesRepo->find(229); /////// à changer : l'id de l'exigence doit être variable en fonction de là où on drope
  1026.         $criteria = array("idProjet" => $idProjet"lot" => $lot);
  1027.         $listExigences $visaExigencesRepo->findBy($criteria);
  1028.         $VisaBilans $visaBilansRepository->findOneBy([
  1029.             'idProjet' => $idProjet,
  1030.             'lot' => $lot
  1031.         ]);
  1032.         $formEmail $this->createForm(VisaLotBilan::class, $VisaBilans,
  1033.             [
  1034.                 'action' => $this->generateUrl('emailLot', ['idProjet' => $idProjet'lot' => $lot]),
  1035.                 'idProjet' => $idProjet,
  1036.                 'lot' => $lot
  1037.             ]);
  1038.         //Action si envoyé
  1039.         if ($form->isSubmitted() && $form->isValid()) {
  1040.             $files $form->get('fichier')->getData();
  1041.             if ($files) {
  1042.                 foreach ($files as $file) {
  1043.                     $filename $file->getClientOriginalName();
  1044.                     $originalFilename pathinfo($filenamePATHINFO_FILENAME);
  1045.                     $safeFilename $slugger->slug($originalFilename);
  1046.                     $newFilename $safeFilename '-' uniqid() . '.' $file->guessExtension();
  1047.                     // Check if directory exists with $IdProjet at end
  1048.                     if (!is_dir('IMPORTSVISA/JUSTIFICATIFS/' $idProjet)) {
  1049.                         mkdir('IMPORTSVISA/JUSTIFICATIFS/' $idProjet0777true);
  1050.                     }
  1051.                     $file->move('IMPORTSVISA/JUSTIFICATIFS/' $idProjet$newFilename);
  1052.                     $justif = new \App\Entity\Visa\VisaJustificatifs();
  1053.                     $justif->setNomDuFichier($newFilename);
  1054.                     $time date('d/m/y H:i');
  1055.                     $justif->setDate($time);
  1056.                     $justif->setExigence($exigence);
  1057.                     $justif->setProjet($projet);
  1058.                     $em->persist($justif);
  1059.                     $em->flush();
  1060.                 }
  1061.             }
  1062.         }
  1063.                 
  1064.                 //Définition des sous lots pour affichage
  1065.             $listExigences $visaExigencesRepo->findBy(array("idProjet" => $idProjet"lot" => $lot));
  1066.             $sousLots = [];
  1067.             foreach ($listExigences as $exigence) {
  1068.                 $sousLots [] = $exigence->getSousLot();
  1069.             }
  1070.             $sousLots array_unique($sousLots);
  1071.             $listeSousLots [$lot] = $sousLots;                
  1072.                 ////dump($listeSousLots);
  1073.                 
  1074.         return $this->render('lot.html.twig', [
  1075.             'listExigences' => $listExigences,
  1076.             'idProjet' => $idProjet,
  1077.             'lot' => $lot,
  1078.             'contact' => $VisaContactUser,
  1079.             'formEmail' => $formEmail $formEmail->createView() : '',
  1080.             'form' => $form->createView(),
  1081.                     'projet' => $projet,
  1082.                     'listeSousLots' => $listeSousLots
  1083.         ]);
  1084.     }
  1085.     #[Route(path'{code}/cible-{ciblePropre}'name'cible'options: ['expose' => true])]
  1086.     public function cible(
  1087.         VisaContactsRepository $visaContactsRepository,
  1088.         VisaBilansRepository $visaBilansRepository,
  1089.         VisaExigencesRepository $visaExigencesRepo,
  1090.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  1091.         Request $theRequest,
  1092.         PaginatorInterface $thePaginator,
  1093.         EntityManagerInterface $em,
  1094.         Session $session,
  1095.         Request $req,
  1096.         SluggerInterface $slugger,
  1097.         $code,
  1098.         $ciblePropre
  1099.     ) {
  1100.         //démarrage session
  1101.         $session->start();
  1102.         $session->set("lastPage""cible");
  1103.                 $listeCibles $session->get("listeCibles");
  1104.                 
  1105.         //De quel projet parle-t-on ?
  1106.               $projet $visaProjetsRepo->findOneBy(array("code" => $code));
  1107.                 $idProjet $projet->getId();
  1108.                 
  1109.                 foreach ($listeCibles as $cible){
  1110.                     if ($cible["ciblePropre"] == $ciblePropre){
  1111.                         $listeIdExigences $cible["idExigences"];
  1112.                         $nomCible $cible["cibles"];
  1113.                     }
  1114.                 }
  1115.                 
  1116.                 foreach ($listeIdExigences as $idExigence){
  1117.                     $listExigences[] = $visaExigencesRepo->find($idExigence);
  1118.                 }                
  1119.                
  1120.         return $this->render('cible.html.twig', [
  1121.             'listExigences' => $listExigences,
  1122.             'idProjet' => $idProjet,
  1123.                          'nomCible' => $nomCible,
  1124.                         'code' => $code,
  1125.                     
  1126.             'cible' => $cible,
  1127.         ]);
  1128.     }
  1129.         
  1130.         #[Route(path'nonValides/{code}'name'nonValides'options: ['expose' => true])]
  1131.     public function nonValides(
  1132.         VisaExigencesRepository $visaExigencesRepo,
  1133.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  1134.         Request $theRequest,
  1135.         PaginatorInterface $thePaginator,
  1136.         EntityManagerInterface $em,
  1137.         Session $session,
  1138.         Request $req,
  1139.         SluggerInterface $slugger,
  1140.         $code
  1141.     ) {
  1142.         //démarrage session
  1143.         $session->start();
  1144.         $session->set("lastPage""cible");
  1145.                 
  1146.         //De quel projet parle-t-on ?
  1147.               $projet $visaProjetsRepo->findOneBy(array("code" => $code));
  1148.                 $idProjet $projet->getId();               
  1149.               
  1150.                 $arrayCriteres = ["idProjet" => $idProjet"validation" => null];
  1151.                 $listExigences[] = $visaExigencesRepo->findBy($arrayCriteres);
  1152.                                 
  1153.                
  1154.         return $this->render('nonValides.html.twig', [
  1155.             'listExigences' => $listExigences,
  1156.             'idProjet' => $idProjet,
  1157.                         'code' => $code                   
  1158.         ]);
  1159.     }
  1160.     #[Route(path'{code}/exigence-{exigence}'name'exigence'options: ['expose' => true])]
  1161.     public function exigence(
  1162.         VisaExigencesRepository $visaExigencesRepo,
  1163.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  1164.         Request $theRequest,
  1165.         PaginatorInterface $thePaginator,
  1166.         EntityManagerInterface $em,
  1167.         VisaJustificatifsRepository $visaJustificatifsRepo,
  1168.         Session $session,
  1169.         Request $req,
  1170.         SluggerInterface $slugger,
  1171.         $code,
  1172.         $exigence
  1173.     ) {
  1174.         //démarrage session
  1175.         $session->start();
  1176.         $session->set("lastPage""import");
  1177.         if (!$this->isGranted('ROLE_ADMIN')) {
  1178.             $typeFormFilter 'utilisateur';
  1179. //            $idUser = $this->getUser()->getId();
  1180.             $idUser $this->getUser() ? $this->getUser()->getId() : null;
  1181.         } else {
  1182.             $typeFormFilter 'admin';
  1183.             $idUser null;
  1184.         }
  1185.         //De quel projet parle-t-on ?
  1186.               $projet $visaProjetsRepo->findOneBy(array("code" => $code));
  1187.                 $idProjet $projet->getId();
  1188.         //De quelle exigence parle-t-on ?
  1189.         $exigence $visaExigencesRepo->find($exigence);
  1190.         //formulaire de modification de l'exigence
  1191.         $form $this->createForm(\App\Form\Visa\VisaExigencesType::class, $exigence);
  1192.         $form->handleRequest($req);
  1193.         if ($form->isSubmitted()) {
  1194.             if ($form->isValid()) {
  1195.                                                         
  1196.         $projet $visaProjetsRepo->find($idProjet);                
  1197.                 //le projet est en mode démo ?
  1198.                 $dateFinPaiement $projet->getDateFinPaiement();
  1199.                 $code $projet->getCode();
  1200.                 $dateActuelle = new \DateTime();                
  1201.                 if ($dateFinPaiement $dateActuelle ){
  1202.                 $this->addFlash('success'self::MSG_DEMO);
  1203.                 return $this->redirectToRoute('tri', ['code' => $code]);
  1204.                 }
  1205.                 
  1206.                             
  1207.                 $em->persist($exigence);
  1208.                 $em->flush();
  1209.             }
  1210.         }
  1211.         //formulaire de modification du commentaire entreprise
  1212.         $formEntreprise $this->createForm(\App\Form\Visa\VisaCommentaireEntrepriseType::class, $exigence);
  1213.         $formEntreprise->handleRequest($req);
  1214.         if ($formEntreprise->isSubmitted()) {
  1215.             if ($formEntreprise->isValid()) {
  1216.                             
  1217.                             
  1218.         $projet $visaProjetsRepo->find($idProjet);                
  1219.                 //le projet est en mode démo ?
  1220.                 $dateFinPaiement $projet->getDateFinPaiement();
  1221.                 $code $projet->getCode();
  1222.                 $dateActuelle = new \DateTime();                
  1223.                 if ($dateFinPaiement $dateActuelle ){
  1224.                 $this->addFlash('success'self::MSG_DEMO);
  1225.                 return $this->redirectToRoute('tri', ['code' => $code]);
  1226.                 }
  1227.                 
  1228.                             
  1229.                 $em->persist($exigence);
  1230.                 $em->flush();
  1231.             }
  1232.         }
  1233.         $criteria = array("exigence" => $exigence);
  1234.         $listJustificatifs $visaJustificatifsRepo->findBy($criteria);
  1235.         return $this->render('exigence.html.twig', [
  1236.             'exigence' => $exigence,
  1237.             'listJustificatifs' => $listJustificatifs,
  1238.                         'projet' => $projet,
  1239.             'idProjet' => $idProjet,
  1240.             'form' => $form->createView(),
  1241.             'formEntreprise' => $formEntreprise->createView()
  1242.         ]);
  1243.     }
  1244.         
  1245.         #[Route(path'{code}/nouvelleExigence'name'nouvelleExigence'options: ['expose' => true])]
  1246.     public function nouvelleExigence(
  1247.             VisaExigencesRepository $visaExigencesRepo,
  1248.             \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  1249.             Request $theRequest,
  1250.             EntityManagerInterface $em,
  1251.             Session $session,
  1252.             Request $req,
  1253.             SluggerInterface $slugger,
  1254.             $code
  1255.     ) {
  1256.         //démarrage session
  1257.         $session->start();
  1258.         //$session->set("lastPage", "nouvelleExigence");
  1259.         if (!$this->isGranted('ROLE_ADMIN')) {
  1260.             $typeFormFilter 'utilisateur';
  1261. //            $idUser = $this->getUser()->getId();
  1262.             $idUser $this->getUser() ? $this->getUser()->getId() : null;
  1263.         } else {
  1264.             $typeFormFilter 'admin';
  1265.             $idUser null;
  1266.         }
  1267.         //De quel projet parle-t-on ?
  1268.         $projet $visaProjetsRepo->findOneBy(array("code" => $code));
  1269.         $idProjet $projet->getId();
  1270.         
  1271.         //le projet est en mode démo ?
  1272.         $dateFinPaiement $projet->getDateFinPaiement();
  1273.         $dateActuelle = new \DateTime();
  1274.         $dateDans31Jours = clone $dateActuelle;
  1275.         $dateDans31Jours->modify('+31 days');
  1276.         $diff = isset($dateFinPaiement) ? $dateActuelle->diff($projet->getDateFinPaiement()) : null;
  1277.         
  1278.         
  1279.         $user $idUser $this->getDoctrine()->getRepository(User::class)->find($idUser) : null;
  1280.         //formulaire de modification de l'exigence
  1281.         $nouvelleExigence = new VisaExigences();
  1282.         $lastPage $session->get('lastPage');
  1283.         if ($lastPage == 'lot') {
  1284.             $form $this->createForm(\App\Form\Visa\VisaNouvelleExigenceAvecLotType::class, $nouvelleExigence);
  1285.             $lot $session->get('lot');
  1286.             $nouvelleExigence->setLot($lot);
  1287.         } else {
  1288.             $form $this->createForm(\App\Form\Visa\VisaNouvelleExigenceType::class, $nouvelleExigence);
  1289.         }
  1290.         $form->handleRequest($req);
  1291.         if ($form->isSubmitted() and $dateFinPaiement date()) {
  1292.             if ($form->isValid()) {
  1293.                 
  1294.                             
  1295.                             $numeroExigence $visaExigencesRepo->findMaxNumeroExigenceByProjet($projet) + 1;
  1296.                 
  1297.                 $nouvelleExigence->setIdUser($user);
  1298.                 $nouvelleExigence->setIdProjet($projet);                
  1299.                 $nouvelleExigence->setNumeroExigence($numeroExigence);
  1300.                 
  1301.                 
  1302.                 $em->persist($nouvelleExigence);
  1303.                 $em->flush();
  1304.             }
  1305.                         
  1306.                         if ($lastPage == 'lot'){
  1307.                         return $this->redirectToRoute('lot', ['code' => $code'lot' => $lot]);
  1308.                         } else {
  1309.                             return $this->redirectToRoute('tri', ['code' => $code]);
  1310.                         }
  1311.         }
  1312.         return $this->render('nouvelleExigence.html.twig', [
  1313.                     'nouvelleExigence' => $nouvelleExigence,
  1314.             'idProjet' => $idProjet,
  1315.                         'projet' => $projet,
  1316.                         'code' => $code,             
  1317.             'form' => $form->createView(),
  1318.                     'dateDans31Jours' => $dateDans31Jours,
  1319.                     'diff' => $diff
  1320.         ]);
  1321.     }
  1322.         
  1323.         #[Route(path'suppExigence/{idProjet}/lot/{idLot}/{idExigence}'name'exigenceSupp'options: ['expose' => true])]
  1324.     public function exigenceSupp(
  1325.         VisaExigencesRepository $visaExigencesRepo,
  1326.         EntityManagerInterface $em,
  1327.                 VisaProjetsRepository $visaProjetsRepo,
  1328.         $idProjet,
  1329.         $idLot,
  1330.         $idExigence
  1331.     ) {
  1332.             
  1333.             
  1334.         $projet $visaProjetsRepo->find($idProjet);                
  1335.                 //le projet est en mode démo ?
  1336.                 $dateFinPaiement $projet->getDateFinPaiement();
  1337.                 $code $projet->getCode();
  1338.                 $dateActuelle = new \DateTime();                
  1339.                 if ($dateFinPaiement $dateActuelle ){
  1340.                 $this->addFlash('success'self::MSG_DEMO);
  1341.                 return $this->redirectToRoute('tri', ['code' => $code]);
  1342.                 }
  1343.                 
  1344.          
  1345.             
  1346.             
  1347.         $exigence $visaExigencesRepo->find($idExigence);
  1348.         $em->remove($exigence);
  1349.         $em->flush();
  1350.         return $this->redirectToRoute('lot', ['idProjet' => $idProjet'lot' => $idLot]);
  1351.     }
  1352.     #[Route(path'{idProjet}/lot/{idLot}/fichier/{idFichier}'name'fichierLot'options: ['expose' => true])]
  1353.     public function fichierLot(
  1354.         VisaExigencesRepository $visaExigencesRepo,
  1355.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  1356.         Request $theRequest,
  1357.         PaginatorInterface $thePaginator,
  1358.         EntityManagerInterface $em,
  1359.         VisaJustificatifsRepository $visaJustificatifsRepo,
  1360.         Session $session,
  1361.         Request $req,
  1362.         SluggerInterface $slugger,
  1363.         $idProjet,
  1364.         $idLot,
  1365.         $idFichier
  1366.     ) {
  1367.         $session->start();
  1368.         $session->set("lastPage""lot");
  1369.         if (!$this->isGranted('ROLE_ADMIN')) {
  1370.             $typeFormFilter 'utilisateur';
  1371. //            $idUser = $this->getUser()->getId();
  1372.             $idUser $this->getUser() ? $this->getUser()->getId() : null;
  1373.         } else {
  1374.             $typeFormFilter 'admin';
  1375.             $idUser null;
  1376.         }
  1377.                 
  1378.                                 $projet $visaProjetsRepo->find($idProjet);
  1379.                 
  1380.                 //le projet est en mode démo ?
  1381.                 $dateFinPaiement $projet->getDateFinPaiement();
  1382.                 $code $projet->getCode();
  1383.                 $dateActuelle = new \DateTime();
  1384.                 
  1385.                 if ($dateFinPaiement $dateActuelle ){
  1386.         $fichier $visaJustificatifsRepo->find($idFichier);
  1387.         if ($fichier && $fichier->getId()) {
  1388.             // Pour compatibilité avec les anciens fichiers
  1389.             if (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $fichier->getNomDuFichier())) {
  1390.                 return $this->file('IMPORTSVISA/JUSTIFICATIFS/' $fichier->getNomDuFichier());
  1391.             } elseif (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $fichier->getNomDuFichier())) {
  1392.                 return $this->file('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $fichier->getNomDuFichier());
  1393.             }
  1394.         }
  1395.         throw $this->createNotFoundException('Fichier inexistant');
  1396.                 } else {
  1397.                     $this->addFlash('success'self::MSG_DEMO);
  1398.                     return $this->redirectToRoute('tri', ['code' => $code]);
  1399.                 }
  1400.     }
  1401.     #[Route(path'{idProjet}/lot/{idLot}/fichierSupp/{idFichier}/{idExigence}'name'fichierSupp'options: ['expose' => true])]
  1402.     public function fichierSupp(
  1403.         VisaExigencesRepository $visaExigencesRepo,
  1404.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  1405.         Request $theRequest,
  1406.         EntityManagerInterface $em,
  1407.         VisaJustificatifsRepository $visaJustificatifsRepo,
  1408.         Session $session,
  1409.         Request $req,
  1410.         SluggerInterface $slugger,
  1411.         $idProjet,
  1412.         $idLot,
  1413.         $idFichier,
  1414.         $idExigence
  1415.     ) {
  1416.             
  1417.                 $projet $visaProjetsRepo->find($idProjet);                
  1418.                 //le projet est en mode démo ?
  1419.                 $dateFinPaiement $projet->getDateFinPaiement();
  1420.                 $code $projet->getCode();
  1421.                 $dateActuelle = new \DateTime();
  1422.                 
  1423.                 if ($dateFinPaiement $dateActuelle ){
  1424.                 $fichier $visaJustificatifsRepo->find($idFichier);
  1425.         $em->remove($fichier);
  1426.         $em->flush();
  1427.                 } else {
  1428.                     $this->addFlash('success'self::MSG_DEMO);
  1429.                 }
  1430.         return $this->redirectToRoute('exigence', ['code' => $code'exigence' => $idExigence]);
  1431.     }
  1432.     #[Route(path'{idProjet}/download'name'projetZip'options: ['expose' => true])]
  1433.     public function projetDownloadZipFiles(
  1434.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  1435.         VisaJustificatifsRepository $visaJustificatifsRepo,
  1436.         $idProjet
  1437.     ) {
  1438.         $projet $visaProjetsRepo->find($idProjet);                
  1439.                 //le projet est en mode démo ?
  1440.                 $dateFinPaiement $projet->getDateFinPaiement();
  1441.                 $code $projet->getCode();
  1442.                 $dateActuelle = new \DateTime();                
  1443.                 if ($dateFinPaiement $dateActuelle ){
  1444.                 $this->addFlash('success'self::MSG_DEMO);
  1445.                 return $this->redirectToRoute('tri', ['code' => $code]);
  1446.                 }
  1447.                 
  1448.                 
  1449.         $zip = new ZipArchive();
  1450.         // sanitize projet name
  1451.         $filename '../var/projet_' Sanitize::sanitize_file_name($projet->getNomDuProjet()) . '.zip';
  1452.         $zip->open($filenameZipArchive::CREATE ZipArchive::OVERWRITE);
  1453.         // get all VisaJustificatifs for this projet
  1454.         $justificatifs $visaJustificatifsRepo->findBy(['projet' => $projet]);
  1455.         foreach ($justificatifs as $justificatif) {
  1456.             $exigence $justificatif->getExigence();
  1457.             $lot Sanitize::sanitize_file_name($exigence->getLot());
  1458.             // Pour compatibilité avec les anciens fichiers
  1459.             if (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier())) {
  1460.                 $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier(),
  1461.                     $lot '/' $justificatif->getNomDuFichier());
  1462.             } elseif (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier())) {
  1463.                 $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier(),
  1464.                     $lot '/' $justificatif->getNomDuFichier());
  1465.             }
  1466.         }
  1467.         // Zip archive will be created only after closing object
  1468.         $zip->close();
  1469.         return $this->file($filename);
  1470.     }
  1471.     #[Route(path'{idProjet}/cibledownload'name'projetZipCicle'options: ['expose' => true])]
  1472.     public function projetDownloadZipFilesByCible(
  1473.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  1474.         VisaJustificatifsRepository $visaJustificatifsRepo,
  1475.         VisaExigencesRepository $visaExigencesRepo,
  1476.         $idProjet
  1477.     ) {
  1478.         $projet $visaProjetsRepo->find($idProjet);                
  1479.                 //le projet est en mode démo ?
  1480.                 $dateFinPaiement $projet->getDateFinPaiement();
  1481.                 $code $projet->getCode();
  1482.                 $dateActuelle = new \DateTime();                
  1483.                 if ($dateFinPaiement $dateActuelle ){
  1484.                 $this->addFlash('success'self::MSG_DEMO);
  1485.                 return $this->redirectToRoute('tri', ['code' => $code]);
  1486.                 }
  1487.                 
  1488.         $zip = new ZipArchive();
  1489.         // sanitize projet name
  1490.         $filename '../var/projet_' Sanitize::sanitize_file_name($projet->getNomDuProjet()) . '.zip';
  1491. //        $criteria = array("idProjet" => $idProjet);
  1492. //        $listExigences = $visaExigencesRepo->findBy($criteria);
  1493. //        $listCibles = [];
  1494. //        foreach ($listExigences as $exigence) {
  1495. //            $cibles = explode(',',$exigence->getCibles());
  1496. //            if($cibles) {
  1497. //                $cibles=array_filter(array_map(function($e) {return trim($e);},$cibles));
  1498. //            }
  1499. //            if($cibles) {
  1500. //                foreach($cibles as $cible) {
  1501. //                    if(!isset($listCibles[$cible])) $listCibles[$cible]=[];
  1502. //                    $listCibles[$cible][]= $exigence;
  1503. //                }
  1504. //            }
  1505. //        }
  1506.         $zip->open($filenameZipArchive::CREATE ZipArchive::OVERWRITE);
  1507. //        foreach($listCibles as $cible => $exigences) {
  1508. //            $lots = [];
  1509. //        }
  1510. //
  1511.         $exigences =
  1512.             // get all VisaJustificatifs for this projet
  1513.         $justificatifs $visaJustificatifsRepo->findBy(['projet' => $projet]);
  1514.         foreach ($justificatifs as $justificatif) {
  1515.             $exigence $justificatif->getExigence();
  1516.             $lot Sanitize::sanitize_file_name($exigence->getLot());
  1517.             $cibles explode(','$exigence->getCibles());
  1518.             if ($cibles) {
  1519.                 $cibles array_filter(array_map(function ($e) {
  1520.                     return trim($e);
  1521.                 }, $cibles));
  1522.             }
  1523.             // Pour compatibilité avec les anciens fichiers
  1524.             if (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier())) {
  1525.                 if ($cibles) {
  1526.                     foreach ($cibles as $cible) {
  1527.                         $cible Sanitize::sanitize_file_name($cible);
  1528.                         $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier(),
  1529.                             $cible '/lot-' $lot '/' $justificatif->getNomDuFichier());
  1530.                     }
  1531.                 } else {
  1532.                     $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier(),
  1533.                         'SANS-CIBLE/lot-' $lot '/' $justificatif->getNomDuFichier());
  1534.                 }
  1535.             } elseif (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier())) {
  1536.                 if ($cibles) {
  1537.                     foreach ($cibles as $cible) {
  1538.                         $cible Sanitize::sanitize_file_name($cible);
  1539.                         $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier(),
  1540.                             $cible '/lot-' $lot '/' $justificatif->getNomDuFichier());
  1541.                     }
  1542.                 } else {
  1543.                     $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier(),
  1544.                         'SANS-CIBLE/lot-' $lot '/' $justificatif->getNomDuFichier());
  1545.                 }
  1546.             }
  1547.         }
  1548.         // Zip archive will be created only after closing object
  1549.         $zip->close();
  1550.         return $this->file($filename);
  1551.     }
  1552.     #[Route(path'{idProjet}/lot/{lot}/download'name'lotZip'options: ['expose' => true])]
  1553.     public function lotDownloadZipFiles(
  1554.         VisaProjetsRepository $visaProjetsRepo,
  1555.         VisaJustificatifsRepository $visaJustificatifsRepo,
  1556.         VisaExigencesRepository $visaExigencesRepo,
  1557.         $idProjet,
  1558.         $lot
  1559.     ) {
  1560.             //dump($idProjet);
  1561.             
  1562.                 $projet $visaProjetsRepo->find($idProjet);                
  1563.                 //le projet est en mode démo ?
  1564.                 $dateFinPaiement $projet->getDateFinPaiement();
  1565.                 $code $projet->getCode();
  1566.                 $dateActuelle = new \DateTime();                
  1567.                 if ($dateFinPaiement $dateActuelle ){
  1568.                 $this->addFlash('success'self::MSG_DEMO);
  1569.                 return $this->redirectToRoute('tri', ['code' => $code]);
  1570.                 } 
  1571.         $zip = new ZipArchive();
  1572.         // sanitize projet name
  1573.         $filename '../var/projet_' Sanitize::sanitize_file_name($projet->getNomDuProjet()) . '_lot_' $lot '.zip';
  1574.         $zip->open($filenameZipArchive::CREATE ZipArchive::OVERWRITE);
  1575.         $criteria = array("idProjet" => $idProjet"lot" => $lot);
  1576.         $listExigences $visaExigencesRepo->findBy($criteria);
  1577.         $criteria = array("projet" => $projet"exigence" => $listExigences);
  1578.         // get all VisaJustificatifs for this projet
  1579.         $justificatifs $visaJustificatifsRepo->findBy($criteria);
  1580.                 if (isset($justificatifs)){
  1581.                             foreach ($justificatifs as $justificatif) {
  1582.             $exigence $justificatif->getExigence();
  1583.             $lot Sanitize::sanitize_file_name($exigence->getLot());
  1584.             // Pour compatibilité avec les anciens fichiers
  1585.             if (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier())) {
  1586.                 $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier(),
  1587.                     $justificatif->getNomDuFichier());
  1588.             } elseif (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier())) {
  1589.                 $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier(),
  1590.                     $justificatif->getNomDuFichier());
  1591.             }
  1592.                     }
  1593.                     $zip->close();
  1594.                     return $this->file($filename);
  1595.                 } else {
  1596.                 $this->addFlash('success''Il n\'y a pas de fichier pour ce lot');
  1597.                 return $this->redirectToRoute('tri', ['code' => $code]);
  1598.                 }
  1599.         // Zip archive will be created only after closing object
  1600.         
  1601.     }
  1602.         
  1603. //    /**
  1604. //     * @Route("/fichierExemple", name="fichierExemple", options={"expose" : true})
  1605. //     */
  1606. //    public function fichierExemple(): \Symfony\Component\HttpFoundation\BinaryFileResponse {
  1607. //
  1608. //        
  1609. //        return $this->redirect('http://www.quiplusest.coop');
  1610. //    }
  1611.     
  1612. }