src/Controller/Visa/VisaController.php line 1041

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 App\DTO\UploadFichierDTO;
  20. use App\Form\UploadFichierType;
  21. use App\Service\Sanitize;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use Knp\Component\Pager\PaginatorInterface;
  24. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  25. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\HttpFoundation\Session\Session;
  29. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  30. use Symfony\Component\Mailer\Mailer;
  31. use Symfony\Component\Mailer\Transport;
  32. use Symfony\Component\Mailer\Transport\Transports;
  33. use Symfony\Component\Mime\Address;
  34. use Symfony\Component\Mime\Email;
  35. use Symfony\Component\Mailer\MailerInterface;
  36. use Symfony\Component\Routing\Annotation\Route;
  37. use Symfony\Component\Security\Core\Security;
  38. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  39. use Symfony\Component\HttpFoundation\File\UploadedFile;
  40. use Symfony\Component\String\Slugger\SluggerInterface;
  41. use PhpOffice;
  42. use PhpOffice\PhpSpreadsheet\IOFactory;
  43. use ZipArchive;
  44. use ZipStream\Option\Archive;
  45. class VisaController extends AbstractController
  46. {
  47.     //Nombre de projets listés par page
  48.     const NB_INDEX 20;
  49.     /**
  50.      * @Route("/visa", name="visa")
  51.      */
  52.     public function index(
  53.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  54.         Request $theRequest,
  55.         PaginatorInterface $thePaginator,
  56.         Session $session
  57.     ) {
  58.         //démarrage session
  59.         $session->start();
  60.         $session->set("lastPage""visa");
  61.         if ($this->getUser() == null) {
  62.             $listProjets 0;
  63.         } else {
  64.             if (!$this->isGranted('ROLE_ADMIN')) {
  65.                 $typeFormFilter 'utilisateur';
  66. //            $idUser = $this->getUser()->getId();
  67.                 $idUser $this->getUser() ? $this->getUser()->getId() : null;;
  68.             } else {
  69.                 $typeFormFilter 'admin';
  70.                 $idUser null;
  71.             }
  72.             $listProjetsBuilder $visaProjetsRepo->findAllIndexBuilder($idUser);
  73.             $listProjets $thePaginator->paginate(
  74.                 $listProjetsBuilder,
  75.                 $theRequest->get('page'1),
  76.                 self::NB_INDEX
  77.             );
  78.         }
  79.         return $this->render('visa/index.html.twig', [
  80.             'listProjets' => $listProjets
  81.         ]);
  82.     }
  83.     /**
  84.      * @Route("/visa/nouveauProjet", name="visa_nouveau_projet")
  85.      */
  86.     public function visa_nouveau_projet(EntityManagerInterface $emRequest $reqSession $sessionSecurity $security)
  87.     {
  88.         //'Démarrage de session'
  89.         $session->start();
  90.         $session->set("lastPage""visa_nouveau_projet");
  91.         $this->em $em;
  92.         $this->user $security->getUser();
  93.         //création d'un nouvel object
  94.         $nouveau_projet = new VisaProjets();
  95.         $form $this->createForm(VisaProjetsFormType::class, $nouveau_projet);
  96.         $form->handleRequest($req);
  97.         //Action si envoyé
  98.         if ($form->isSubmitted() && $form->isValid()) {
  99.             //ajout du compte user
  100.             if ($this->user != null) {
  101.                 $nouveau_projet->setIdUser($this->user);
  102.             }
  103.             $em->persist($nouveau_projet);
  104.             $em->flush();
  105.             return $this->redirectToRoute('visa');
  106.         }
  107.         return $this->render('visa/visa_nouveau_projet.html.twig', [
  108.             'form' => $form->createView()
  109.         ]);
  110.     }
  111.     /**
  112.      * @Route("/visa/{idProjet}/listeContacts", name="listeContacts", options={"expose" : true})
  113.      */
  114.     public function listeContacts(
  115.         VisaContactsRepository $visaContactsRepo,
  116.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  117.         Request $theRequest,
  118.         PaginatorInterface $thePaginator,
  119.         EntityManagerInterface $em,
  120.         Session $session,
  121.         Request $req,
  122.         SluggerInterface $slugger,
  123.         $idProjet
  124.     ) {
  125.         //démarrage session
  126.         $session->start();
  127.         $session->set("lastPage""listeContacts");
  128.         if (!$this->isGranted('ROLE_ADMIN')) {
  129.             $typeFormFilter 'utilisateur';
  130. //            $idUser = $this->getUser()->getId();
  131.             $idUser $this->getUser() ? $this->getUser()->getId() : null;;
  132.         } else {
  133.             $typeFormFilter 'admin';
  134.             $idUser null;
  135.         }
  136.         //création du formulaire de nouveau fichier
  137.         $nouveau_fichier = new UploadFichierDTO;
  138.         $form $this->createForm(UploadFichierType::class, $nouveau_fichier);
  139.         $form->handleRequest($req);
  140.         //Action si envoyé
  141.         if ($form->isSubmitted() && $form->isValid()) {
  142.             $files $form->get('fichier')->getData();
  143.             if ($files) {
  144.                 foreach ($files as $file) {
  145.                     $filename $file->getClientOriginalName();
  146.                     $originalFilename pathinfo($filenamePATHINFO_FILENAME);
  147.                     $safeFilename $slugger->slug($originalFilename);
  148.                     $newFilename $safeFilename '-' uniqid() . '.' $file->guessExtension();
  149.                     $data = [];
  150. // open the file
  151.                     $f fopen($file'r');
  152.                     if ($f === false) {
  153.                         die('Cannot open the file ' $filename);
  154.                     }
  155. // read each line in CSV file at a time
  156.                     while (($row fgetcsv($f)) !== false) {
  157.                         $data[] = $row;
  158.                     }
  159. // close the file
  160.                     fclose($f);
  161.                     $numeroLigne 0;
  162.                     foreach ($data as $ligne) {
  163.                         if ($numeroLigne != 0) {
  164.                             $colonneArray explode(";"$ligne['0']);
  165.                             $nouveau_contact = new \App\Entity\Visa\VisaContacts();
  166.                             $nouveau_contact->setPrenom($colonneArray['1']);
  167.                             $nouveau_contact->setNom($colonneArray['2']);
  168.                             $nouveau_contact->setSociete($colonneArray['3']);
  169.                             //ajout du compte user
  170.                             if ($this->getUser() != null) {
  171.                                 $nouveau_contact->setIdUser($this->getUser());
  172.                             }
  173.                             //ajout de l'ID du projet
  174.                             $projet $visaProjetsRepo->find($idProjet);
  175.                             $nouveau_contact->setIdProjet($projet);
  176.                             $em->persist($nouveau_contact);
  177.                             $em->flush();
  178.                         }
  179.                         $numeroLigne $numeroLigne 1;
  180.                     }
  181.                 }
  182.             }
  183.             return $this->redirectToRoute('listeContacts', ['idProjet' => $idProjet]);
  184.         }
  185.         $listContactsBuilder $visaContactsRepo->findAllIndexBuilder($idProjet);
  186.         $listContacts $thePaginator->paginate(
  187.             $listContactsBuilder,
  188.             $theRequest->get('page'1),
  189.             self::NB_INDEX
  190.         );
  191.         return $this->render('visa/listeContacts.html.twig', [
  192.             'listContacts' => $listContacts,
  193.             'idProjet' => $idProjet,
  194.             'form' => $form->createView()
  195.         ]);
  196.     }
  197.     /**
  198.      * @Route("/visa/{idProjet}/editContact/{idContact}", name="visa_edit_contact")
  199.      * @param EntityManagerInterface $em
  200.      * @param Request $req
  201.      * @param Session $session
  202.      * @param Security $security
  203.      * @param $idProjet
  204.      * @param $idContact
  205.      * @param \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo
  206.      * @param VisaContactsRepository $visaContactsRepo
  207.      * @return Response
  208.      */
  209.     public function visa_edit_contact(
  210.         EntityManagerInterface $em,
  211.         Request $req,
  212.         Session $session,
  213.         Security $security,
  214.         $idProjet,
  215.         $idContact,
  216.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  217.         VisaContactsRepository $visaContactsRepo
  218.     ) {
  219.         $session->start();
  220.         $session->set("lastPage""visa_edit_contact");
  221.         $this->em $em;
  222.         $this->user $security->getUser();
  223.         //création d'un nouvel object
  224.         $contact $visaContactsRepo->findOneBy(['id' => $idContact]);
  225.         $form $this->createForm(\App\Form\Visa\VisaContactsType::class, $contact);
  226.         $form->handleRequest($req);
  227.         //Action si envoyé
  228.         if ($form->isSubmitted() && $form->isValid()) {
  229.             $em->persist($contact);
  230.             $em->flush();
  231.             return $this->redirectToRoute('listeContacts', ['idProjet' => $idProjet]);
  232.         }
  233.         $form->setData($contact);
  234.         return $this->render('visa/visa_edit_contact.html.twig', [
  235.             'form' => $form->createView()
  236.         ]);
  237.     }
  238.     /**
  239.      * @Route("/visa/nouveauContact/{idProjet}", name="visa_nouveau_contact", options={"expose" : true})
  240.      */
  241.     public function visa_nouveau_contact(
  242.         EntityManagerInterface $em,
  243.         Request $req,
  244.         Session $session,
  245.         Security $security,
  246.         $idProjet,
  247.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo
  248.     ) {
  249.         //'Démarrage de session'
  250.         $session->start();
  251.         $session->set("lastPage""visa_nouveau_contact");
  252.         $this->em $em;
  253.         $this->user $security->getUser();
  254.         //création d'un nouvel object
  255.         $nouveau_contact = new \App\Entity\Visa\VisaContacts();
  256.         $form $this->createForm(\App\Form\Visa\VisaContactsType::class, $nouveau_contact);
  257.         $form->handleRequest($req);
  258.         //Action si envoyé
  259.         if ($form->isSubmitted() && $form->isValid()) {
  260.             //ajout du compte user
  261.             if ($this->user != null) {
  262.                 $nouveau_contact->setIdUser($this->user);
  263.             }
  264.             //ajout de l'ID du projet
  265.             $projet $visaProjetsRepo->find($idProjet);
  266.             $nouveau_contact->setIdProjet($projet);
  267.             $em->persist($nouveau_contact);
  268.             $em->flush();
  269.             return $this->redirectToRoute('/listeContacts', ['idProjet' => $idProjet]);
  270.         }
  271.         return $this->render('visa/visa_nouveau_contact.html.twig', [
  272.             'form' => $form->createView()
  273.         ]);
  274.     }
  275.     /**
  276.      * @Route("/visa/{idProjet}/listeExigences", name="listeExigences", options={"expose" : true})
  277.      */
  278.     public function listeExigences(
  279.         VisaExigencesRepository $visaExigencesRepo,
  280.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  281.         Request $theRequest,
  282.         PaginatorInterface $thePaginator,
  283.         EntityManagerInterface $em,
  284.         Session $session,
  285.         Request $req,
  286.         SluggerInterface $slugger,
  287.         $idProjet
  288.     ) {
  289.         //démarrage session
  290.         $session->start();
  291.         $session->set("lastPage""listeExigences");
  292.         if (!$this->isGranted('ROLE_ADMIN')) {
  293.             $typeFormFilter 'utilisateur';
  294. //            $idUser = $this->getUser()->getId();
  295.             $idUser $this->getUser() ? $this->getUser()->getId() : null;;
  296.         } else {
  297.             $typeFormFilter 'admin';
  298.             $idUser null;
  299.         }
  300.         //création du formulaire de nouveau fichier
  301.         $nouveau_fichier = new UploadFichierDTO;
  302.         $form $this->createForm(UploadFichierType::class, $nouveau_fichier);
  303.         $form->handleRequest($req);
  304.         //Action si envoyé
  305.         if ($form->isSubmitted() && $form->isValid()) {
  306.             $files $form->get('fichier')->getData();
  307.             if ($files) {
  308.                 foreach ($files as $file) {
  309.                     $sheetData = [];
  310.                     //ouverture de la feuille Excel
  311.                     $spreadsheet IOFactory::load($file);
  312.                     $sheetData $spreadsheet->getActiveSheet()->toArray();
  313. //                    dump($sheetData);
  314.                     $numeroLigne 0;
  315.                     foreach ($sheetData as $ligne) {
  316.                         //dump($ligne);
  317.                         if ($numeroLigne != 0) {
  318.                             $exigence $visaExigencesRepo->findBy(array(
  319.                                 "idProjet" => $idProjet,
  320.                                 "numeroExigence" => $ligne['0']
  321.                             ));
  322.                             if ($exigence) {
  323.                                 $nouvelleExigence $exigence['0'];
  324.                             } else {
  325.                                 $nouvelleExigence = new \App\Entity\Visa\VisaExigences();
  326.                             }
  327. //                                                    
  328.                             //ajout du compte user                            
  329.                             $nouvelleExigence->setIdUser($this->getUser());
  330.                             //ajout de l'ID du projet
  331.                             $projet $visaProjetsRepo->find($idProjet);
  332.                             $nouvelleExigence->setIdProjet($projet);
  333.                             $nouvelleExigence->setNumeroExigence($ligne['0']);
  334.                             $nouvelleExigence->setLot($ligne['1']);
  335.                             $nouvelleExigence->setSousLot($ligne['2']);
  336.                             $nouvelleExigence->setCibles($ligne['3']);
  337.                             $nouvelleExigence->setElementsConcernes($ligne['4']);
  338.                             $nouvelleExigence->setExigences($ligne['5']);
  339.                             $nouvelleExigence->setCommentairesEntreprise($ligne['6']);
  340.                             $nouvelleExigence->setCommentairesMOE($ligne['7']);
  341.                             $nouvelleExigence->setLocalisation($ligne['8']);
  342.                             $em->persist($nouvelleExigence);
  343.                             $em->flush();
  344.                         }
  345.                         $numeroLigne $numeroLigne 1;
  346.                     }
  347.                 }
  348.             }
  349.             return $this->redirectToRoute('listeExigences', ['idProjet' => $idProjet]);
  350.         }
  351.         $listExigencesBuilder $visaExigencesRepo->findAllIndexBuilder($idProjet);
  352.         $listExigences $thePaginator->paginate(
  353.             $listExigencesBuilder,
  354.             $theRequest->get('page'1),
  355.             self::NB_INDEX
  356.         );
  357.         return $this->render('visa/listeExigences.html.twig', [
  358.             'listExigences' => $listExigences,
  359.             'idProjet' => $idProjet,
  360.             'form' => $form->createView()
  361.         ]);
  362.     }
  363.     /**
  364.      * @Route("/visa/{idProjet}/tri", name="tri", options={"expose" : true})
  365.      */
  366.     public function tri(
  367.         VisaExigencesRepository $visaExigencesRepo,
  368.         VisaBilansRepository $visaBilansRepository,
  369.         MailerInterface $mailer,
  370.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  371.         Request $theRequest,
  372.         PaginatorInterface $thePaginator,
  373.         EntityManagerInterface $em,
  374.         Session $session,
  375.         Request $req,
  376.         SluggerInterface $slugger,
  377.         $idProjet
  378.     ) {
  379.         //démarrage session
  380.         $session->start();
  381.         $session->set("lastPage""tri");
  382.                 $session->set("idProjet""$idProjet");
  383.         $VisaBilans $visaBilansRepository->findBy([
  384.             'idProjet' => $idProjet,
  385.         ]);
  386.         $projet $visaProjetsRepo->find($idProjet);
  387.         $listExigences $visaExigencesRepo->findBy(array("idProjet" => $idProjet));
  388.         $lots = [];
  389.                 
  390.                 /// Commence ici l'étude par lot
  391.         foreach ($listExigences as $exigence) {
  392.             $lots [] = $exigence->getLot();
  393.         }
  394.         $listeLots = [];
  395.         $lots array_unique($lots);
  396.         sort($lots);
  397.         $formLots = [];
  398.         $loop 0;
  399.         foreach ($lots as $index => $lot) {
  400.             $visaBilanItem $visaBilansRepository->findOneBy([
  401.                 'idProjet' => $idProjet,
  402.                 'lot' => $lot
  403.             ]);
  404.             if (!$visaBilanItem) {
  405.                 $visaBilanItem = new VisaBilans();
  406.                 $visaBilanItem->setIdProjet($projet);
  407.                 $visaBilanItem->setLot($lot);
  408.             }
  409.             $formLots[++$loop] = $visaBilanItem;
  410.         }
  411.         $formEmail $this->createForm(VisaProjetBilan::class, ['lots' => $formLots], [
  412.             'idProjet' => $idProjet,
  413.         ]);
  414.         $formEmail->handleRequest($req);
  415.         if ($formEmail->isSubmitted() && $formEmail->isValid()) {
  416.             $items = [];
  417.             $lots $formEmail->get('lots')->getData();
  418.             foreach ($lots as $lotEmail) {
  419.                 if ($lotEmail->getEmail() != null) {
  420.                     $lotEmail->setIdProjet($projet);
  421.                     $lotEmail->setCopieA($formEmail->get('copie_a')->getData());
  422.                     $lotEmail->setRepondreA($this->getUser() ? $this->getUser()->getEmail() : null);
  423.                     $lotEmail->setPreambule($formEmail->get('preambule')->getData());
  424.                     $em->persist($lotEmail);
  425.                     $em->flush();
  426.                     $items[] = $lotEmail;
  427.                 } else {
  428.                     if ($lotEmail->getId()) {
  429.                         $em->remove($lotEmail);
  430.                         $em->flush();
  431.                     }
  432.                 }
  433.             }
  434.             /* @var VisaBilans $visaBilanItem */
  435.             if ($items && count($items)) {
  436.                 foreach ($items as $visaBilanItem) {
  437.                     if ($visaBilanItem->getEnvoiEmail()) {
  438.                         $listExigences $visaExigencesRepo->findBy(array(
  439.                             "idProjet" => $idProjet,
  440.                             "lot" => $visaBilanItem->getLot()
  441.                         ));
  442.                         $from $this->getUser() ? $this->getUser()->getEmail() : new Address($visaBilanItem->getEmail());
  443.                         $to = new Address($visaBilanItem->getEmail());
  444.                         $subject "Liste des exigences pour le lot  " $visaBilanItem->getLot() . " du projet " $projet->getNomDuProjet();
  445.                         $email = (new TemplatedEmail());
  446.                         $email->htmlTemplate('visa/bilan.html.twig');
  447.                         $email->textTemplate('visa/bilan.text.twig');
  448.                         $email->context([
  449.                             'title' => $subject,
  450.                             'preambule' => $visaBilanItem->getPreambule(),
  451.                             'listExigences' => $listExigences,
  452.                             'idProjet' => $idProjet,
  453.                         ]);
  454.                         $email->from($from)
  455.                             ->to($to);
  456.                         if (trim($visaBilanItem->getCopieA())) {
  457.                             $email->cc($visaBilanItem->getCopieA());
  458.                         }
  459.                         if ($visaBilanItem->getRepondreA()) {
  460.                             $email->replyTo($visaBilanItem->getRepondreA());
  461.                         }
  462.                         $email->getHeaders()
  463.                             ->addTextHeader('X-Priority''1')
  464.                             ->addTextHeader('X-MSMail-Priority''High')
  465.                             ->addTextHeader('X-UIDL'md5(uniqid(time())));
  466.                         $email->subject($subject);
  467.                         try {
  468.                             $mailer->send($email);
  469.                             $this->addFlash('success''Le mail a bien été envoyé à ' $visaBilanItem->getEmail());
  470.                         } catch (TransportExceptionInterface $e) {
  471.                             $this->addFlash('error'$e->getMessage());
  472.                         }
  473.                     }
  474.                 }
  475.             }
  476.             // Redirection vers la page de tri
  477.             return $this->redirectToRoute('tri', ['idProjet' => $idProjet]);
  478.         }
  479.                 
  480.                 $listeSousLots=[];
  481.         foreach ($lots as $lot) {
  482.             $nbValides 0;
  483.             $nbJustificatifs 0;
  484.             $listExigences $visaExigencesRepo->findBy(array("idProjet" => $idProjet"lot" => $lot));
  485.             $sousLots = [];
  486.             foreach ($listExigences as $exigence) {
  487.                 if ($exigence->getValidation()) {
  488.                     $nbValides++;
  489.                 }
  490.                 if (count($exigence->getVisaJustificatifs())) {
  491.                     $nbJustificatifs++;
  492.                 }
  493.                 $sousLots [] = $exigence->getSousLot();
  494.             }
  495.             $sousLots array_unique($sousLots);
  496.             $listeSousLots [$lot] = $sousLots;
  497.             $listeLots[] = [
  498.                 'lot' => $lot,
  499.                 'nbValides' => $nbValides,
  500.                 'nbExigences' => count($listExigences),
  501.                 'nbJustificatifs' => $nbJustificatifs,
  502.                 'pourcentage' => round($nbValides count($listExigences) * 100),
  503.                 'sousLots' => $sousLots
  504.             ];
  505.         }
  506.                 //////////////////////////////////////
  507.                 /// Ici démarre l'étude par cible
  508.                 //////////////////////////////////////
  509.         $projet $visaProjetsRepo->find($idProjet);
  510.         $listExigences $visaExigencesRepo->findBy(array("idProjet" => $idProjet));
  511.         
  512.                 $cibles = [];
  513.                 
  514.         foreach ($listExigences as $exigence) {
  515.             $cibles[] = $exigence->getCibles();
  516.         }
  517.                 
  518.                 $listeCibles = [];
  519.         $cibles array_unique($cibles);
  520.         sort($cibles);
  521.                 //dump($cibles);
  522.                 $ciblesPropres = [];
  523.         foreach ($cibles as $cible) {
  524.                     
  525.                     if ($cible == null){
  526.                         $cible "Sans cible";                               
  527.                     }
  528.                     $ciblePropre str_replace(".""POINT"$cible);
  529.                     $ciblePropre str_replace("/""BARRE"$ciblePropre);
  530.                     $ciblePropre rawurlencode($ciblePropre);
  531.             $nbValides 0;
  532.             $nbJustificatifs 0;
  533.             $listExigencesCible $visaExigencesRepo->findBy(array("idProjet" => $idProjet"cibles" => $cible));
  534.             
  535.             foreach ($listExigencesCible as $exigence) {
  536.                 if ($exigence->getValidation()) {
  537.                     $nbValides++;
  538.                 }
  539.                 if (count($exigence->getVisaJustificatifs())) {
  540.                     $nbJustificatifs++;
  541.                 }
  542.                 
  543.             }
  544.             $listeCibles[] = [
  545.                 'cibles' => $cible,
  546.                                 'ciblePropre' => $ciblePropre,
  547.                 'nbValides' => $nbValides,
  548.                 'nbExigences' => count($listExigencesCible),
  549.                 'nbJustificatifs' => $nbJustificatifs,
  550.                 'pourcentage' => round($nbValides count($listExigences) * 100),
  551.                 //'sousLots' => $sousLots
  552.             ];
  553.         }
  554. //dump($projet);                
  555.         return $this->render('visa/tri.html.twig', [
  556.             'lots' => $lots,
  557.             'listeLots' => $listeLots,
  558.                         'listeCibles' => $listeCibles
  559.             'ListeSouslots' => $listeSousLots,
  560.             'formEmail' => $formEmail $formEmail->createView() : '',
  561. //            'formLotsEmails' => $formLotsEmailsView,
  562.             'idProjet' => $idProjet,
  563.                         'projet' => $projet
  564.         ]);
  565.     }
  566.     /**
  567.      * @Route("/visa/{idProjet}/exigencedz/{idExigence}", name="exigencedz", options={"expose" : true})
  568.      */
  569.     public function exigencedz(
  570.         VisaExigencesRepository $visaExigencesRepo,
  571.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  572.         Request $theRequest,
  573.         PaginatorInterface $thePaginator,
  574.         EntityManagerInterface $em,
  575.         Session $session,
  576.         Request $req,
  577.         SluggerInterface $slugger,
  578.         $idProjet,
  579.         $idExigence
  580.     ) {
  581.         //démarrage session
  582.         $session->start();
  583.         $session->set("lastPage""lot");
  584.         if (!$this->isGranted('ROLE_ADMIN')) {
  585.             $typeFormFilter 'utilisateur';
  586. //            $idUser = $this->getUser()->getId();
  587.             $idUser $this->getUser() ? $this->getUser()->getId() : null;
  588.         } else {
  589.             $typeFormFilter 'admin';
  590.             $idUser null;
  591.         }
  592.         // On récupère l'objet Exigence
  593.         $exigence $visaExigencesRepo->find($idExigence);
  594.         // On récupère le lot associé
  595.         $lot $exigence->getLot();
  596.         //De quel projet parle-t-on ?
  597.         $projet $visaProjetsRepo->find($idProjet);
  598.         //création du formulaire de nouveau fichier ////// => à transformer en plusieurs dropzones
  599.         $nouveau_fichier = new UploadFichierDTO;
  600.         $form $this->createForm(UploadFichierType::class, $nouveau_fichier);
  601.         $form->handleRequest($req);
  602.         $file $req->files->get('fichier');
  603.         if ($file) {
  604.             $filename $file->getClientOriginalName();
  605.             $originalFilename pathinfo($filenamePATHINFO_FILENAME);
  606.             $safeFilename $slugger->slug($originalFilename);
  607.             $newFilename $safeFilename '-' uniqid() . '.' $file->guessExtension();
  608.             // Check if directory exists with $IdProjet at end
  609.             if (!is_dir('IMPORTSVISA/JUSTIFICATIFS/' $idProjet)) {
  610.                 mkdir('IMPORTSVISA/JUSTIFICATIFS/' $idProjet0777true);
  611.             }
  612.             $file->move('IMPORTSVISA/JUSTIFICATIFS/' $idProjet$newFilename);
  613.             $justif = new \App\Entity\Visa\VisaJustificatifs();
  614.             $justif->setNomDuFichier($newFilename);
  615.             $time date('d/m/y H:i');
  616.             $justif->setDate($time);
  617.             $justif->setExigence($exigence);
  618.             $justif->setProjet($projet);
  619.             $em->persist($justif);
  620.             $em->flush();
  621.         }
  622.         $criteria = array("idProjet" => $idProjet"lot" => $lot);
  623.         $listExigences $visaExigencesRepo->findBy($criteria);
  624.                 
  625.         return $this->render('visa/lot.html.twig', [
  626.             'listExigences' => $listExigences,
  627.             'idProjet' => $idProjet,
  628.             'form' => $form->createView()
  629.         ]);
  630.     }
  631.     /**
  632.      * @Route("/visa/{idProjet}/lot/{lot}/email", name="emailLot", options={"expose" : true})
  633.      */
  634.     public function EmailLot(
  635.         MailerInterface $mailer,
  636.         VisaContactsRepository $visaContactsRepository,
  637.         VisaExigencesRepository $visaExigencesRepo,
  638.         VisaBilansRepository $visaBilansRepository,
  639.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  640.         Request $theRequest,
  641.         PaginatorInterface $thePaginator,
  642.         EntityManagerInterface $em,
  643.         Session $session,
  644.         Request $req,
  645.         SluggerInterface $slugger,
  646.         $idProjet,
  647.         $lot
  648.     ) {
  649.         $session->start();
  650.         $session->set("lastPage""lot");
  651.         if (!$this->isGranted('ROLE_ADMIN')) {
  652.             $typeFormFilter 'utilisateur';
  653.             $idUser $this->getUser() ? $this->getUser()->getId() : null;;
  654.         } else {
  655.             $typeFormFilter 'admin';
  656.             $idUser null;
  657.         }
  658.         //De quel projet parle-t-on ?
  659.         $projet $visaProjetsRepo->find($idProjet);
  660.         $criteria = ['idProjet' => $idProjet'Lot' => $lot];
  661.         /** @var VisaContacts $VisaContactUser */
  662.         $VisaContactUser $visaContactsRepository->findOneBy($criteria);
  663.         $criteria = array("idProjet" => $idProjet"lot" => $lot);
  664.         $listExigences $visaExigencesRepo->findBy($criteria);
  665.         $formEmail $this->createForm(VisaLotBilan::class, null, [
  666.             'idProjet' => $idProjet,
  667.             'lot' => $lot
  668.         ]);
  669.         $formEmail->handleRequest($req);
  670.         if ($formEmail->isSubmitted() && $formEmail->isValid()) {
  671.             $from = new Address($formEmail->get('email')->getData());
  672.             $to = new Address($formEmail->get('email')->getData());
  673.             $subject "Liste des exigences pour le lot  " $lot " du projet " $projet->getNomDuProjet();
  674.             $email = (new TemplatedEmail());
  675.             $email->htmlTemplate('visa/bilan.html.twig');
  676.             $email->textTemplate('visa/bilan.text.twig');
  677.             $email->context([
  678.                 'title' => $subject,
  679.                 'preambule' => $formEmail->get('preambule')->getData(),
  680.                 'listExigences' => $listExigences,
  681.                 'idProjet' => $idProjet,
  682.             ]);
  683. //            $message = $this->renderView('visa/bilan.html.twig', [
  684. //                'title' => $subject,
  685. //                'preambule' => $formEmail->get('preambule')->getData(),
  686. //                'listExigences' => $listExigences,
  687. //                'idProjet' => $idProjet,
  688. //            ]);
  689. //            $email = (new Email())
  690.             $email->from($from)
  691.                 ->to($to);
  692.             if (trim($formEmail->get('copie_a')->getData())) {
  693.                 $email->cc($formEmail->get('copie_a')->getData());
  694.             }
  695.             if ($formEmail->get('repondre_a')->getData()) {
  696.                 $email->replyTo($formEmail->get('repondre_a')->getData());
  697.             }
  698.             $email->getHeaders()
  699.                 ->addTextHeader('X-Priority''1')
  700.                 ->addTextHeader('X-MSMail-Priority''High')
  701.                 ->addTextHeader('X-UIDL'md5(uniqid(time())));
  702.             $email->subject($subject);
  703. //            $email->html($message);
  704.             try {
  705.                 $mailer->send($email);
  706.                 $this->addFlash('success''Le mail a bien été envoyé');
  707.                 // Mise à jour des données VisaBilans
  708.                 $VisaBilans $visaBilansRepository->findOneBy(['idProjet' => $idProjet'lot' => $lot]);
  709.                 if (!$VisaBilans) {
  710.                     $VisaBilans = new VisaBilans();
  711.                     $VisaBilans->setIdProjet($projet);
  712.                     $VisaBilans->setLot($lot);
  713.                 }
  714.                 $VisaBilans->setEmail($formEmail->get('email')->getData());
  715.                 $VisaBilans->setRappel($formEmail->get('rappel')->getData());
  716.                 $VisaBilans->setCopieA($formEmail->get('copie_a')->getData());
  717.                 $VisaBilans->setRepondreA($formEmail->get('repondre_a')->getData());
  718.                 $VisaBilans->setPreambule($formEmail->get('preambule')->getData());
  719.                 $em->persist($VisaBilans);
  720.                 $em->flush();
  721.             } catch (TransportExceptionInterface $e) {
  722.                 $this->addFlash('error'$e->getMessage());
  723.             }
  724.         } else {
  725.             // Si le formulaire n'est pas soumis ou n'est pas valide, on retourne un message d'erreur
  726.             $this->addFlash('error''Une erreur est survenue de la saisie des informations');
  727.             if ($formEmail->getErrors(true)->count() > 0) {
  728.                 foreach ($formEmail->getErrors(true) as $error) {
  729.                     $this->addFlash('error'$error->getMessage());
  730.                 }
  731.             }
  732.         }
  733.         return $this->redirectToRoute('lot', ['idProjet' => $idProjet'lot' => $lot]);
  734.     }
  735.     /**
  736.      * @Route("/visa/{idProjet}/lot/{lot}", name="lot", options={"expose" : true})
  737.      */
  738.     public function lot(
  739.         VisaContactsRepository $visaContactsRepository,
  740.         VisaBilansRepository $visaBilansRepository,
  741.         VisaExigencesRepository $visaExigencesRepo,
  742.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  743.         Request $theRequest,
  744.         PaginatorInterface $thePaginator,
  745.         EntityManagerInterface $em,
  746.         Session $session,
  747.         Request $req,
  748.         SluggerInterface $slugger,
  749.         $idProjet,
  750.         $lot
  751.     ) {
  752.         //démarrage session
  753.         $session->start();
  754.         $session->set("lastPage""lot");
  755.                 $session->set("idProjet""$idProjet");
  756.                 $session->set("lot""$lot");
  757.         if (!$this->isGranted('ROLE_ADMIN')) {
  758.             $typeFormFilter 'utilisateur';
  759. //            $idUser = $this->getUser()->getId();
  760.             $user $this->getUser();
  761.             $idUser $user $user->getId() : null;
  762. //            $idUser = $this->getUser()->getId();
  763.         } else {
  764.             $typeFormFilter 'admin';
  765.             $idUser null;
  766.         }
  767.         //De quel projet parle-t-on ?
  768.         $projet $visaProjetsRepo->find($idProjet);
  769.         $criteria = ['idProjet' => $idProjet'Lot' => $lot];
  770.         /** @var VisaContacts $VisaContactUser */
  771.         $VisaContactUser $visaContactsRepository->findOneBy($criteria);
  772.         //création du formulaire de nouveau fichier ////// => à transformer en plusieurs dropzones
  773.         $nouveau_fichier = new UploadFichierDTO;
  774.         $form $this->createForm(UploadFichierType::class, $nouveau_fichier);
  775.         $form->handleRequest($req);
  776.         $exigence $visaExigencesRepo->find(229); /////// à changer : l'id de l'exigence doit être variable en fonction de là où on drope
  777.         $criteria = array("idProjet" => $idProjet"lot" => $lot);
  778.         $listExigences $visaExigencesRepo->findBy($criteria);
  779.         $VisaBilans $visaBilansRepository->findOneBy([
  780.             'idProjet' => $idProjet,
  781.             'lot' => $lot
  782.         ]);
  783.         $formEmail $this->createForm(VisaLotBilan::class, $VisaBilans,
  784.             [
  785.                 'action' => $this->generateUrl('emailLot', ['idProjet' => $idProjet'lot' => $lot]),
  786.                 'idProjet' => $idProjet,
  787.                 'lot' => $lot
  788.             ]);
  789.         //Action si envoyé
  790.         if ($form->isSubmitted() && $form->isValid()) {
  791.             $files $form->get('fichier')->getData();
  792.             if ($files) {
  793.                 foreach ($files as $file) {
  794.                     $filename $file->getClientOriginalName();
  795.                     $originalFilename pathinfo($filenamePATHINFO_FILENAME);
  796.                     $safeFilename $slugger->slug($originalFilename);
  797.                     $newFilename $safeFilename '-' uniqid() . '.' $file->guessExtension();
  798.                     // Check if directory exists with $IdProjet at end
  799.                     if (!is_dir('IMPORTSVISA/JUSTIFICATIFS/' $idProjet)) {
  800.                         mkdir('IMPORTSVISA/JUSTIFICATIFS/' $idProjet0777true);
  801.                     }
  802.                     $file->move('IMPORTSVISA/JUSTIFICATIFS/' $idProjet$newFilename);
  803.                     $justif = new \App\Entity\Visa\VisaJustificatifs();
  804.                     $justif->setNomDuFichier($newFilename);
  805.                     $time date('d/m/y H:i');
  806.                     $justif->setDate($time);
  807.                     $justif->setExigence($exigence);
  808.                     $justif->setProjet($projet);
  809.                     $em->persist($justif);
  810.                     $em->flush();
  811.                 }
  812.             }
  813.         }
  814.                 
  815.                 //Définition des sous lots pour affichage
  816.             $listExigences $visaExigencesRepo->findBy(array("idProjet" => $idProjet"lot" => $lot));
  817.             $sousLots = [];
  818.             foreach ($listExigences as $exigence) {
  819.                 $sousLots [] = $exigence->getSousLot();
  820.             }
  821.             $sousLots array_unique($sousLots);
  822.             $listeSousLots [$lot] = $sousLots;                
  823.                 //dump($listeSousLots);
  824.                 
  825.         return $this->render('visa/lot.html.twig', [
  826.             'listExigences' => $listExigences,
  827.             'idProjet' => $idProjet,
  828.             'lot' => $lot,
  829.             'contact' => $VisaContactUser,
  830.             'formEmail' => $formEmail $formEmail->createView() : '',
  831.             'form' => $form->createView(),
  832.                     'projet' => $projet,
  833.                     'listeSousLots' => $listeSousLots
  834.         ]);
  835.     }
  836.     /**
  837.      * @Route("/visa/{idProjet}/cible/{ciblePropre}", name="cible", options={"expose" : true})
  838.      */
  839.     public function cible(
  840.         VisaContactsRepository $visaContactsRepository,
  841.         VisaBilansRepository $visaBilansRepository,
  842.         VisaExigencesRepository $visaExigencesRepo,
  843.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  844.         Request $theRequest,
  845.         PaginatorInterface $thePaginator,
  846.         EntityManagerInterface $em,
  847.         Session $session,
  848.         Request $req,
  849.         SluggerInterface $slugger,
  850.         $idProjet,
  851.         $ciblePropre
  852.     ) {
  853.         //démarrage session
  854.         $session->start();
  855.         $session->set("lastPage""cible");
  856.         //De quel projet parle-t-on ?
  857.         $projet $visaProjetsRepo->find($idProjet);
  858.                 $ciblePropre str_replace("POINT""."$ciblePropre);
  859.                 $ciblePropre str_replace("BARRE""/"$ciblePropre);               
  860.                 $cible rawurldecode($ciblePropre);
  861.                                     if ($cible == "Sans cible"){
  862.                         $cible null ;                               
  863.                     }
  864.         $criteria = array("idProjet" => $idProjet'cibles' => $cible);
  865.         $listExigences $visaExigencesRepo->findBy($criteria);
  866.                 //dump($listExigences);
  867.         return $this->render('visa/cible.html.twig', [
  868.             'listExigences' => $listExigences,
  869.             'idProjet' => $idProjet,
  870.             'cible' => $cible,
  871.         ]);
  872.     }
  873.     /**
  874.      * @Route("/visa/{idProjet}/exigence/{exigence}", name="exigence", options={"expose" : true})
  875.      */
  876.     public function exigence(
  877.         VisaExigencesRepository $visaExigencesRepo,
  878.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  879.         Request $theRequest,
  880.         PaginatorInterface $thePaginator,
  881.         EntityManagerInterface $em,
  882.         VisaJustificatifsRepository $visaJustificatifsRepo,
  883.         Session $session,
  884.         Request $req,
  885.         SluggerInterface $slugger,
  886.         $idProjet,
  887.         $exigence
  888.     ) {
  889.         //démarrage session
  890.         $session->start();
  891.         $session->set("lastPage""import");
  892.         if (!$this->isGranted('ROLE_ADMIN')) {
  893.             $typeFormFilter 'utilisateur';
  894. //            $idUser = $this->getUser()->getId();
  895.             $idUser $this->getUser() ? $this->getUser()->getId() : null;
  896.         } else {
  897.             $typeFormFilter 'admin';
  898.             $idUser null;
  899.         }
  900.         //De quel projet parle-t-on ?
  901.         $projet $visaProjetsRepo->find($idProjet);
  902.         //De quelle exigence parle-t-on ?
  903.         $exigence $visaExigencesRepo->find($exigence);
  904.         //formulaire de modification de l'exigence
  905.         $form $this->createForm(\App\Form\Visa\VisaExigencesType::class, $exigence);
  906.         $form->handleRequest($req);
  907.         if ($form->isSubmitted()) {
  908.             if ($form->isValid()) {
  909.                 $em->persist($exigence);
  910.                 $em->flush();
  911.             }
  912.         }
  913.         //formulaire de modification du commentaire entreprise
  914.         $formEntreprise $this->createForm(\App\Form\Visa\VisaCommentaireEntrepriseType::class, $exigence);
  915.         $formEntreprise->handleRequest($req);
  916.         if ($formEntreprise->isSubmitted()) {
  917.             if ($formEntreprise->isValid()) {
  918.                 $em->persist($exigence);
  919.                 $em->flush();
  920.             }
  921.         }
  922.         $criteria = array("exigence" => $exigence);
  923.         $listJustificatifs $visaJustificatifsRepo->findBy($criteria);
  924.         return $this->render('visa/exigence.html.twig', [
  925.             'exigence' => $exigence,
  926.             'listJustificatifs' => $listJustificatifs,
  927.             'idProjet' => $idProjet,
  928.             'form' => $form->createView(),
  929.             'formEntreprise' => $formEntreprise->createView()
  930.         ]);
  931.     }
  932.         
  933.         /**
  934.      * @Route("/visa/{idProjet}/{lot}/nouvelleExigence", name="nouvelleExigence", options={"expose" : true})
  935.      */
  936.     public function nouvelleExigence(
  937.         VisaExigencesRepository $visaExigencesRepo,
  938.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  939.         Request $theRequest,
  940.         EntityManagerInterface $em,
  941.         Session $session,
  942.         Request $req,
  943.         SluggerInterface $slugger,
  944.         $idProjet$lot
  945.     ) {
  946.         //démarrage session
  947.         $session->start();
  948.         $session->set("lastPage""import");
  949.         if (!$this->isGranted('ROLE_ADMIN')) {
  950.             $typeFormFilter 'utilisateur';
  951. //            $idUser = $this->getUser()->getId();
  952.             $idUser $this->getUser() ? $this->getUser()->getId() : null;
  953.         } else {
  954.             $typeFormFilter 'admin';
  955.             $idUser null;
  956.         }
  957.         //De quel projet parle-t-on ?
  958.         $projet $visaProjetsRepo->find($idProjet);
  959.                 
  960.                 $user $idUser $this->getDoctrine()->getRepository(User::class)->find($idUser) : null;
  961.         //formulaire de modification de l'exigence
  962.                $nouvelleExigence = new VisaExigences();
  963.         $form $this->createForm(\App\Form\Visa\VisaNouvelleExigenceType::class , $nouvelleExigence);
  964.         $form->handleRequest($req);
  965.         if ($form->isSubmitted()) {
  966.             if ($form->isValid()) {
  967.                 
  968.                             
  969.                             $numeroExigence $visaExigencesRepo->findMaxNumeroExigenceByProjet($projet);
  970.                 
  971.                 $nouvelleExigence->setIdUser($user);
  972.                 $nouvelleExigence->setIdProjet($projet);
  973.                 $nouvelleExigence->setLot($lot);
  974.                 $nouvelleExigence->setNumeroExigence($numeroExigence);
  975.                 
  976.                 $em->persist($nouvelleExigence);
  977.                 $em->flush();
  978.             }
  979.         }
  980.         return $this->render('visa/nouvelleExigence.html.twig', [
  981.             'idProjet' => $idProjet,
  982.                         'lot' => $lot,             
  983.             'form' => $form->createView()
  984.         ]);
  985.     }
  986.         
  987.         /**
  988.      * @Route("/visa/{idProjet}/lot/{idLot}/{idExigence}", name="exigenceSupp", options={"expose" : true})
  989.      */
  990.     public function exigenceSupp(
  991.         VisaExigencesRepository $visaExigencesRepo,
  992.         EntityManagerInterface $em,
  993.         $idProjet,
  994.         $idLot,
  995.         $idExigence
  996.     ) {
  997.             
  998.         $exigence $visaExigencesRepo->find($idExigence);
  999.         $em->remove($exigence);
  1000.         $em->flush();
  1001.         return $this->redirectToRoute('lot', ['idProjet' => $idProjet'lot' => $idLot]);
  1002.     }
  1003.     /**
  1004.      * @Route("/visa/{idProjet}/lot/{idLot}/fichier/{idFichier}", name="fichierLot", options={"expose" : true})
  1005.      */
  1006.     public function fichierLot(
  1007.         VisaExigencesRepository $visaExigencesRepo,
  1008.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  1009.         Request $theRequest,
  1010.         PaginatorInterface $thePaginator,
  1011.         EntityManagerInterface $em,
  1012.         VisaJustificatifsRepository $visaJustificatifsRepo,
  1013.         Session $session,
  1014.         Request $req,
  1015.         SluggerInterface $slugger,
  1016.         $idProjet,
  1017.         $idLot,
  1018.         $idFichier
  1019.     ) {
  1020.         $session->start();
  1021.         $session->set("lastPage""lot");
  1022.         if (!$this->isGranted('ROLE_ADMIN')) {
  1023.             $typeFormFilter 'utilisateur';
  1024. //            $idUser = $this->getUser()->getId();
  1025.             $idUser $this->getUser() ? $this->getUser()->getId() : null;
  1026.         } else {
  1027.             $typeFormFilter 'admin';
  1028.             $idUser null;
  1029.         }
  1030.         $fichier $visaJustificatifsRepo->find($idFichier);
  1031.         $projet $fichier->getProjet();
  1032.         if ($fichier && $fichier->getId()) {
  1033.             // Pour compatibilité avec les anciens fichiers
  1034.             if (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $fichier->getNomDuFichier())) {
  1035.                 return $this->file('IMPORTSVISA/JUSTIFICATIFS/' $fichier->getNomDuFichier());
  1036.             } elseif (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $fichier->getNomDuFichier())) {
  1037.                 return $this->file('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $fichier->getNomDuFichier());
  1038.             }
  1039.         }
  1040.         throw $this->createNotFoundException('Fichier inexistant');
  1041.     }
  1042.     /**
  1043.      * @Route("/visa/{idProjet}/lot/{idLot}/fichierSupp/{idFichier}/{idExigence}", name="fichierSupp", options={"expose" : true})
  1044.      */
  1045.     public function fichierSupp(
  1046.         VisaExigencesRepository $visaExigencesRepo,
  1047.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  1048.         Request $theRequest,
  1049.         EntityManagerInterface $em,
  1050.         VisaJustificatifsRepository $visaJustificatifsRepo,
  1051.         Session $session,
  1052.         Request $req,
  1053.         SluggerInterface $slugger,
  1054.         $idProjet,
  1055.         $idLot,
  1056.         $idFichier,
  1057.         $idExigence
  1058.     ) {
  1059.         $fichier $visaJustificatifsRepo->find($idFichier);
  1060.         $em->remove($fichier);
  1061.         $em->flush();
  1062.         return $this->redirectToRoute('exigence', ['idProjet' => $idProjet'exigence' => $idExigence]);
  1063.     }
  1064.     /**
  1065.      *
  1066.      * @Route("/visa/{idProjet}/download", name="projetZip", options={"expose" : true})
  1067.      */
  1068.     public function projetDownloadZipFiles(
  1069.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  1070.         VisaJustificatifsRepository $visaJustificatifsRepo,
  1071.         $idProjet
  1072.     ) {
  1073.         $projet $visaProjetsRepo->find($idProjet);
  1074.         $zip = new ZipArchive();
  1075.         // sanitize projet name
  1076.         $filename '../var/projet_' Sanitize::sanitize_file_name($projet->getNomDuProjet()) . '.zip';
  1077.         $zip->open($filenameZipArchive::CREATE ZipArchive::OVERWRITE);
  1078.         // get all VisaJustificatifs for this projet
  1079.         $justificatifs $visaJustificatifsRepo->findBy(['projet' => $projet]);
  1080.         foreach ($justificatifs as $justificatif) {
  1081.             $exigence $justificatif->getExigence();
  1082.             $lot Sanitize::sanitize_file_name($exigence->getLot());
  1083.             // Pour compatibilité avec les anciens fichiers
  1084.             if (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier())) {
  1085.                 $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier(),
  1086.                     $lot '/' $justificatif->getNomDuFichier());
  1087.             } elseif (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier())) {
  1088.                 $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier(),
  1089.                     $lot '/' $justificatif->getNomDuFichier());
  1090.             }
  1091.         }
  1092.         // Zip archive will be created only after closing object
  1093.         $zip->close();
  1094.         return $this->file($filename);
  1095.     }
  1096.     /**
  1097.      *
  1098.      * @Route("/visa/{idProjet}/cibledownload", name="projetZipCicle", options={"expose" : true})
  1099.      */
  1100.     public function projetDownloadZipFilesByCible(
  1101.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  1102.         VisaJustificatifsRepository $visaJustificatifsRepo,
  1103.         VisaExigencesRepository $visaExigencesRepo,
  1104.         $idProjet
  1105.     ) {
  1106.         $projet $visaProjetsRepo->find($idProjet);
  1107.         $zip = new ZipArchive();
  1108.         // sanitize projet name
  1109.         $filename '../var/projet_' Sanitize::sanitize_file_name($projet->getNomDuProjet()) . '.zip';
  1110. //        $criteria = array("idProjet" => $idProjet);
  1111. //        $listExigences = $visaExigencesRepo->findBy($criteria);
  1112. //        $listCibles = [];
  1113. //        foreach ($listExigences as $exigence) {
  1114. //            $cibles = explode(',',$exigence->getCibles());
  1115. //            if($cibles) {
  1116. //                $cibles=array_filter(array_map(function($e) {return trim($e);},$cibles));
  1117. //            }
  1118. //            if($cibles) {
  1119. //                foreach($cibles as $cible) {
  1120. //                    if(!isset($listCibles[$cible])) $listCibles[$cible]=[];
  1121. //                    $listCibles[$cible][]= $exigence;
  1122. //                }
  1123. //            }
  1124. //        }
  1125.         $zip->open($filenameZipArchive::CREATE ZipArchive::OVERWRITE);
  1126. //        foreach($listCibles as $cible => $exigences) {
  1127. //            $lots = [];
  1128. //        }
  1129. //
  1130.         $exigences =
  1131.             // get all VisaJustificatifs for this projet
  1132.         $justificatifs $visaJustificatifsRepo->findBy(['projet' => $projet]);
  1133.         foreach ($justificatifs as $justificatif) {
  1134.             $exigence $justificatif->getExigence();
  1135.             $lot Sanitize::sanitize_file_name($exigence->getLot());
  1136.             $cibles explode(','$exigence->getCibles());
  1137.             if ($cibles) {
  1138.                 $cibles array_filter(array_map(function ($e) {
  1139.                     return trim($e);
  1140.                 }, $cibles));
  1141.             }
  1142.             // Pour compatibilité avec les anciens fichiers
  1143.             if (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier())) {
  1144.                 if ($cibles) {
  1145.                     foreach ($cibles as $cible) {
  1146.                         $cible Sanitize::sanitize_file_name($cible);
  1147.                         $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier(),
  1148.                             $cible '/lot-' $lot '/' $justificatif->getNomDuFichier());
  1149.                     }
  1150.                 } else {
  1151.                     $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier(),
  1152.                         'SANS-CIBLE/lot-' $lot '/' $justificatif->getNomDuFichier());
  1153.                 }
  1154.             } elseif (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier())) {
  1155.                 if ($cibles) {
  1156.                     foreach ($cibles as $cible) {
  1157.                         $cible Sanitize::sanitize_file_name($cible);
  1158.                         $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier(),
  1159.                             $cible '/lot-' $lot '/' $justificatif->getNomDuFichier());
  1160.                     }
  1161.                 } else {
  1162.                     $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier(),
  1163.                         'SANS-CIBLE/lot-' $lot '/' $justificatif->getNomDuFichier());
  1164.                 }
  1165.             }
  1166.         }
  1167.         // Zip archive will be created only after closing object
  1168.         $zip->close();
  1169.         return $this->file($filename);
  1170.     }
  1171.     /**
  1172.      *
  1173.      * @Route("/visa/{idProjet}/lot/{lot}/download", name="lotZip", options={"expose" : true})
  1174.      */
  1175.     public function lotDownloadZipFiles(
  1176.         \App\Repository\Visa\VisaProjetsRepository $visaProjetsRepo,
  1177.         VisaJustificatifsRepository $visaJustificatifsRepo,
  1178.         VisaExigencesRepository $visaExigencesRepo,
  1179.         $idProjet,
  1180.         $lot
  1181.     ) {
  1182.         $projet $visaProjetsRepo->find($idProjet);
  1183.         $zip = new ZipArchive();
  1184.         // sanitize projet name
  1185.         $filename '../var/projet_' Sanitize::sanitize_file_name($projet->getNomDuProjet()) . '_lot_' $lot '.zip';
  1186.         $zip->open($filenameZipArchive::CREATE ZipArchive::OVERWRITE);
  1187.         $criteria = array("idProjet" => $idProjet"lot" => $lot);
  1188.         $listExigences $visaExigencesRepo->findBy($criteria);
  1189.         $criteria = array("projet" => $projet"exigence" => $listExigences);
  1190.         // get all VisaJustificatifs for this projet
  1191.         $justificatifs $visaJustificatifsRepo->findBy($criteria);
  1192.         foreach ($justificatifs as $justificatif) {
  1193.             $exigence $justificatif->getExigence();
  1194.             $lot Sanitize::sanitize_file_name($exigence->getLot());
  1195.             // Pour compatibilité avec les anciens fichiers
  1196.             if (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier())) {
  1197.                 $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $justificatif->getNomDuFichier(),
  1198.                     $justificatif->getNomDuFichier());
  1199.             } elseif (file_exists('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier())) {
  1200.                 $zip->addFile('IMPORTSVISA/JUSTIFICATIFS/' $projet->getId() . '/' $justificatif->getNomDuFichier(),
  1201.                     $justificatif->getNomDuFichier());
  1202.             }
  1203.         }
  1204.         // Zip archive will be created only after closing object
  1205.         $zip->close();
  1206.         return $this->file($filename);
  1207.     }
  1208. }