src/Controller/FormController.php line 840

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Controller\Admin\DemandeCrudController;
  4. use App\Controller\Admin\FormUserCrudController;
  5. use App\Entity\Demande;
  6. use App\Entity\DemandeNote;
  7. use App\Entity\Meeting;
  8. use App\Entity\Notification;
  9. use App\Entity\Ville;
  10. use App\Form\DemandeNoteType;
  11. use App\Form\FormUserNoteType;
  12. use App\Form\MeetingType;
  13. use App\Form\ReclamationReponseType;
  14. use App\Repository\MeetingRepository;
  15. use App\Service\FileUploader;
  16. use App\Service\NotificationManager;
  17. use DateTime;
  18. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  19. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  20. use Exception;
  21. use App\Entity\Form;
  22. use App\Entity\User;
  23. use App\Entity\Status;
  24. use App\Entity\FormStep;
  25. use App\Entity\FormUser;
  26. use App\Entity\FormChamp;
  27. use App\Entity\FormChampOptions;
  28. use App\Form\DemandeType;
  29. use App\Entity\FormValues;
  30. use App\Entity\FormUserNote;
  31. use App\Form\FormulaireType;
  32. use App\Security\EmailVerifier;
  33. use App\Repository\FormRepository;
  34. use App\Repository\UserRepository;
  35. use Knp\Bundle\SnappyBundle\KnpSnappyBundle;
  36. use Knp\Component\Pager\PaginatorInterface;
  37. use Knp\Snappy\Pdf;
  38. use Kricha\DoctrineAuditBundle\AuditManager;
  39. use Kricha\DoctrineAuditBundle\Reader\AuditReader;
  40. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  41. use Symfony\Component\Mime\Address;
  42. use App\Repository\FormUserRepository;
  43. use App\Repository\FormChampRepository;
  44. use Doctrine\ORM\EntityManagerInterface;
  45. use App\Repository\FormUserNoteRepository;
  46. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  47. use Symfony\Component\HttpFoundation\Request;
  48. use Symfony\Component\HttpFoundation\Response;
  49. use Symfony\Component\Routing\Annotation\Route;
  50. use Symfony\Component\HttpFoundation\JsonResponse;
  51. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  52. use Symfony\Component\Routing\Generator\UrlGenerator;
  53. use Symfony\Component\Validator\Validator\ValidatorInterface;
  54. #[Route('/form')]
  55. class FormController extends BaseController
  56. {
  57.     private $emailVerifier;
  58.     private $adminUrlGenerator;
  59.     public function __construct(EmailVerifier $emailVerifierAdminUrlGenerator $adminUrlGenerator)
  60.     {
  61.         $this->emailVerifier $emailVerifier;
  62.         $this->adminUrlGenerator $adminUrlGenerator;
  63.     }
  64.     #[Route('/'name'app_form')]
  65.     public function indexPaginatorInterface $paginatorRequest $requestFormRepository $formRepository): Response
  66.     {
  67.         $pagination $paginator->paginate(
  68.             $formRepository->getPublishedNotEnded(), /* query NOT result */
  69.             $request->query->getInt('page'1), /*page number*/
  70.             /*limit per page*/
  71.         );
  72.         return $this->render('form/index.html.twig', [
  73.             'formulaires' => $pagination
  74.         ]);
  75.     }
  76.     #[Route('/edit/{id}'name'edit_form')]
  77.     public function edit($idFormRepository $formRepository): Response
  78.     {
  79.         return $this->render('form/createForm.html.twig', [
  80.             'form' => $formRepository->find($id)
  81.         ]);
  82.     }
  83.     #[Route('/creation/{id}'name'form_create')]
  84.     public function form_create($idRequest $requestFormRepository $formRepositoryEntityManagerInterface $entityManager): Response
  85.     {
  86.         if ($id != -1) {
  87.             $form $formRepository->find($id);
  88.             foreach ($form->getFormSteps() as $step) {
  89.                 foreach ($step->getFormChamps() as $champ) {
  90.                     $entityManager->remove($champ);
  91.                     $entityManager->flush();
  92.                 }
  93.                 $entityManager->remove($step);
  94.                 $entityManager->flush();
  95.             }
  96.         } else {
  97.             $form = new Form();
  98.         }
  99.         $form->setDate(new \DateTime());
  100.         $form->setNom($_REQUEST['txtNom']);
  101.         $form->setDescription($_REQUEST['txtDescription']);
  102.         $form->setDateDebut(new \DateTime($_REQUEST['TxtDateDebut']));
  103.         $form->setDateFin(new \DateTime($_REQUEST['TxtDateFin']));
  104.         if (isset($_FILES['fileBackground']['tmp_name']) && !empty($_FILES['fileBackground']['tmp_name'])) {
  105.             $nom $_FILES['fileBackground']['tmp_name'];
  106.             $fileName =  uniqid() . '-' $_FILES['fileBackground']['name'];
  107.             move_uploaded_file($nom$this->getParameter('demande_directory') . $fileName);
  108.             $form->setFileBackground($fileName);
  109.         }
  110.         if (isset($_FILES['fileNotification']['tmp_name']) && !empty($_FILES['fileNotification']['tmp_name'])) {
  111.             $nom $_FILES['fileNotification']['tmp_name'];
  112.             $fileName =  uniqid() . '-' $_FILES['fileNotification']['name'];
  113.             move_uploaded_file($nom$this->getParameter('demande_directory') .  $fileName);
  114.             $form->setfileNotification($fileName);
  115.         }
  116.         foreach (json_decode($_REQUEST['data'], true) as $Phase) {
  117.             $formStep = new FormStep();
  118.             $formStep->setNom('Step');
  119.             $formStep->setPosition(1);
  120.             $formStep->setComponents(json_encode($Phase));
  121.             $formStep->setForm($form);
  122.             foreach ($Phase as $obj) {
  123.                 $formChamp = new FormChamp();
  124.                 $formChamp->setLabel(isset($obj['label']) ? $obj['label'] : "");
  125.                 $formChamp->setType($obj['type']);
  126.                 $formChamp->setId($obj['name']);
  127.                 $formChamp->setFormStep($formStep);
  128.                 $entityManager->persist($formChamp);
  129.                 if (isset($obj['values'])) {
  130.                     foreach ($obj['values'] as $option) {
  131.                         $formChampOptions = new FormChampOptions();
  132.                         $formChampOptions->setLabel($option["label"]);
  133.                         $formChampOptions->setValue($option["value"]);
  134.                         $formChampOptions->setFormChamp($formChamp);
  135.                         $entityManager->persist($formChampOptions);
  136.                     }
  137.                 }
  138.             }
  139.             $entityManager->persist($formStep);
  140.         }
  141.         $entityManager->persist($form);
  142.         $entityManager->flush();
  143.         return new Response(''200);
  144.     }
  145.     #[Route('/saveDataForm/{id}'name'saveDataForm')]
  146.     public function saveDataForm(
  147.         $id,
  148.         Request $request,
  149.         FormRepository $formRepository,
  150.         EntityManagerInterface $entityManager,
  151.         Pdf $knpSnappyPdf,
  152.         NotificationManager $notificationManager,
  153.         FileUploader $fileUploader
  154.     ): Response
  155.     {
  156.         $formulaire $formRepository->find($id);
  157.         $formUser = new FormUser();
  158.         foreach ($formulaire->getResponsables() as $responsable){
  159.             $formUser->addResponsable($responsable);
  160.         }
  161.         // $formUser->addResponsable($formulaire->getResponsable());
  162.         
  163.         $formUser->setForm($formulaire);
  164.         $formUser->setUser($this->getUser());
  165.         $formUser->setDate(new \DateTime());
  166.         foreach ($formulaire->getFormSteps() as $step) {
  167.             foreach ($step->getFormChamps() as $obj) {
  168.                 $formValue = new FormValues();
  169.                 $formValue->setFormUser($formUser);
  170.                 $formValue->setFormChamp($obj);
  171.                 if ($obj->getType() == 'file') {
  172.                     foreach ($request->files as $files) {
  173.                         $valueName "";
  174.                         foreach ($files as $file) {
  175.                             $fileName $fileUploader->upload($file'../files');
  176.                             $valueName $valueName == '' $fileName $valueName ',' $fileName;
  177.                         }
  178.                         $formValue->setValue($valueName);
  179.                     }
  180.                 } elseif ($obj->getType() == 'checkbox-group') {
  181.                     $valueName "";
  182.                     if ( $request->request->get($obj->getId()) ){
  183.                         foreach ($request->request->get($obj->getId()) as $checkbox_value) {
  184.                             $valueName $valueName == '' $checkbox_value $valueName '|#|' $checkbox_value;
  185.                         }
  186.                     }
  187.                     $formValue->setValue($valueName);
  188.                 }
  189. //                elseif( $obj->getType() == 'ville' ){
  190. //                    dd($request, $obj);
  191. //                }
  192. //                elseif( $obj->getType() == 'map' ){
  193. //                    dd($request, $obj);
  194. //                }
  195.                 else {
  196.                     $formValue->setValue($request->request->get($obj->getId()));
  197.                 }
  198.                 $entityManager->persist($formValue);
  199.             }
  200.         }
  201.         $entityManager->persist($formUser);
  202.         $entityManager->flush();
  203.         $edit_demande_url $this->generateUrl('app_redirect_email', array( 'id' => $formUser->getId(), 'type' => 'formuser' ), UrlGenerator::ABSOLUTE_URL );
  204.         $this->emailVerifier->sendEmailConfirmation(
  205.             'app_verify_email',
  206.             $this->getUser(),
  207.             (new TemplatedEmail())
  208.                 ->from(new Address($this->getParameter('EmailAdmin'), 'IGPPP'))
  209.                 ->to($this->getParameter('EmailNotification'))
  210.                 ->subject('Une nouvelle demande a été ajoutée !')
  211.                 ->htmlTemplate('email/email_nouvelle_demande.html.twig')
  212.                 ->context([
  213.                     'User' => $this->getUser()->getEmail(),
  214.                     'demande_url' => $edit_demande_url,
  215.                     'demande_id' => $formUser->getId(),
  216.                 ])
  217.         );
  218.         $admins $entityManager->getRepository(User::class)->findByRole('ROLE_ADMIN');
  219.         foreach ( $admins as $admin){
  220.             $notification_message 'Une nouvelle demande a été ajoutée !' $formUser->getId() . ' du formulaire ' $formUser->getForm()->getNom();
  221.             $notificationManager->pushMessage('Une nouvelle demande a été ajoutée !'$notification_message$admin$edit_demande_url);
  222.         }
  223.         $show_demande_url $this->generateUrl('form_show', array( 'id' => $formUser->getId(), 'meeting_id' => ), UrlGenerator::ABSOLUTE_URL );
  224.         $protocol stripos($_SERVER['SERVER_PROTOCOL'],'https') === 'https://' 'http://';
  225.         $this->emailVerifier->sendEmailConfirmation(
  226.             'app_verify_email',
  227.             $this->getUser(),
  228.             (new TemplatedEmail())
  229.                 ->from(new Address($this->getParameter('EmailAdmin'), 'IGPPP'))
  230.                 ->to($this->getUser()->getEmail())
  231.                 ->subject('Une nouvelle demande a été ajoutée !')
  232.                 ->htmlTemplate('email/email_notification_demande_file.html.twig')
  233.                 ->context([
  234.                     'form' => $formulaire,
  235.                     'serveur' => $protocol.$_SERVER["HTTP_HOST"],
  236.                     'demande_url' => $show_demande_url,
  237.                     'demande_id' => $formUser->getId(),
  238.                 ])
  239.         );
  240.         $notification_message 'Une nouvelle demande a été ajoutée !' $formUser->getId() . ' du formulaire ' $formUser->getForm()->getNom();
  241.         $notificationManager->pushMessage('Une nouvelle demande a été ajoutée !'$notification_message$this->getUser(), $show_demande_url);
  242.         return new Response($formUser->getId());
  243.     }
  244.     #[Route('/afficher/{id}'name'form_show')]
  245.     public function formShow(
  246.         $id,
  247.         Request $request,
  248.         FormUserRepository $formUserRepository,
  249.         UserRepository $UserRepository,
  250.         AuditReader $auditReader,
  251.         MeetingRepository $meetingRepository
  252.     ): Response
  253.     {
  254.         $data = [];
  255.         $demande $formUserRepository->find($id);
  256.         $note = new FormUserNote();
  257.         $meeting = new Meeting();
  258.         if (!$demande)
  259.             return $this->redirectToRoute('front');
  260.         $users $UserRepository->findByRole('ROLE_RD');
  261.         foreach( $demande->getForm()->getFormSteps() as $step ){
  262.             foreach( $step->getComponents() as $component ){
  263.                 $component_data = [];
  264.                 if( property_exists($component"helpText") ){
  265.                     $component_data['helpText'] = $component->helpText;
  266.                 }
  267.                 if( property_exists($component"name") ){
  268.                     $data$component->name ] = $component_data;
  269.                 }
  270.             }
  271.         }
  272.         $formNote $this->createForm(FormUserNoteType::class, $note);
  273.         $formMeeting $this->createForm(MeetingType::class, $meeting);
  274.         $values = [];
  275.         foreach( $demande->getFormValues() as $form_value ){
  276.             $key $form_value->getFormChamp()->getId();
  277.             $values$key ] = $form_value->getValueStream();
  278.         }
  279.         $demande_audit $auditReader->getAudits('App\Entity\FormUser'$id );
  280.         if ( $request->query->get('meeting_id') ){
  281.             $meeting_formUser $meetingRepository->find$request->query->get('meeting_id') );
  282.         }else{
  283.             $meeting_formUser null;
  284.         }
  285.         return $this->render('form/ResultatReponseForm.html.twig', [
  286.             'data' => $data,
  287.             'values' => $values,
  288.             'demande' => $demande,
  289.             'demande_audit' => $demande_audit,
  290.             'users' => $users,
  291.             'status_array' => array_flip(FormUser::STATUS_ARRAY),
  292.             'formNote' => $formNote->createView(),
  293.             'formMeeting' => $formMeeting->createView(),
  294.             'meeting_formUser' => $meeting_formUser
  295.         ]);
  296.     }
  297.     #[Route('/affecter/responsable/{type}/{id}'name'affecter_responsable')]
  298.     public function affecterResponsable$id$type 'formuser'Request $requestEntityManagerInterface $entityManagerNotificationManager $notificationManager ): Response
  299.     {
  300.         if ( $type == 'formuser' ){
  301.             $form $entityManager->getRepository(FormUser::class)->find($id);
  302.             $edit_demande_url $this->adminUrlGenerator
  303.                 ->setController(FormUserCrudController::class)
  304.                 ->setAction(Action::EDIT)
  305.                 ->setEntityId($id)
  306.                 ->generateUrl();
  307.             $show_demande_url $this->generateUrl('form_show', array( 'id' => $id'meeting_id' => ), UrlGenerator::ABSOLUTE_URL );
  308.             if ($request->request->get('formUser')['Etat']){
  309.                 $form->setEtat$request->request->get('formUser')['Etat'] );
  310.             }
  311.         }else{
  312.             $form $entityManager->getRepository(Demande::class)->find($id);
  313.             $edit_demande_url $this->adminUrlGenerator
  314.                 ->setController(DemandeCrudController::class)
  315.                 ->setAction(Action::EDIT)
  316.                 ->setEntityId($id)
  317.                 ->generateUrl();
  318.             $show_demande_url $this->generateUrl('app_demande_show', array( 'id' => $id ), UrlGenerator::ABSOLUTE_URL );
  319.             if ($request->request->get('formUser')['Etat']){
  320.                 $form->setStatus$request->request->get('formUser')['Etat'] );
  321.             }
  322.         }
  323.         // send mail to responsable && add alert
  324.         $oldResponsablesIds $form->getResponsables()->map(function($obj){return $obj->getId();})->getValues();
  325.         $newResponsablesIds array_diff$request->request->get('formUser')['responsables'], $oldResponsablesIds);
  326.         foreach ($newResponsablesIds as $newResponsableId) {
  327.             $newResponsable $entityManager->getRepository(User::class)->find($newResponsableId);
  328.             if ( $type == 'formuser' ){
  329.                 // Affectation d’un nouveau dossier Responsable Dossier formuser
  330.                 $this->emailVerifier->sendEmailConfirmation(
  331.                     'app_verify_email',
  332.                     $form->getUser(),
  333.                     (new TemplatedEmail())
  334.                         ->from(new Address($this->getParameter('EmailAdmin'), 'IGPPP'))
  335.                         ->to$newResponsable->getEmail() )
  336.                         ->subject('Affectation à une demande !')
  337.                         ->htmlTemplate('email/email_affectation_demande.html.twig')
  338.                         ->context([
  339.                             'form' => $form->getForm(),
  340.                             'user' => $form->getUser()->getEmail(),
  341.                             'demande_url' => $edit_demande_url,
  342.                             'demande_id' => $form->getId(),
  343.                         ])
  344.                 );
  345.                 $notification_message 'Affectation à une demande !';
  346.                 $notificationManager->pushMessage('Affectation à une demande !'$notification_message$newResponsable$edit_demande_url);
  347.             }else{
  348.                 // Affectation d’un nouveau dossier Responsable Dossier demande principale
  349.                 $this->emailVerifier->sendEmailConfirmation(
  350.                     'app_verify_email',
  351.                     $form->getUser(),
  352.                     (new TemplatedEmail())
  353.                         ->from(new Address($this->getParameter('EmailAdmin'), 'IGPPP'))
  354.                         ->to$newResponsable->getEmail() )
  355.                         ->subject('Affectation à une demande !')
  356.                         ->htmlTemplate('email/email_affectation_demande_principale.html.twig')
  357.                         ->context([
  358.                             'user' => $form->getUser()->getEmail(),
  359.                             'demande_url' => $edit_demande_url,
  360.                             'demande_id' => $form->getId(),
  361.                         ])
  362.                 );
  363.                 $notification_message 'Affectation à une demande !';
  364.                 $notificationManager->pushMessage('Affectation à une demande !'$notification_message$newResponsable$edit_demande_url);
  365.             }
  366.         }
  367.         foreach ($form->getResponsables() as $responsable) {
  368.             $form->removeResponsable($responsable);
  369.         }
  370.         if ($request->request->get('formUser')['responsables']) {
  371.             foreach ($request->request->get('formUser')['responsables'] as $responsable_id) {
  372.                 $form->addResponsable($entityManager->getRepository(User::class)->find($responsable_id));
  373.             }
  374.         }
  375.         $entityManager->flush();
  376.         if ( $this->isGranted('ROLE_ADMIN') || $this->isGranted('ROLE_RD' ) ){
  377.             return $this->redirect($edit_demande_url);
  378.         }
  379.         return $this->redirect($show_demande_url);
  380.     }
  381.     #[Route('/note/delete/{id}/{type}'name'note_delete')]
  382.     public function noteDelete$id$type 'formuser'EntityManagerInterface $entityManager )
  383.     {
  384.         if ( $type == 'formuser' ){
  385.             $note $entityManager->getRepository(FormUserNote::class)->find($id);
  386.             $demande_id $note->getFormuser()->getId();
  387.             $edit_demande_url $this->adminUrlGenerator
  388.                 ->setController(FormUserCrudController::class)
  389.                 ->setAction(Action::EDIT)
  390.                 ->setEntityId($demande_id)
  391.                 ->generateUrl();
  392.             $show_demande_url $this->generateUrl('form_show', array( 'id' => $demande_id'meeting_id' => ), UrlGenerator::ABSOLUTE_URL );
  393.         }else{
  394.             $note $entityManager->getRepository(DemandeNote::class)->find($id);
  395.             $demande_id $note->getDemande()->getId();
  396.             $edit_demande_url $this->adminUrlGenerator
  397.                 ->setController(DemandeCrudController::class)
  398.                 ->setAction(Action::EDIT)
  399.                 ->setEntityId($demande_id)
  400.                 ->generateUrl();
  401.             $show_demande_url $this->generateUrl('app_demande_show', array( 'id' => $demande_id ), UrlGenerator::ABSOLUTE_URL );
  402.         }
  403.         $entityManager->remove$note );
  404.         $entityManager->flush();
  405.         if ( $this->isGranted('ROLE_ADMIN') || $this->isGranted('ROLE_RD' ) ){
  406.             return $this->redirect($edit_demande_url);
  407.         }
  408.         return $this->redirect($show_demande_url);
  409.     }
  410.     #[Route('/note/edit/{type}'name'note_edit')]
  411.     public function noteEdit$type 'formuser'Request $requestEntityManagerInterface $entityManager )
  412.     {
  413.         if ( $type == 'formuser' ){
  414.             $note $entityManager->getRepository(FormUserNote::class)->find$request->request->get('form_edit_note_id') );
  415.             $demande_id $note->getFormuser()->getId();
  416.             $edit_demande_url $this->adminUrlGenerator
  417.                 ->setController(FormUserCrudController::class)
  418.                 ->setAction(Action::EDIT)
  419.                 ->setEntityId($demande_id)
  420.                 ->generateUrl();
  421.             $show_demande_url $this->generateUrl('form_show', array( 'id' => $demande_id'meeting_id' => ), UrlGenerator::ABSOLUTE_URL );
  422.         }else{
  423.             $note $entityManager->getRepository(DemandeNote::class)->find$request->request->get('form_edit_note_id') );
  424.             $demande_id $note->getDemande()->getId();
  425.             $edit_demande_url $this->adminUrlGenerator
  426.                 ->setController(DemandeCrudController::class)
  427.                 ->setAction(Action::EDIT)
  428.                 ->setEntityId($demande_id)
  429.                 ->generateUrl();
  430.             $show_demande_url $this->generateUrl('app_demande_show', array( 'id' => $demande_id ), UrlGenerator::ABSOLUTE_URL );
  431.         }
  432.         $note->setNote$request->request->get('form_edit_note_note') );
  433.         $entityManager->flush();
  434.         if ( $this->isGranted('ROLE_ADMIN') || $this->isGranted('ROLE_RD' ) ){
  435.             return $this->redirect($edit_demande_url);
  436.         }
  437.         return $this->redirect($show_demande_url);
  438.     }
  439.     #[Route('/note/{id}/{type}/files-download'name'note_files_download')]
  440.     public function noteFilesDownload$id$type 'formuser'EntityManagerInterface $entityManager )
  441.     {
  442.         $zip = new \ZipArchive();
  443.         if ( $type == 'formuser' ){
  444.             $note $entityManager->getRepository(FormUserNote::class)->find($id);
  445.             $files_path $this->getParameter('uploads_directory') . '/note/autre/f-' $note->getFormUser()->getForm()->getId()
  446.                 . '/d-' $note->getFormUser()->getId() .'/' ;
  447.             $archive_file_name 'f-' $note->getFormUser()->getForm()->getId()
  448.                 . '--d-' $note->getFormUser()->getId() . '--n-' $note->getId() . '.zip';
  449.         }else{
  450.             $note $entityManager->getRepository(DemandeNote::class)->find($id);
  451.             $files_path $this->getParameter('uploads_directory') . '/note/principale/d-' $note->getDemande()->getId() .'/' ;
  452.             $archive_file_name 'fp--d-' $note->getDemande()->getId() . '--n-' $note->getId() . '.zip';
  453.         }
  454.         $archive_file $files_path $archive_file_name;
  455.         //create the file and throw the error if unsuccessful
  456.         if ($zip->open($archive_file\ZipArchive::CREATE )!==TRUE) {
  457.             exit("cannot open <$archive_file_name>\n");
  458.         }
  459.         //add each files of $file_name array to archive
  460.         foreach($note->getFiles() as $file)
  461.         {
  462.             if (file_exists($files_path $file)){
  463.                 $zip->addFile($files_path $file$file );
  464.             }
  465.         }
  466.         $zip->close();
  467.         //then send the headers to force download the zip file
  468.         header("Content-type: application/zip");
  469.         header("Content-Disposition: attachment; filename=$archive_file_name");
  470.         header("Content-length: " filesize($archive_file));
  471.         header("Pragma: no-cache");
  472.         header("Expires: 0");
  473.         readfile("$archive_file");
  474.         exit;
  475.     }
  476.     #[Route('/{type}/{id}/download-zip'name'download_zip_demande')]
  477.     public function downloadZipDemande($id$type 'formuser'EntityManagerInterface $entityManagerPdf $knpSnappyPdf)
  478.     {
  479.         $zip = new \ZipArchive();
  480.         $files_path $this->getParameter('uploads_directory') . '/../files/';
  481.         $demande null;
  482.         $archive_file_name '';
  483.         $demande_pdf_filename '';
  484.     
  485.         if ($type == 'formuser') {
  486.             $demande $entityManager->getRepository(FormUser::class)->find($id);
  487.             $archive_file_name 'f-' $demande->getForm()->getId() . '--d-' $demande->getId() . '.zip';
  488.             $demande_pdf_filename 'f-' $demande->getForm()->getId() . '--d-' $demande->getId() . '.pdf';
  489.     
  490.             if (file_exists($files_path $demande_pdf_filename)) {
  491.                 unlink($files_path $demande_pdf_filename);
  492.             }
  493.     
  494.             $values = [];
  495.             foreach ($demande->getFormValues() as $formvalue) {
  496.                 $values[$formvalue->getFormChamp()->getId()] = $formvalue->getValueStream();
  497.             }
  498.     
  499.             // Check if all values are empty
  500.     
  501.             $data = [];
  502.             foreach ($demande->getForm()->getFormSteps() as $step) {
  503.                 foreach ($step->getComponents() as $component) {
  504.                     $component_data = [];
  505.     
  506.                     if (property_exists($component"helpText")) {
  507.                         $component_data['helpText'] = $component->helpText;
  508.                     }
  509.                     if (property_exists($component"name")) {
  510.                         $data[$component->name] = $component_data;
  511.                     }
  512.                 }
  513.             }
  514.     
  515.             $knpSnappyPdf->generateFromHtml(
  516.                 $this->renderView(
  517.                     'form/form_user_to_pdf.html.twig',
  518.                     [
  519.                         'demande' => $demande,
  520.                         'values' => $values,
  521.                         'data' => $data,
  522.                     ]
  523.                 ),
  524.                 $files_path $demande_pdf_filename
  525.             );
  526.     
  527.         } else {
  528.             $demande $entityManager->getRepository(Demande::class)->find($id);
  529.             $archive_file_name 'fp--d-' $demande->getId() . '.zip';
  530.             $demande_pdf_filename 'fp--d-' $demande->getId() . '.pdf';
  531.     
  532.             if (!file_exists($files_path $demande_pdf_filename)) {
  533.                 // generate demande pdf
  534.                 $typeProtection = [
  535.                     => 'Classe',
  536.                     => 'Protégé',
  537.                     => 'Aucun type de protection',
  538.                     => 'Autre type de protection'
  539.                 ];
  540.                 $TypeEtude = [
  541.                     => 'Relévé géometre',
  542.                     => 'Diagnostic',
  543.                     => 'Etudes architecturales',
  544.                     => 'Etudes techniques',
  545.                     => 'Autre'
  546.                 ];
  547.                 $SecteurProjet = [
  548.                     => 'Culturel',
  549.                     => 'Touristique',
  550.                     => 'Autre'
  551.                 ];
  552.     
  553.                 $knpSnappyPdf->generateFromHtml(
  554.                     $this->renderView(
  555.                         'demande/demande_to_pdf.html.twig',
  556.                         [
  557.                             'demande' => $demande,
  558.                             'typeProtection' => $typeProtection,
  559.                             'TypeEtude' => $TypeEtude,
  560.                             'SecteurProjet' => $SecteurProjet,
  561.                         ]
  562.                     ),
  563.                     $files_path $demande_pdf_filename
  564.                 );
  565.             }
  566.         }
  567.     
  568.         $archive_file $files_path $archive_file_name;
  569.     
  570.         // create the file and throw the error if unsuccessful
  571.         if ($zip->open($archive_file\ZipArchive::CREATE) !== TRUE) {
  572.             exit("cannot open <$archive_file_name>\n");
  573.         }
  574.     
  575.         // add demande pdf to archive
  576.         if (file_exists($files_path $demande_pdf_filename)) {
  577.             $zip->addFile($files_path $demande_pdf_filename$demande_pdf_filename);
  578.         }
  579.     
  580.         if ($type == 'formuser') {
  581.             // add each file of $file_name array to archive
  582.             foreach ($demande->getFormValues() as $formValue) {
  583.                 if ($formValue->getFormChamp()->getType() == 'file') {
  584.                     foreach (explode(','$formValue->getValueStream()) as $val) {
  585.                         if (file_exists($files_path $val) && is_file($files_path $val)) {
  586.                             $zip->addFile($files_path $valbasename($val));
  587.                         }
  588.                     }
  589.                 }
  590.             }
  591.     
  592.             // add note files to archive
  593.             foreach ($demande->getFormUserNotes() as $note) {
  594.                 $note_files_path $this->getParameter('uploads_directory') . '/note/autre/f-' $note->getFormUser()->getForm()->getId() . '/d-' $note->getFormUser()->getId() . '/';
  595.                 if ($note->getFiles()) {
  596.                     foreach ($note->getFiles() as $file) {
  597.                         if (file_exists($note_files_path $file) && is_file($note_files_path $file)) {
  598.                             $zip->addFile($note_files_path $filebasename($file));
  599.                         }
  600.                     }
  601.                 }
  602.             }
  603.     
  604.         } else {
  605.             $demande_files_path $this->getParameter('demande_directory');
  606.             $this->addFilesToZip($zip$demande->getDemandePhotoBatiments(), $demande_files_path);     
  607.             $this->addFilesToZip($zip$demande->getJustifiantProprietes(), $demande_files_path);
  608.             $this->addFilesToZip($zip$demande->getJustifiantApprobationSpontanes(), $demande_files_path);
  609.             $this->addFilesToZip($zip$demande->getDemandeJustificationProtections(), $demande_files_path);
  610.     
  611.             // add note files to archive
  612.             foreach ($demande->getDemandeNotes() as $note) {
  613.                 $note_files_path $this->getParameter('uploads_directory') . '/note/principale/d-' $note->getDemande()->getId() . '/';
  614.                 if ($note->getFiles()) {
  615.                     foreach ($note->getFiles() as $file) {
  616.                         if (file_exists($note_files_path $file) && is_file($note_files_path $file)) {
  617.                             $zip->addFile($note_files_path $filebasename($file));
  618.                         }
  619.                     }
  620.                 }
  621.             }
  622.         }
  623.     
  624.         $zip->close();
  625.     
  626.         //then send the headers to force download the zip file
  627.         header("Content-type: application/zip");
  628.         header("Content-Disposition: attachment; filename=$archive_file_name");
  629.         header("Content-length: " filesize($archive_file));
  630.         header("Pragma: no-cache");
  631.         header("Expires: 0");
  632.         readfile("$archive_file");
  633.         exit;
  634.     }
  635.     
  636.     private function addFilesToZip($zip$files$base_path)
  637.     {
  638.         foreach ($files as $file) {
  639.             $file_path $base_path '/' $file->getSource();
  640.             if (file_exists($file_path) && is_file($file_path)) {
  641.                 $zip->addFile($file_pathbasename($file_path));
  642.             }
  643.         }
  644.     }
  645.     
  646.     #[Route('/note/add/{type}/{id}'name'form_user_note_add')]
  647.     public function formUserNoteAdd(
  648.         $id,
  649.         $type 'formuser',
  650.         Request $request,
  651.         FileUploader $fileUploader,
  652.         EntityManagerInterface $entityManager,
  653.         NotificationManager $notificationManager
  654.     ): Response
  655.     {
  656.         $files = [];
  657.         if ( $type == 'formuser'){
  658.             $note = new FormUserNote();
  659.             $demande $entityManager->getRepository(FormUser::class)->find($id);
  660.             $formNote $this->createForm(FormUserNoteType::class, $note);
  661.         }else{
  662.             $note = new DemandeNote();
  663.             $demande $entityManager->getRepository(Demande::class)->find($id);
  664.             $formNote $this->createForm(DemandeNoteType::class, $note);
  665.         }
  666.         $formNote->handleRequest($request);
  667.         if ( $formNote->isSubmitted() ) {
  668.             $note->setUser($this->getUser());
  669.             $note->setIsPublic(true);
  670.             $note->setDate( new \DateTime() );
  671.             if ( $type == 'formuser'){
  672.                 foreach ( $request->files->get('form_user_note')['files'] as $file ){
  673.                     $filename $fileUploader->upload$file'/note/autre/f-' $demande->getForm()->getId() . '/d-' $demande->getId() );
  674.                     $files[] = $filename;
  675.                 }
  676.                 $note->setFiles($files);
  677.                 $note->setFormUser$demande );
  678.                 if ( $request->request->get('form_user_note')['isFinal'] == ){
  679.                     $demande->setEtat('VALIDATED');
  680.                 }
  681.             }else{
  682.                 foreach ( $request->files->get('demande_note')['files'] as $file ){
  683.                     $filename $fileUploader->upload$file'/note/principale/d-' $demande->getId() );
  684.                     $files[] = $filename;
  685.                 }
  686.                 $note->setFiles$files );
  687.                 $note->setDemande$demande );
  688.                 if ( $request->request->get('demande_note')['isFinal'] == ){
  689.                     $demande->setStatus('VALIDATED');
  690.                 }
  691.             }
  692.             $entityManager->persist($note);
  693.             $entityManager->flush();
  694.             // send notification email to "responsables" of new note
  695.             if ( $type == 'formuser') {
  696.                 $edit_demande_url $this->adminUrlGenerator
  697.                     ->setController(FormUserCrudController::class)
  698.                     ->setAction(Action::EDIT)
  699.                     ->setEntityId($id)
  700.                     ->generateUrl();
  701.                 $show_demande_url $this->generateUrl('form_show', array( 'id' => $demande->getId(), 'meeting_id' => ), UrlGenerator::ABSOLUTE_URL );
  702.             }else{
  703.                 $edit_demande_url $this->adminUrlGenerator
  704.                     ->setController(DemandeCrudController::class)
  705.                     ->setAction(Action::EDIT)
  706.                     ->setEntityId($id)
  707.                     ->generateUrl();
  708.                 $show_demande_url $this->generateUrl('app_demande_show', array( 'id' => $demande->getId() ), UrlGenerator::ABSOLUTE_URL );
  709.             }
  710.             foreach ( $demande->getResponsables() as $responsable ){
  711.                 $this->emailVerifier->sendEmailConfirmation(
  712.                     'app_verify_email',
  713.                     $this->getUser(),
  714.                     (new TemplatedEmail())
  715.                         ->from(new Address($this->getParameter('EmailAdmin'), 'IGPPP'))
  716.                         ->to$responsable->getEmail() )
  717.                         ->subject('Une nouvelle note a été ajoutée !')
  718.                         ->htmlTemplate('email/email_nouvelle_note.html.twig')
  719.                         ->context([
  720.                             'user' => $this->getUser()->getEmail(),
  721.                             'demande_url' => $edit_demande_url,
  722.                             'demande_id' => $note->getId(),
  723.                         ])
  724.                 );
  725.                 if ( $type == 'formuser') {
  726.                     $notification_message 'nouvelle note pour la demande ' $demande->getId() . ' du formulaire ' $demande->getForm()->getNom();
  727.                     $notificationManager->pushMessage('Une nouvelle note a été ajoutée !'$notification_message$responsable$edit_demande_url);
  728.                 }else{
  729.                     $notification_message 'nouvelle note pour la demande ' $demande->getId() . ' du formulaire de demande d’assistance technique de l’IGPPP';
  730.                     $notificationManager->pushMessage('Une nouvelle note a été ajoutée !'$notification_message$responsable$edit_demande_url);
  731.                 }
  732.             }
  733.             // send notification of reception of note : "demandeur"
  734.             $this->emailVerifier->sendEmailConfirmation(
  735.                 'app_verify_email',
  736.                 $this->getUser(),
  737.                 (new TemplatedEmail())
  738.                     ->from(new Address($this->getParameter('EmailAdmin'), 'IGPPP'))
  739.                     ->to$this->getUser()->getEmail() )
  740.                     ->subject('Succès de réception du note !')
  741.                     ->htmlTemplate('email/email_notification_reception_note.html.twig')
  742.                     ->context([
  743.                         'demande_url' => $show_demande_url,
  744.                         'demande_id' => $note->getId(),
  745.                     ])
  746.             );
  747.             if ( $type == 'formuser') {
  748.                 $notification_message 'Succès de réception du note !' $demande->getId() . ' du formulaire ' $demande->getForm()->getNom();
  749.                 $notificationManager->pushMessage('Succès de réception du note !'$notification_message$this->getUser(), $show_demande_url);
  750.             }else{
  751.                 $notification_message 'Succès de réception du note !' $demande->getId() . ' du formulaire du formulaire de demande d’assistance technique de l’IGPPP';
  752.                 $notificationManager->pushMessage('Succès de réception du note !'$notification_message$this->getUser(), $show_demande_url);
  753.             }
  754.         }
  755.         if ($this->isGranted('ROLE_ADMIN') || $this->isGranted('ROLE_RD')) {
  756.             return $this->redirect($edit_demande_url);
  757.         }
  758.         return $this->redirect($show_demande_url);
  759.     }
  760.     #[Route('/Repondre/{id}'name'form_replay')]
  761.     public function form_replay($idFormRepository $formRepositoryEntityManagerInterface $entityManager,): Response
  762.     {
  763.         $formulaire $formRepository->find($id);
  764.         if (!$formulaire)
  765.             return $this->redirectToRoute('front');
  766.         if (!$formulaire->isPublier())
  767.             return $this->redirectToRoute('front');
  768.         $codes = [];
  769.         $villes $entityManager->getRepository(Ville::class)->findAll();
  770.         foreach ( $villes as $ville ){
  771.             $codes$ville->getNom() . ' ' $ville->getCodePostal() ] = $ville->getNom() . ' ' $ville->getCodePostal();
  772.         }
  773.         return $this->render('form/RepondreForm.html.twig', [
  774.             'Components' => $formulaire->getFormSteps(),
  775.             'Formulaire' => $formulaire,
  776.             'villes' => $codes
  777.         ]);
  778.     }
  779. }