src\Controller\AdminController.php line 550

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Controller\Admin\DashboardController;
  4. use App\Controller\Admin\UserSurveyCrudController;
  5. use App\Entity\AdminStatus;
  6. use App\Entity\Document;
  7. use App\Entity\DocumentTypeTag;
  8. use App\Entity\EntityTypeTag;
  9. use App\Entity\Order;
  10. use App\Entity\Survey;
  11. use App\Entity\Tag;
  12. use App\Entity\User;
  13. use App\Entity\UserFile;
  14. use App\Entity\UserFileDocument;
  15. use App\Entity\UserFileMissingFiles;
  16. use App\Entity\UserFileProperty;
  17. use App\Entity\UserSurvey;
  18. use App\Entity\UserSurveyComment;
  19. use App\Entity\UserSurveyStatus;
  20. use App\Form\updateUserSurveyResultType;
  21. use App\Form\updateUserSurveyStatusType;
  22. use App\Form\UserFile\UserFileDocumentAskType;
  23. use App\Form\UserFile\UserFileDocumentTagsType;
  24. use App\Form\UserFile\UserFileMissingFilesType;
  25. use App\Form\UserFile\UserFileMissingFileType;
  26. use App\Form\UserFile\UserFilePersonInvalidCredentialType;
  27. use App\Form\UserSurvey\AFCType;
  28. use App\Form\UserSurvey\CMUDateType;
  29. use App\Form\UserSurvey\CMUResultType;
  30. use App\Form\UserSurvey\IFResultType;
  31. use App\Form\UserSurvey\RmbLppDateType;
  32. use App\Form\UserSurvey\SimulationType;
  33. use App\Form\UserSurvey\updateUserSurveyType;
  34. use App\Form\UserSurvey\UserSurveyDateLimitType;
  35. use App\Form\UserSurveyCommentType;
  36. use App\Service\BexioService;
  37. use App\Service\DiscountService;
  38. use App\Service\EmailService;
  39. use App\Service\LogService;
  40. use App\Service\PaymentService;
  41. use App\Service\PdfService;
  42. use App\Service\RsPdfService;
  43. use App\Service\UserSurveyQueryService;
  44. use App\Service\UserSurveyService;
  45. use App\Service\XmlService;
  46. use App\Service\XmlServiceQuasiResident;
  47. use DateTime;
  48. use Doctrine\ORM\EntityManagerInterface;
  49. use Doctrine\ORM\Tools\Pagination\Paginator;
  50. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  51. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  52. use Exception;
  53. use PhpParser\Comment\Doc;
  54. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  55. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  56. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  57. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  58. use Symfony\Component\HttpFoundation\JsonResponse;
  59. use Symfony\Component\HttpFoundation\RedirectResponse;
  60. use Symfony\Component\HttpFoundation\Request;
  61. use Symfony\Component\HttpFoundation\RequestStack;
  62. use Symfony\Component\HttpFoundation\Response;
  63. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  64. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  65. use Symfony\Component\Routing\Annotation\Route;
  66. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  67. /**
  68.  * Require ROLE_ADMIN for *every* controller method in this class.
  69.  *
  70.  * @Route("/admin", name="admin_")
  71.  * @IsGranted("ROLE_ADMIN")
  72.  */
  73. class AdminController extends DashboardController implements EventSubscriberInterface
  74. {
  75.     public EntityManagerInterface $em;
  76.     public RequestStack $request;
  77.     private EmailService $emailService;
  78.     private XmlService $xmlService;
  79.     private XmlServiceQuasiResident $xmlServiceQuasiResident;
  80.     private DiscountService $discountService;
  81.     private UserSurveyService $userSurveyService;
  82.     private UserSurveyQueryService $userSurveyQueryService;
  83.     private PdfService $pdfService;
  84.     private AdminUrlGenerator $adminUrlGenerator;
  85.     private LogService $logService;
  86.     private array $autorizedStatusForComplete;
  87.     private array $autorizedStatusForIncomplete;
  88.     private BexioService $bexioService;
  89.     private PaymentService $paymentService;
  90.     private RsPdfService $rsPdfService;
  91.     public function __construct(EmailService $emailServiceXmlService $xmlServiceXmlServiceQuasiResident $xmlServiceQuasiResidentDiscountService $discountServiceUserSurveyService $userSurveyServiceUserSurveyQueryService $userSurveyQueryServicePdfService $pdfServiceEntityManagerInterface $entityManagerRequestStack $requestAdminUrlGenerator $adminUrlGeneratorLogService $logServiceBexioService $bexioServicePaymentService $paymentServiceRsPdfService $rsPdfService)
  92.     {
  93.         $this->emailService $emailService;
  94.         $this->xmlService $xmlService;
  95.         $this->xmlServiceQuasiResident $xmlServiceQuasiResident;
  96.         $this->discountService $discountService;
  97.         $this->userSurveyService $userSurveyService;
  98.         $this->userSurveyQueryService $userSurveyQueryService;
  99.         $this->pdfService $pdfService;
  100.         $this->em $entityManager;
  101.         $this->request $request;
  102.         $this->adminUrlGenerator $adminUrlGenerator;
  103.         $this->logService $logService;
  104.         $this->paymentService $paymentService;
  105.         $this->rsPdfService $rsPdfService;
  106.         $this->autorizedStatusForComplete = ['PROCESSING_FILES_RECEIVED''PROCESSING_FILES_MISSING''PROCESSING_MISSING_FILES_SENT'];
  107.         $this->autorizedStatusForIncomplete = ['PROCESSING_FILES_RECEIVED''PROCESSING_FILES_MISSING''PROCESSING_MISSING_FILES_SENT'];
  108.         $this->bexioService $bexioService;
  109.     }
  110.     public static function getSubscribedEvents()
  111.     {
  112.         return [];
  113.     }
  114.     /**
  115.      * @Route("/impersonate/{id}",name = "impersonate")
  116.      *
  117.      * @return Response
  118.      */
  119.     public function impersonate($id)
  120.     {
  121.         $user $this->em->getRepository(User::class)->find($id);
  122.         if (!$user) {
  123.             throw new NotFoundHttpException();
  124.         }
  125.         // if (count($this->get('security.token_storage')->getToken()->getRoles()) > 2) {
  126.         if ($this->isGranted('IS_IMPERSONATOR')) {
  127.             return $this->redirectToRoute('admin_reimpersonate', [
  128.                 'id' => $id,
  129.                 '_switch_user' => '_exit',
  130.             ]);
  131.         }
  132.         return $this->redirectToRoute('espace_client_index', [
  133.             '_switch_user' => $user->getUserIdentifier(),
  134.         ]);
  135.     }
  136.     /**
  137.      * @Route("/admin/reimpersonate/{id}", name = "reimpersonate")
  138.      *
  139.      * @return RedirectResponse|Response
  140.      */
  141.     public function reimpersonateAction($id)
  142.     {
  143.         $user $this->em->getRepository(User::class)->find($id);
  144.         if (!$user) {
  145.             throw new NotFoundHttpException();
  146.         }
  147.         return $this->redirectToRoute('espace_client_index', [
  148.             '_switch_user' => $user->getUserIdentifier(),
  149.         ]);
  150.     }
  151.     /**
  152.      * @return Response
  153.      */
  154.     public function exportUserSurveyCSVAction(Request $request)
  155.     {
  156.         $id $request->query->get('id');
  157.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($id);
  158.         if (!$userSurvey) {
  159.             throw new NotFoundHttpException();
  160.         }
  161.         $fileName 'export_csv_questionnaire_' date('d_m_y') . '_' $userSurvey->getId() . '.csv';
  162.         $file $this->getParameter('webdir') . '/uploads/files/' $fileName;
  163.         $fp fopen($file'w');
  164.         // HEADER CONTENT
  165.         $fields = ['Prestation : ' $userSurvey->conditionalSurveyName(), 'Client : ' $userSurvey->getUser()->getFullName(), 'Statut : ' $userSurvey->getSurveyStatusLabel()];
  166.         fputcsv($fp$fields);
  167.         $fields = [''''''];
  168.         fputcsv($fp$fields);
  169.         // COLUMN
  170.         $fields = ['Groupes de questions''Questions''Réponses'];
  171.         fputcsv($fp$fields);
  172.         foreach ($userSurvey->getUserSurveyQuestions() as $answer) {
  173.             $fields = [$answer->getQuestionGroup()->getName(), $answer->getQuestion()->getName()];
  174.             if ('FileType' == $answer->getQuestion()->getType()->getType() && '' != $answer->getValue() && !is_null($answer->getValue())) {
  175.                 $fields[] = $_ENV['ONLINE_BASE_PATH'] . '/uploads/files/' $answer->getValue();
  176.             } else {
  177.                 $fields[] = $answer->getValue();
  178.             }
  179.             fputcsv($fp$fields);
  180.         }
  181.         fclose($fp);
  182.         $content utf8_decode(file_get_contents($file));
  183.         unlink($file);
  184.         $response = new Response($content);
  185.         $response->headers->set('Content-Type''text/csv');
  186.         $disposition $response->headers->makeDisposition(
  187.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  188.             $fileName
  189.         );
  190.         $response->headers->set('Content-Disposition'$disposition);
  191.         return $response;
  192.     }
  193.     /**
  194.      * @Route("/admin/download/usersurvey/files/{id}", name = "download_usersurvey_files")
  195.      *
  196.      * @return Response
  197.      */
  198.     public function downloadUserSurveyFilesAction($id)
  199.     {
  200.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($id);
  201.         if (!$userSurvey) {
  202.             throw new NotFoundHttpException();
  203.         }
  204.         $userFile $userSurvey->getUserFile();
  205.         $files = [];
  206.         foreach ($userFile->getUserFileDocuments() as $document) {
  207.             $files[] = $this->getParameter('webdir') . '/uploads/files/documents/' $userSurvey->getId() . '/' $document->getFileName();
  208.         }
  209.         if (!empty($files)) {
  210.             $zip = new \ZipArchive();
  211.             // The name of the Zip documents.
  212.             $zipName $this->getParameter('webdir') . '/uploads/files/Documents_' $userSurvey->getId() . '.zip';
  213.             $zip->open($zipName\ZipArchive::CREATE);
  214.             foreach ($files as $file) {
  215.                 // $zip->addFromString(basename($file),  file_get_contents($file));
  216.                 $zip->addFile($filebasename($file));
  217.             }
  218.             $zip->close();
  219.             $response = new Response(file_get_contents($zipName));
  220.             $response->headers->set('Content-Type''application/zip');
  221.             $response->headers->set('Content-Disposition''attachment;filename="Documents_' $userSurvey->getId() . '.zip"');
  222.             $response->headers->set('Content-length'filesize($zipName));
  223.             @unlink($zipName);
  224.             return $response;
  225.         } else {
  226.             $this->addFlash('danger''Aucun fichier à télécharger pour cette prestation.');
  227.             $url $this->adminUrlGenerator
  228.                 ->setController(UserSurveyCrudController::class)
  229.                 ->setAction(Action::INDEX)
  230.                 ->generateUrl();
  231.             return $this->redirect($url);
  232.         }
  233.     }
  234.     /**
  235.      * @Route("/admin/getax/generate/file/{userSurveyId}", name = "getax_generate_file", requirements={"userSurveyId"="\d+"})
  236.      *
  237.      * @return Response
  238.      */
  239.     public function generateGetaxFileAction(Request $requestint $userSurveyId 0)
  240.     {
  241.         if (== $userSurveyId) {
  242.             $userSurveyId $request->get('id');
  243.         }
  244.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  245.         if (!$userSurvey) {
  246.             throw new NotFoundHttpException();
  247.         }
  248.         $baseUserSurvey $userSurvey;
  249.         if (!is_null($userSurvey->getParent())) {
  250.             $baseUserSurvey $userSurvey->getParent();
  251.         }
  252.         if ('QUASI_RESID' == $userSurvey->getSurvey()->getCode()) {
  253.             $xml $this->xmlServiceQuasiResident->generateGetaxXmlFile($userSurvey);
  254.         } else {
  255.             $xml $this->xmlService->generateGetaxXmlFile($baseUserSurvey);
  256.         }
  257.         file_put_contents($this->getParameter('webdir') . '/uploads/files/getax/xml/' $userSurvey->getId() . '_' $userSurvey->getUser()->getLastname() . $userSurvey->getUser()->getName() . (date('Y') - 1) . '_' date('d_m_y_h_i') . '.xml'$xml);
  258.         $this->addFlash('success''Fichier Getax généré');
  259.         return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
  260.     }
  261.     /**
  262.      * @Route("/admin/getax/download/file/{id}", name = "getax_download_file")
  263.      *
  264.      * @return Response
  265.      */
  266.     public function getGetaxTaxFileAction($id)
  267.     {
  268.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($id);
  269.         if (!$userSurvey) {
  270.             throw new NotFoundHttpException();
  271.         }
  272.         if ($userSurvey->hasGetaxFile($this->getParameter('webdir'))) {
  273.             $file $this->getParameter('webdir') . '/uploads/files/getax/tax/' $userSurvey->getId() . '_' $userSurvey->getUser()->getLastname() . $userSurvey->getUser()->getName() . (date('Y') - 1) . '_' date('d_m_y') . '.tax';
  274.             $response = new Response(file_get_contents($file));
  275.             $response->headers->set('Content-Type''application/xml');
  276.             $response->headers->set('Content-Disposition''attachment;filename="' $userSurvey->getId() . '_' $userSurvey->getUser()->getLastname() . $userSurvey->getUser()->getName() . (date('Y') - 1) . '_' date('d_m_y') . '.tax' '"');
  277.             $response->headers->set('Content-length'filesize($file));
  278.             return $response;
  279.         } else {
  280.             $this->addFlash('danger''Aucun fichier à télécharger pour cette prestation.');
  281.             $url $this->adminUrlGenerator
  282.                 ->setController(UserSurveyCrudController::class)
  283.                 ->setAction(Action::INDEX)
  284.                 ->generateUrl();
  285.             return $this->redirect($url);
  286.         }
  287.     }
  288.     /**
  289.      * @Route("/admin/batchupdate/usersurvey/status/{ids}", name = "batch_usersurvey_status")
  290.      *
  291.      * @return RedirectResponse|Response
  292.      */
  293.     public function updateStatusformAction(Request $requeststring $ids)
  294.     {
  295.         $form $this->createForm(updateUserSurveyStatusType::class);
  296.         $form->handleRequest($request);
  297.         if ($form->isSubmitted() && $form->isValid()) {
  298.             $ids explode('-'$ids);
  299.             foreach ($ids as $id) {
  300.                 $userSurvey $this->em->getRepository(UserSurvey::class)->find($id);
  301.                 $this->emailService->sendUserSurveyStatusChange($userSurvey);
  302.                 $userSurvey->setUserSurveyStatus($form->getData()['userSurveyStatus']);
  303.                 $userSurvey->setDateAFC($form->getData()['dateAFC']);
  304.                 $userSurvey->setResultAFC($form->getData()['resultAFC']);
  305.                 $userSurvey->setResultAFCComment($form->getData()['resultAFCComment']);
  306.                 $this->em->persist($userSurvey);
  307.             }
  308.             $this->em->flush();
  309.             $url $this->adminUrlGenerator
  310.                 ->setController(UserSurveyCrudController::class)
  311.                 ->setAction(Action::INDEX)
  312.                 ->generateUrl();
  313.             return $this->redirect($url);
  314.         }
  315.         return $this->render('admin/update_usersurvey_status.html.twig', [
  316.             'form' => $form->createView(),
  317.             'ids' => $ids,
  318.             'type' => 'STATUS',
  319.         ]);
  320.     }
  321.     /**
  322.      * @Route("/admin/batchupdate/usersurvey/result/{ids}", name = "batch_usersurvey_result")
  323.      *
  324.      * @return RedirectResponse|Response
  325.      */
  326.     public function updateResultformAction(Request $requeststring $ids)
  327.     {
  328.         $form $this->createForm(updateUserSurveyResultType::class);
  329.         $form->handleRequest($request);
  330.         if ($form->isSubmitted() && $form->isValid()) {
  331.             $ids explode('-'$ids);
  332.             foreach ($ids as $id) {
  333.                 $userSurvey $this->em->getRepository(UserSurvey::class)->find($id);
  334.                 $userSurvey->setResultCode($form->getData()['result']);
  335.                 if ('QR' == $userSurvey->getResultCode()) {
  336.                     $resultSurvey $this->em->getRepository(Survey::class)->findOneByCode('QUASI_RESID');
  337.                     $userSurvey->setResultSurvey($resultSurvey);
  338.                 } elseif ('RS' == $userSurvey->getResultCode()) {
  339.                     $resultSurvey $this->em->getRepository(Survey::class)->findOneByCode('RECT_STD');
  340.                     $userSurvey->setResultSurvey($resultSurvey);
  341.                 } else {
  342.                     $userSurvey->setResultSurvey(null);
  343.                 }
  344.                 $status $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('DONE');
  345.                 $userSurvey->setUserSurveyStatus($status);
  346.                 $this->em->persist($userSurvey);
  347.                 $this->emailService->sendUserSurveyStatusChange($userSurvey);
  348.             }
  349.             $this->em->flush();
  350.             $url $this->adminUrlGenerator
  351.                 ->setController(UserSurveyCrudController::class)
  352.                 ->setAction(Action::INDEX)
  353.                 ->generateUrl();
  354.             return $this->redirect($url);
  355.         }
  356.         return $this->render('admin/update_usersurvey_status.html.twig', [
  357.             'form' => $form->createView(),
  358.             'ids' => $ids,
  359.             'type' => 'RESULT',
  360.         ]);
  361.     }
  362.     /**
  363.      * @Route("/admin/getax/download/all", name = "getax_download_all")
  364.      */
  365.     public function downloadAllGetaxFilesAction()
  366.     {
  367.         $files scandir($_ENV['GOOGLE_DRIVE_TAX_FOLDER']);
  368.         if (count($files) > 2) {
  369.             $zip = new \ZipArchive();
  370.             // The name of the Zip documents.
  371.             $zipName $this->getParameter('webdir') . '/uploads/files/getax_all.zip';
  372.             $zip->open($zipName\ZipArchive::CREATE);
  373.             foreach ($files as $fileName) {
  374.                 if (!in_array($fileName, ['.''..'])) {
  375.                     $file $this->getParameter('webdir') . '/uploads/files/getax/tax/' $fileName;
  376.                     $zip->addFromString(basename($file), file_get_contents($file));
  377.                 }
  378.             }
  379.             $zip->close();
  380.             $response = new Response(file_get_contents($zipName));
  381.             $response->headers->set('Content-Type''application/zip');
  382.             $response->headers->set('Content-Disposition''attachment;filename="getax_all.zip"');
  383.             $response->headers->set('Content-length'filesize($zipName));
  384.             @unlink($zipName);
  385.             return $response;
  386.         } else {
  387.             $this->addFlash('danger''Aucuns fichiers trouvés');
  388.             $url $this->adminUrlGenerator
  389.                 ->setController(UserSurveyCrudController::class)
  390.                 ->setAction(Action::INDEX)
  391.                 ->generateUrl();
  392.             return $this->redirect($url);
  393.         }
  394.     }
  395.     /**
  396.      * @Route("/admin/getax/monitor", name = "getax_monitor_robot")
  397.      */
  398.     public function monitorGetaxRobotAction(Request $request)
  399.     {
  400.         if ($request->isXmlHttpRequest()) {
  401.             $url $_ENV['LOCAL_MONITOR_PATH'];
  402.             $ch curl_init();
  403.             curl_setopt($chCURLOPT_RETURNTRANSFER1);
  404.             curl_setopt($chCURLOPT_URL$url);
  405.             $jsonData curl_exec($ch);
  406.         } else {
  407.             $jsonData = ['result' => false];
  408.         }
  409.         return new JsonResponse($jsonData);
  410.     }
  411.     /**
  412.      * @Route("/count/survey", name = "count_survey")
  413.      */
  414.     public function countSurveyAction(Request $request)
  415.     {
  416.         $jsonData = ['result' => false];
  417.         if ($request->isXmlHttpRequest()) {
  418.             $userSurveysQuery $this->em->getRepository(UserSurvey::class)
  419.                 ->createQueryBuilder('us')
  420.                 ->join('us.userSurveyStatus''uss')
  421.                 ->where('us.survey = :survey')
  422.                 ->andWhere('uss.code = :status')
  423.                 ->andWhere('us.isArchived = :isArchived')
  424.                 ->setParameters(['survey' => $request->request->get('survey'), 'status' => $request->request->get('status'), 'isArchived' => 0])
  425.                 ->getQuery();
  426.             $userSurveys count(new Paginator($userSurveysQuery));
  427.             $jsonData = ['result' => $userSurveys];
  428.         }
  429.         return new JsonResponse($jsonData);
  430.     }
  431.     /**
  432.      * @Route("/count/date/survey", name = "count_survey_date")
  433.      *
  434.      * @throws Exception
  435.      */
  436.     public function countSurveyDateAction(Request $request)
  437.     {
  438.         $jsonData = ['result' => false];
  439.         if ($request->isXmlHttpRequest()) {
  440.             $dateLimits $this->em->getRepository(UserSurvey::class)->findLast();
  441.             $dateLimits[0]->fillDateLimitArray();
  442.             $dateLimitArray $dateLimits[0]->getDateLimitArray();
  443.             if (!empty($dateLimitArray)) {
  444.                 $keys array_keys($dateLimitArray);
  445.                 $usRepoQueryBuilder $this->em->getRepository(UserSurvey::class)->createQueryBuilder('entity');
  446.                 $queryBuilder $this->userSurveyQueryService->initQueryBuilder($usRepoQueryBuilder);
  447.                 $queryBuilder $this->userSurveyQueryService->getUserSurveyDateLimitFilterQueryBuilder($usRepoQueryBuilder$request->get('dateLimit'));
  448.                 if (!empty($request->get('status'))) {
  449.                     $status_list explode(','$request->get('status'));
  450.                     $queryBuilder $this->userSurveyQueryService->getUserSurveyStatusFilterQueryBuilder($queryBuilder$status_list);
  451.                 }
  452.                 $userSurveys count(new Paginator($queryBuilder->getQuery()));
  453.                 $jsonData = ['result' => $userSurveys];
  454.             }
  455.         }
  456.         return new JsonResponse($jsonData);
  457.     }
  458.     /**
  459.      * @Route(path = "/usersurvey/display/{id}", name = "usersurvey_display")
  460.      *
  461.      * @return RedirectResponse|Response
  462.      */
  463.     public function displayUserSurveyAction(Request $request$id)
  464.     {
  465.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($id);
  466.         if (!$userSurvey) {
  467.             throw new NotFoundHttpException();
  468.         }
  469.         $userFile $userSurvey->getUserFile();
  470.         $current_status $userSurvey->getStatus();
  471.         $current_resultCode $userSurvey->getResultCode();
  472.         $current_datelimit $userSurvey->getDateLimit();
  473.         $wasPaid $userSurvey->isPaid();
  474.         $oldPrice $userSurvey->getPrice();
  475.         $sendMail false;
  476.         // form pour le resultat de la simulation
  477.         $formSimulation $this->createForm(SimulationType::class, $userSurvey);
  478.         $formSimulation->handleRequest($request);
  479.         if ($formSimulation->isSubmitted() && $formSimulation->isValid()) {
  480.             $userSurvey $formSimulation->getData();
  481.             $statusChange $formSimulation->get('statusChange')->getData();
  482.             $switchToPaid $formSimulation->get('switchToPaid')->getData();
  483.             $sendMail $formSimulation->get('sendMail')->getData();
  484.             // pour les resultats simulations
  485.             if ($current_resultCode != $userSurvey->getResultCode()) {
  486.                 $this->userSurveyService->setSurveyResult($userSurvey);
  487.             }
  488.             if ($switchToPaid) {
  489.                 $userSurvey->setPaymentStatus('payedout');
  490.             }
  491.             if ($statusChange) {
  492.                 $status $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('DONE_PAYMENT_PENDING');
  493.                 if ($switchToPaid || $userSurvey->isPaid()) {
  494.                     $status $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('DONE');
  495.                 }
  496.                 $userSurvey->setUserSurveyStatus($status);
  497.             }
  498.             $this->em->persist($userSurvey);
  499.             $this->em->flush();
  500.             $this->addFlash('success''Resulat de la simulation sauvegardé');
  501.         }
  502.         // form pour le resultat AFC
  503.         $formAFC $this->createForm(AFCType::class, $userSurvey);
  504.         $formAFC->handleRequest($request);
  505.         if ($formAFC->isSubmitted() && $formAFC->isValid()) {
  506.             $userSurvey $formAFC->getData();
  507.             $statusChange $formAFC->get('statusChange')->getData();
  508.             $switchToPaid $formAFC->get('switchToPaid')->getData();
  509.             $sendMail $formAFC->get('sendMail')->getData();
  510.             if ($switchToPaid) {
  511.                 $userSurvey->setPaymentStatus('payedout');
  512.             }
  513.             if ($statusChange) {
  514.                 $userSurveyStatus $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('DONE_PAYMENT_PENDING');
  515.                 if ($switchToPaid || $userSurvey->isPaid()) {
  516.                     $userSurveyStatus $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FILES_POSTED');
  517.                 }
  518.                 $userSurvey->setUserSurveyStatus($userSurveyStatus);
  519.             }
  520.             $this->em->persist($userSurvey);
  521.             $this->em->flush();
  522.             $this->addFlash('success''Resulat AFC sauvegardé');
  523.         }
  524.         // form pour le resultat CMU
  525.         $formCMU $this->createForm(CMUResultType::class, $userSurvey);
  526.         $formCMU->handleRequest($request);
  527.         if ($formCMU->isSubmitted() && $formCMU->isValid()) {
  528.             $userSurvey $formCMU->getData();
  529.             $statusChange $formCMU->get('statusChange')->getData();
  530.             $sendMail $formCMU->get('sendMail')->getData();
  531.             $order $userSurvey->getOrder();
  532.             if ($order) {
  533.                 // Mise à jour du prix de la prestation.
  534.                 $selectedProducts $userSurvey->calculatePriceNew($this->userSurveyService);
  535.                 // facture
  536.                 $this->userSurveyService->generateUserSurveyBexioArticle($userSurvey$selectedProducts);
  537.                 // Si changement de prix. On met à jour la facture (annule et replace)
  538.                 if ($oldPrice != $userSurvey->getPrice() && !in_array($userSurvey->getStatus(), ['CANCELED''INIT''ONGOING']) && !is_null($order->getBexioInvoiceId())) {
  539.                     $this->paymentService->updateInvoice($order);
  540.                 }
  541.             }
  542.             if ($statusChange) {
  543.                 if ('CORRECT' == $userSurvey->getCmuResultType()) {
  544.                     $userSurveyStatus $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('DONE');
  545.                 } else {
  546.                     $userSurveyStatus $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('OFFER_PENDING');
  547.                 }
  548.                 $userSurvey->setUserSurveyStatus($userSurveyStatus);
  549.                 $this->userSurveyService->finishUserSurvey($userSurvey);
  550.             }
  551.             $this->em->persist($userSurvey);
  552.             $this->em->flush();
  553.             $this->addFlash('success''Resulat CMU sauvegardé');
  554.         }
  555.         // form pour le dépot CMU
  556.         $formCMUDate $this->createForm(CMUDateType::class, $userSurvey);
  557.         $formCMUDate->handleRequest($request);
  558.         if ($formCMUDate->isSubmitted() && $formCMUDate->isValid()) {
  559.             $userSurvey $formCMUDate->getData();
  560.             $statusChange $formCMUDate->get('statusChange')->getData();
  561.             $switchToPaid $formCMUDate->get('switchToPaid')->getData();
  562.             $sendMail $formCMUDate->get('sendMail')->getData();
  563.             if ($switchToPaid) {
  564.                 $userSurvey->setPaymentStatus('payedout');
  565.             }
  566.             if ($statusChange) {
  567.                 $userSurveyStatus $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FILES_POSTED_CMU');
  568.                 $userSurvey->setUserSurveyStatus($userSurveyStatus);
  569.             }
  570.             $this->em->persist($userSurvey);
  571.             $this->em->flush();
  572.             $this->addFlash('success''Resulat CMU sauvegardé');
  573.         }
  574.         // form pour le dépot des rmb LPP
  575.         $formRmbLpp $this->createForm(RmbLppDateType::class, $userSurvey);
  576.         $formRmbLpp->handleRequest($request);
  577.         if ($formRmbLpp->isSubmitted() && $formRmbLpp->isValid()) {
  578.             $userSurvey $formRmbLpp->getData();
  579.             $statusChange $formRmbLpp->get('statusChange')->getData();
  580.             $switchToPaid $formRmbLpp->get('switchToPaid')->getData();
  581.             $sendMail $formRmbLpp->get('sendMail')->getData();
  582.             if ($switchToPaid) {
  583.                 $userSurvey->setPaymentStatus('payedout');
  584.             }
  585.             if ($statusChange) {
  586.                 $userSurveyStatus $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FILES_POSTED');
  587.                 $userSurvey->setUserSurveyStatus($userSurveyStatus);
  588.             }
  589.             $this->em->persist($userSurvey);
  590.             $this->em->flush();
  591.             $this->addFlash('success''Date AFC sauvegardé');
  592.         }
  593.         // form pour le resultat Impot france
  594.         $formIF $this->createForm(IFResultType::class, $userSurvey);
  595.         $formIF->handleRequest($request);
  596.         if ($formIF->isSubmitted() && $formIF->isValid()) {
  597.             $userSurvey $formIF->getData();
  598.             $statusChange $formIF->get('statusChange')->getData();
  599.             $switchToPaid $formIF->get('switchToPaid')->getData();
  600.             $sendMail $formIF->get('sendMail')->getData();
  601.             if ($switchToPaid) {
  602.                 $userSurvey->setPaymentStatus('payedout');
  603.             }
  604.             if ($statusChange) {
  605.                 $userSurveyStatus $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('DONE_PAYMENT_PENDING');
  606.                 if ($switchToPaid || $userSurvey->isPaid()) {
  607.                     $userSurveyStatus $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FILES_POSTED_FR');
  608.                 }
  609.                 $userSurvey->setUserSurveyStatus($userSurveyStatus);
  610.             }
  611.             $this->em->persist($userSurvey);
  612.             $this->em->flush();
  613.             $this->addFlash('success''Resulat Impot France sauvegardé');
  614.         }
  615.         // form pour modifier les infos de base (status/prix/date etc..)
  616.         $formUserSurvey $this->createForm(updateUserSurveyType::class, $userSurvey);
  617.         $formUserSurvey->handleRequest($request);
  618.         if ($formUserSurvey->isSubmitted() && $formUserSurvey->isValid()) {
  619.             $userSurvey $formUserSurvey->getData();
  620.             $sendMail $formUserSurvey->get('sendMail')->getData();
  621.             if (!is_null($userSurvey->getOrder())) {
  622.                 $order $userSurvey->getOrder();
  623.                 // Le formulaire rajoute des réductions.
  624.                 foreach ($order->getDiscounts() as $discount) {
  625.                     if (is_null($discount->getType())) {
  626.                         $discount
  627.                             ->setType('ADMIN')
  628.                             ->setNbTimesUsed(1)
  629.                             ->setNbCounted(1)
  630.                             ->setDateValid(new DateTime())
  631.                             ->setCode($this->discountService->generateCode($userSurvey->getUser(), 'ADMIN'));
  632.                     }
  633.                 }
  634.                 // Annulation de la facture. Si annulé
  635.                 if ('CANCELED' == $userSurvey->getStatus()) {
  636.                     $order $userSurvey->getOrder();
  637.                     if (!is_null($order->getBexioInvoiceId())) {
  638.                         $this->bexioService->cancelInvoice($order->getBexioInvoiceId());
  639.                     }
  640.                 } else {
  641.                     if (!$userSurvey->isPaid()) {
  642.                         // Mise à jour du prix de la prestation.
  643.                         $selectedProducts $userSurvey->calculatePriceNew($this->userSurveyService);
  644.                         // facture
  645.                         $this->userSurveyService->generateUserSurveyBexioArticle($userSurvey$selectedProducts);
  646.                         // Si changement de prix. On met à jour la facture (annule et replace)
  647.                         if ($oldPrice != $userSurvey->getPrice() && !in_array($userSurvey->getStatus(), ['CANCELED''INIT''ONGOING'])) {
  648.                             $this->paymentService->updateInvoice($order);
  649.                         }
  650.                         $this->em->persist($order);
  651.                         $this->em->persist($userSurvey);
  652.                         $this->em->flush();
  653.                     }
  654.                 }
  655.             }
  656.             // annulation de la facture bexio
  657.             if ('CANCELED' == $userSurvey->getStatus()) {
  658.                 if (!is_null($userSurvey->getOrder())) {
  659.                     $order $userSurvey->getOrder();
  660.                     if (!is_null($order->getBexioInvoiceId())) {
  661.                         $this->bexioService->cancelInvoice($order->getBexioInvoiceId());
  662.                     }
  663.                 }
  664.             }
  665.             if ($current_datelimit != $userSurvey->getDateLimit()) {
  666.                 if ($sendMail) {
  667.                     $this->emailService->sendDateLimitUpdate($userSurvey);
  668.                 }
  669.             }
  670.             $this->em->persist($userSurvey);
  671.             $this->em->flush();
  672.             $this->addFlash('success''Dossier mis à jour avec succès');
  673.         }
  674.         // Si paiement : génération de la facture si inexistante et on la met en payé.
  675.         if ($userSurvey->isPaid() && !$wasPaid) {
  676.             $this->paymentService->processPayment($userSurvey$sendMailtrue);
  677.             if ($sendMail) {
  678.                 $this->emailService->sendUserSurveyPaymentStatusUpdate($userSurvey);
  679.             }
  680.         }
  681.         // changement de status
  682.         if ($current_status != $userSurvey->getStatus()) {
  683.             if ($sendMail) {
  684.                 $this->emailService->sendUserSurveyStatusChange($userSurvey);
  685.             }
  686.             // si simu : on lance la generation du XML
  687.             if ('SIMULATION' == $userSurvey->getSurvey()->getCode() && 'PROCESSING' == $userSurvey->getStatus()) {
  688.                 if (!is_null($userSurvey->getUserFile()->getOwner())) {
  689.                     $xml $this->xmlService->generateGetaxXmlFile($userSurvey);
  690.                     file_put_contents($this->getParameter('webdir') . '/uploads/files/getax/xml/' $userSurvey->getId() . '_' $userSurvey->getUser()->getLastname() . $userSurvey->getUser()->getName() . (date('Y') - 1) . '_' date('d_m_y') . '.xml'$xml);
  691.                     $this->addFlash('success''Fichier Getax généré');
  692.                 }
  693.             }
  694.             if ($userSurvey->getUserSurveyStatus()->getCode() == 'DONE_PAYMENT_PENDING') {
  695.                 if (!$userSurvey->getOrder()) {
  696.                     $order = new Order($userSurvey->getPrice(), $userSurvey);
  697.                     $userSurvey->setOrder($order);
  698.                 }
  699.                 $order $userSurvey->getOrder();
  700.                 $this->paymentService->adminPreparePayment($order);
  701.             }
  702.         }
  703.         $userSurveyComment = new UserSurveyComment();
  704.         $userSurveyComment->setUser($this->getUser());
  705.         $userSurveyComment->setUserSurvey($userSurvey);
  706.         $userSurveyCommentForm $this->createForm(UserSurveyCommentType::class, $userSurveyComment);
  707.         $userSurveyCommentForm->handleRequest($request);
  708.         if ($userSurveyCommentForm->isSubmitted()) {
  709.             if ($userSurveyCommentForm->isValid()) {
  710.                 $userSurveyComment $userSurveyCommentForm->getData();
  711.                 $this->em->persist($userSurveyComment);
  712.                 $this->em->flush();
  713.                 $this->addFlash('success''Commentaire ajouté');
  714.             } else {
  715.                 $this->addFlash('danger'"le commentaire n'as pas été ajouté");
  716.             }
  717.         }
  718.         $logStatusHistory $this->logService->getStatusChangeHistoryStrings($userSurvey);
  719.         $logPaymentHistory $this->logService->getPaymentStatusChangeHistoryStrings($userSurvey);
  720.         $logDateLimitHistory $this->logService->getDateLimitChangeHistoryStrings($userSurvey);
  721.         $logDocumentAskHistory $this->logService->getDocumentAskHistoryStrings($userSurvey);
  722.         /**
  723.          * Refresh des formulaires avec les nouvelles data...
  724.          */
  725.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($id);
  726.         $formSimulation $this->createForm(SimulationType::class, $userSurvey);
  727.         $formAFC $this->createForm(AFCType::class, $userSurvey);
  728.         $formIF $this->createForm(IFResultType::class, $userSurvey);
  729.         $formCMU $this->createForm(CMUResultType::class, $userSurvey);
  730.         $formCMUDate $this->createForm(CMUDateType::class, $userSurvey);
  731.         $formRmbLpp $this->createForm(RmbLppDateType::class, $userSurvey);
  732.         $formUserSurvey $this->createForm(updateUserSurveyType::class, $userSurvey);
  733.         $userSurveyComment = new UserSurveyComment();
  734.         $userSurveyComment->setUser($this->getUser());
  735.         $userSurveyComment->setUserSurvey($userSurvey);
  736.         $userSurveyCommentForm $this->createForm(UserSurveyCommentType::class, $userSurveyComment);
  737.         return $this->render('admin/display_user_survey/display_usersurvey.html.twig', [
  738.             'userSurvey' => $userSurvey,
  739.             'logStatusHistory' => $logStatusHistory,
  740.             'logPaymentHistory' => $logPaymentHistory,
  741.             'logDateLimitHistory' => $logDateLimitHistory,
  742.             'logDocumentAskHistory' => $logDocumentAskHistory,
  743.             'userFile' => $userFile,
  744.             'survey' => $userSurvey->getSurvey(),
  745.             'surveyMode' => $userSurvey->getSurveyModeObject(),
  746.             'formUserSurvey' => $formUserSurvey->createView(),
  747.             'formSimulation' => $formSimulation->createView(),
  748.             'formCMU' => $formCMU->createView(),
  749.             'formCMUDate' => $formCMUDate->createView(),
  750.             'formRmbLpp' => $formRmbLpp->createView(),
  751.             'formAFC' => $formAFC->createView(),
  752.             'formIF' => $formIF->createView(),
  753.             'userSurveyCommentForm' => $userSurveyCommentForm->createView(),
  754.             'user' => $userSurvey->getUser(),
  755.             'emails' => $userSurvey->getEmails()
  756.         ]);
  757.     }
  758.     /**
  759.      * @Route("/ajax/display/usersurvey/{userSurveyId}",name="ajax_display_usersurvey")
  760.      */
  761.     public function ajaxDisplayUserSurvey($userSurveyId): JsonResponse
  762.     {
  763.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  764.         if (!$userSurvey) {
  765.             throw new NotFoundHttpException();
  766.         }
  767.         $userFile $userSurvey->getUserFile();
  768.         return new JsonResponse($this->renderView('admin/display_user_survey/resume/resume.html.twig', [
  769.             'userSurvey' => $userSurvey,
  770.             'userFile' => $userFile,
  771.             'survey' => $userSurvey->getSurvey(),
  772.             'surveyMode' => $userSurvey->getSurveyModeObject(),
  773.             'user' => $userSurvey->getUser(),
  774.         ]));
  775.     }
  776.     /**
  777.      * @Route(path = "/usersurvey/access", name = "usersurvey_access")
  778.      *
  779.      * @return RedirectResponse|Response
  780.      */
  781.     public function accessUserSurveyAction(Request $request)
  782.     {
  783.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($request->query->get('id'));
  784.         if (!$userSurvey) {
  785.             throw new NotFoundHttpException();
  786.         }
  787.         $user $userSurvey->getUser();
  788.         // if (count($this->get('security.token_storage')->getToken()->getRoles()) > 2) {
  789.         if ($this->isGranted('IS_IMPERSONATOR')) {
  790.             return $this->redirectToRoute('admin_usersurvey_reaccess', [
  791.                 'id' => $userSurvey->getId(),
  792.                 '_switch_user' => '_exit',
  793.             ]);
  794.         }
  795.         return $this->redirectToRoute('usersurvey_process', [
  796.             'userSurveyId' => $userSurvey->getId(),
  797.             '_switch_user' => $user->getUserIdentifier(),
  798.         ]);
  799.     }
  800.     /**
  801.      * @Route("/usersurvey/reaccess/{id}", name = "usersurvey_reaccess")
  802.      *
  803.      * @return RedirectResponse|Response
  804.      */
  805.     public function reAccessUserSurveyAction($id)
  806.     {
  807.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($id);
  808.         if (!$userSurvey) {
  809.             throw new NotFoundHttpException();
  810.         }
  811.         $user $userSurvey->getUser();
  812.         return $this->redirectToRoute('usersurvey_process', [
  813.             'userSurveyId' => $userSurvey->getId(),
  814.             '_switch_user' => $user->getUserIdentifier(),
  815.         ]);
  816.     }
  817.     /**
  818.      * @Route("/usersurvey/updateStatus", name = "change_statut_color")
  819.      */
  820.     public function changeStatutColors(Request $request)
  821.     {
  822.         $jsonData = ['result' => false];
  823.         if ($request->isXmlHttpRequest()) {
  824.             $statusColor $this->em->getRepository(AdminStatus::class)->find($request->request->get('statut'));
  825.             $survey $this->em->getRepository(UserSurvey::class)->find($request->request->get('survey'));
  826.             $survey->setAdminStatus($statusColor);
  827.             $this->em->flush();
  828.             $jsonData = ['result' => $statusColor->getColor()];
  829.         }
  830.         return new JsonResponse($jsonData);
  831.     }
  832.     /**
  833.      * @Route("/usersurvey/deleteDocument/{idDocument}", name = "delete_document")
  834.      * @Route("/usersurvey/deleteDocumentArchived/{idDocument}", name = "delete_document_archived")
  835.      * @Route("/usersurvey/restoreDocumentArchived/{idDocumentToRestore}", name = "restore_document_archived")
  836.      */
  837.     public function deleteDocument($idDocument null$idDocumentToRestore null): JsonResponse
  838.     {
  839.         if ($idDocument) {
  840.             $userFileDocument $this->em->getRepository(UserFileDocument::class)->find((int)$idDocument);
  841.             if ($userFileDocument) {
  842.                 $userFileDocument->setIsArchived(true);
  843.                 $userFileDocument->setValidState(null);
  844.                 $userFileDocument->setSavedDocumentUser(null);
  845.                 $this->em->persist($userFileDocument);
  846.                 $this->em->flush();
  847.                 return new JsonResponse(true);
  848.             }
  849.         }
  850.         if ($idDocumentToRestore) {
  851.             $userFileDocument $this->em->getRepository(UserFileDocument::class)->find((int)$idDocumentToRestore);
  852.             if ($userFileDocument) {
  853.                 $userFileDocument->setIsArchived(false);
  854.                 $userFileDocument->setValidState(null);
  855.                 $userFileDocument->setSavedDocumentUser(null);
  856.                 $this->em->persist($userFileDocument);
  857.                 $this->em->flush();
  858.                 return new JsonResponse(true);
  859.             }
  860.         }
  861.         return new JsonResponse(false);
  862.     }
  863.     /**
  864.      * @Route("/ajax/validDoc/getArchivedDocs", name = "ajax_get_archived_documents")
  865.      */
  866.     public function getArchiveDocuments(Request $request): JsonResponse
  867.     {
  868.         $finalData = [];
  869.         $userFileId $request->get('userFileId');
  870.         $userSurveyId $request->get('userSurveyId');
  871.         $userFile $this->em->getRepository(UserFile::class)->find($userFileId);
  872.         /**
  873.          * @var UserFileDocument $ufda
  874.          */
  875.         foreach ($userFile->getArchivedDocuments() as $ufda) {
  876.             $id 0;
  877.             if ($ufda->getDocumentTag()) {
  878.                 $id $ufda->getDocumentTag()->getId();
  879.             }
  880.             $finalData[$id]['nameDocGroup'] = $ufda->getFullName();
  881.             $finalData[$id]['userFileDocument'][] = [
  882.                 'id' => $ufda->getId(),
  883.                 'name' => $ufda->getFileName(),
  884.                 'validState' => $ufda->getValidState(),
  885.                 'comment' => $ufda->getValidComment(),
  886.                 'path' => $request->getUriForPath('/uploads/files/documents/' $userSurveyId '/' $ufda->getFileName()),
  887.                 'deletePathDoc' => $this->generateUrl('admin_delete_document_archived', ['idDocument' => $ufda->getId()]),
  888.                 'restoreDoc' => $this->generateUrl('admin_restore_document_archived', ['idDocumentToRestore' => $ufda->getId()]),
  889.                 'archivedPathDoc' => $this->generateUrl('admin_delete_document', ['idDocument' => $ufda->getId()]),
  890.             ];
  891.         }
  892.         return new JsonResponse(['finalData' => $finalData'error' => null]);
  893.     }
  894.     /**
  895.      * @Route("/ajax/validDoc/valid", name = "ajax_valid_doc")
  896.      */
  897.     public function validDocument(Request $request): JsonResponse
  898.     {
  899.         $userFileDocumentId $request->get('userFileDocumentId');
  900.         $comment $request->get('comment');
  901.         $validation = (bool)$request->get('validation');
  902.         $userFileDocument $this->changeDocumentValidationStateId($userFileDocumentId$validation$comment);
  903.         $result false;
  904.         if ($userFileDocument->getValidState() === $validation) {
  905.             $result true;
  906.         }
  907.         return new JsonResponse(['result' => $result]);
  908.     }
  909.     private function changeDocumentValidationStateId($userFileDocumentId$state$comment '')
  910.     {
  911.         $userFileDocument $this->em->getRepository(UserFileDocument::class)->find((int)$userFileDocumentId);
  912.         $userFileDocument $this->changeDocumentValidationState($userFileDocument$state$comment);
  913.         return $userFileDocument;
  914.     }
  915.     private function changeDocumentValidationState(UserFileDocument $userFileDocument$state$comment '')
  916.     {
  917.         $userFileDocument->setValidState($state);
  918.         if ($state) {
  919.             $userFileDocument->setNotDeductible(false);
  920.         }
  921.         $userFileDocument->setValidComment($comment);
  922.         $this->em->persist($userFileDocument);
  923.         $this->em->flush();
  924.         return $userFileDocument;
  925.     }
  926.     /**
  927.      * @Route("/document/summary/{userFileId}/{userSurveyId}", name = "document_summary")
  928.      */
  929.     public function documentSummary(Request $request$userFileId$userSurveyId)
  930.     {
  931.         // liste des docs, voir les validé, invalidé, archvé
  932.         $userFile $this->em->getRepository(UserFile::class)->find((int)$userFileId);
  933.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  934.         $documents = [
  935.             'validated' => $userFile->getValidatedDocuments(),
  936.             'unvalidated' => $userFile->getUnvalidatedDocuments(),
  937.             'not_deductible' => $userFile->getNotDeductibleDocuments(),
  938.             'not_reviewed' => $userFile->getNotReviewedDocuments(),
  939.             'missing' => $this->userSurveyService->getMissingFiles($userSurvey$userFiletrue),
  940.             'missing_send_to_client' => $userFile->getUserFileMissingFilesToDocument(),
  941.             'archived' => $userFile->getArchivedDocuments(),
  942.         ];
  943.         return $this->render('admin/userFileDocument/document_summary.html.twig', [
  944.             'userSurvey' => $userSurvey,
  945.             'userFile' => $userFile,
  946.             'documents' => $documents,
  947.         ]);
  948.     }
  949.     /**
  950.      * @Route("/userfile/validate/{userFileId}/{userSurveyId}", name = "validate_userfile")
  951.      */
  952.     public function validateUserFile($userFileId$userSurveyId)
  953.     {
  954.         // check for missing documents/ not reviewed document
  955.         // if no missing and all document validated
  956.         // valid the userfile/userSurvey
  957.         // send the mail if needed
  958.         $userFile $this->em->getRepository(UserFile::class)->find($userFileId);
  959.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  960.         $isValid $userFile->isValid();
  961.         $original_status $userSurvey->getStatus();
  962.         $sendMail true;
  963.         if (!in_array($original_status$this->autorizedStatusForComplete)) {
  964.             $this->addFlash('danger'"Le dossier n'est pas dans le bon status. ");
  965.             return $this->redirectToRoute('admin_document_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  966.         }
  967.         if (true === $isValid['valid']) {
  968.             if ('SIMULATION' == $userSurvey->getSurvey()->getCode()) {
  969.                 $status $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING');
  970.                 $userSurvey->setUserSurveyStatus($status);
  971.                 // si simu : on lance la generation du XML
  972.                 if (!is_null($userSurvey->getUserFile()->getOwner())) {
  973.                     $xml $this->xmlService->generateGetaxXmlFile($userSurvey);
  974.                     file_put_contents($this->getParameter('webdir') . '/uploads/files/getax/xml/' $userSurvey->getId() . '_' $userSurvey->getUser()->getLastname() . $userSurvey->getUser()->getName() . (date('Y') - 1) . '_' date('d_m_y') . '.xml'$xml);
  975.                     $this->addFlash('success''Fichier Getax généré');
  976.                 }
  977.             } elseif ('REMBOURSEMENT_LPP' == $userSurvey->getSurvey()->getCode() && !$userFile->hasValidatedDocumentsByCode("DOC_IMP_FR")) {
  978.                 $status $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FR_WAIT');
  979.                 $userSurvey->setUserSurveyStatus($status);
  980.                 $document $this->em->getRepository(Document::class)->findOneBy(['code' => "DOC_IMP_FR"]);
  981.                 $documentTag = new DocumentTypeTag();
  982.                 $documentTag->setUserFile($userFile);
  983.                 $documentTag->setDocument($document);
  984.                 $this->em->persist($documentTag);
  985.                 $userFileMissingFile = new UserFileMissingFiles();
  986.                 $userFileMissingFile
  987.                     ->addTag($documentTag)
  988.                     ->setUserFile($userFile);
  989.                 $this->em->persist($userFileMissingFile);
  990.             } else {
  991.                 $status $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FILES_COMPLETED');
  992.                 $userSurvey->setUserSurveyStatus($status);
  993.             }
  994.             if ($original_status == $userSurvey->getStatus()) {
  995.                 $sendMail false;
  996.             }
  997.             $this->em->persist($userSurvey);
  998.             $this->em->flush();
  999.             // Mail to the customer only if the status has change
  1000.             if ($sendMail) {
  1001.                 $this->emailService->sendUserSurveyStatusChange($userSurvey);
  1002.             }
  1003.             return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
  1004.         }
  1005.         return $this->redirectToRoute('admin_document_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1006.     }
  1007.     /**
  1008.      * @Route("/userfile/sendMissingFiles/{userFileId}/{userSurveyId}", name = "send_missing_files")
  1009.      */
  1010.     public function sendMissingFile(Request $request$userFileId$userSurveyId)
  1011.     {
  1012.         // Create userMissingFiles based on empty document groups and invalid files
  1013.         $userFile $this->em->getRepository(UserFile::class)->find($userFileId);
  1014.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1015.         $sendMail true;
  1016.         if (!$userFile) {
  1017.             throw new NotFoundHttpException();
  1018.         }
  1019.         if (!$userSurvey) {
  1020.             throw new NotFoundHttpException();
  1021.         }
  1022.         $original_status $userSurvey->getStatus();
  1023.         if (!in_array($original_status$this->autorizedStatusForIncomplete)) {
  1024.             $this->addFlash('danger'"Le dossier n'est pas dans le bon status.");
  1025.             return $this->redirectToRoute('admin_document_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1026.         }
  1027.         // Documents obligatoires manquant
  1028.         // 1/ créé des userFileDocument avec les Tags du document Manquant
  1029.         $content $request->getContent();
  1030.         if (!empty($content)) {
  1031.             $data json_decode($contenttrue);
  1032.             foreach ($data as $ids) {
  1033.                 if (!is_null($ids)) {
  1034.                     $idTable explode(','$ids);
  1035.                     if (!$userFile->hasAlreadyAMissingFiles($idTable)) {
  1036.                         $userFileMissingFile = new UserFileMissingFiles();
  1037.                         $userFileMissingFile->setUserFile($userFile);
  1038.                         foreach ($idTable as $id) {
  1039.                             $tag $this->em->getRepository(Tag::class)->find($id);
  1040.                             if ($tag) {
  1041.                                 $userFileMissingFile->addTag($tag);
  1042.                             }
  1043.                         }
  1044.                         $this->em->persist($userFileMissingFile);
  1045.                     }
  1046.                 }
  1047.             }
  1048.         }
  1049.         // Documents invalides
  1050.         $invalidFiles $userFile->getUnvalidatedDocuments();
  1051.         foreach ($invalidFiles as $userFileDocument) {
  1052.             $tagIds $userFileDocument->getTagIds();
  1053.             if (!$userFile->hasAlreadyAMissingFiles($tagIds)) {
  1054.                 $userFileMissingFile = new UserFileMissingFiles($userFileDocument);
  1055.                 $this->em->persist($userFileMissingFile);
  1056.             }
  1057.         }
  1058.         // pass the usersurvey into missing files
  1059.         $status $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FILES_MISSING');
  1060.         $userSurvey->setUserSurveyStatus($status);
  1061.         $this->em->persist($userFile);
  1062.         $this->em->persist($userSurvey);
  1063.         $this->em->flush();
  1064.         // send mail
  1065.         if ($original_status == $userSurvey->getStatus()) {
  1066.             $sendMail false;
  1067.         }
  1068.         if ($sendMail) {
  1069.             $this->emailService->sendUserSurveyStatusChange($userSurvey);
  1070.             $this->addFlash('success''Fichiers mis à jour et client avertis par e-mail.');
  1071.         }
  1072.         // Redirect to document summary
  1073.         return $this->redirectToRoute('admin_document_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1074.     }
  1075.     /**
  1076.      * @Route("/delete/sent/missing/files/{userFileId}/{userSurveyId}", name="delete_sent_missing_files")
  1077.      */
  1078.     public function deleteSentMissingFiles(Request $request$userFileId$userSurveyId)
  1079.     {
  1080.         $userFile $this->em->getRepository(UserFile::class)->find($userFileId);
  1081.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1082.         if (!$userFile) {
  1083.             throw new NotFoundHttpException();
  1084.         }
  1085.         if (!$userSurvey) {
  1086.             throw new NotFoundHttpException();
  1087.         }
  1088.         $content $request->getContent();
  1089.         if (!empty($content)) {
  1090.             $data json_decode($contenttrue);
  1091.             if (!empty($data)) {
  1092.                 foreach ($data as $userFileMissingFileId) {
  1093.                     $userFileMissingFile $this->em->getRepository(UserFileMissingFiles::class)->find($userFileMissingFileId);
  1094.                     if ($userFileMissingFile) {
  1095.                         $this->em->remove($userFileMissingFile);
  1096.                     }
  1097.                 }
  1098.                 $this->em->flush();
  1099.             }
  1100.         }
  1101.         return $this->redirectToRoute('admin_document_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1102.     }
  1103.     /**
  1104.      * @Route("/ajax/createMissingFile/{userFileId}/{userSurveyId}", name = "ajax_create_missing_file")
  1105.      */
  1106.     public function ajaxCreateMissingFile(Request $request$userFileId$userSurveyId)
  1107.     {
  1108.         $userFile $this->em->getRepository(UserFile::class)->find($userFileId);
  1109.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1110.         if (!$userSurvey || !$userFile) {
  1111.             throw new NotFoundHttpException();
  1112.         }
  1113.         $form $this->createForm(
  1114.             UserFileDocumentAskType::class, null,
  1115.             [
  1116.                 'userFile' => $userFile,
  1117.                 'action' => $this->generateUrl(
  1118.                     'admin_ajax_create_missing_file',
  1119.                     [
  1120.                         'userSurveyId' => $userSurveyId,
  1121.                         'userFileId' => $userFileId
  1122.                     ]
  1123.                 ),
  1124.             ]
  1125.         );
  1126.         $form->handleRequest($request);
  1127.         if ($form->isSubmitted()) {
  1128.             if ($form->isValid()) {
  1129.                 $entityTypeTags $form->get('entityTypeTags')->getData();
  1130.                 $documentId $form->get('document')->getData();
  1131.                 $document $this->em->getRepository(Document::class)->find($documentId);
  1132.                 if ($userFile->hasTag($document)) {
  1133.                     $documentTag $userFile->getTag($document);
  1134.                 } else {
  1135.                     $documentTag = new DocumentTypeTag();
  1136.                     $documentTag->setUserFile($userFile)
  1137.                         ->setDocument($document);
  1138.                     $this->em->persist($documentTag);
  1139.                 }
  1140.                 if (!empty($entityTypeTags)) {
  1141.                     foreach (explode(','$entityTypeTags) as $entityTypeTagId) {
  1142.                         $entityTypeTag $this->em->getRepository(EntityTypeTag::class)->find($entityTypeTagId);
  1143.                         if (!is_null($entityTypeTag)) {
  1144.                             $userFileMissingFile = new UserFileMissingFiles();
  1145.                             $userFileMissingFile
  1146.                                 ->addTag($documentTag)
  1147.                                 ->addTag($entityTypeTag)
  1148.                                 ->setUserFile($userFile);
  1149.                             $this->em->persist($userFileMissingFile);
  1150.                         } else {
  1151.                             throw new Exception('Erreur lors de la création de la demande de document. Entitée non trouvée');
  1152.                         }
  1153.                     }
  1154.                 } else {
  1155.                     $userFileMissingFile = new UserFileMissingFiles();
  1156.                     $userFileMissingFile
  1157.                         ->addTag($documentTag)
  1158.                         ->setUserFile($userFile);
  1159.                     $this->em->persist($userFileMissingFile);
  1160.                 }
  1161.                 $this->em->flush();
  1162.                 $this->addFlash('success''Demande sauvegardée');
  1163.             } else {
  1164.                 $this->addFlash('danger'"Erreur lors de la création de la demande de document");
  1165.             }
  1166.             $source $request->get('source_url');
  1167.             return $this->redirect($source);
  1168.         }
  1169.         return new JsonResponse(
  1170.             $this->renderView('admin/modals/modal_create_edit_comment.html.twig', [
  1171.                 'userSurveyCommentForm' => $form->createView()
  1172.             ]));
  1173.     }
  1174.     /**
  1175.      * @Route("/ajax/check/userFileStatus/{userFileId}/{userSurveyId}", name = "ajax_check_userfile_status")
  1176.      *
  1177.      * @return JsonResponse
  1178.      */
  1179.     public function jsonCheckStatus(Request $request$userFileId$userSurveyId)
  1180.     {
  1181.         $userFile $this->em->getRepository(UserFile::class)->find($userFileId);
  1182.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1183.         if (!$userSurvey) {
  1184.             throw new NotFoundHttpException();
  1185.         }
  1186.         if (!$userFile) {
  1187.             throw new NotFoundHttpException();
  1188.         }
  1189.         $isValid $userFile->isValid();
  1190.         if (!in_array($userSurvey->getStatus(), $this->autorizedStatusForComplete)) {
  1191.             $isValid['valid'] = false;
  1192.             $isValid['msg'] = 'Impossible de valider le dossier : le status doit être en "Dossier receptionné" ou "Documents manquants envoyé"';
  1193.         }
  1194.         return new JsonResponse($isValid);
  1195.     }
  1196.     /**
  1197.      * @Route("/download/getax/files/old/{userFileId}/{userSurveyId}", name = "download_getax_files_old")
  1198.      *
  1199.      * @return Response
  1200.      */
  1201.     public function downloadGetaxFilesOld(Request $request$userFileId$userSurveyId)
  1202.     {
  1203.         $userFile $this->em->getRepository(UserFile::class)->find($userFileId);
  1204.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1205.         if (!$userSurvey) {
  1206.             throw new NotFoundHttpException();
  1207.         }
  1208.         if (!$userFile) {
  1209.             throw new NotFoundHttpException();
  1210.         }
  1211.         $userFileDocuments $userFile->getUserFileDocumentsSorted();
  1212.         if (!empty($userFileDocuments)) {
  1213.             $path $this->getParameter('webdir') . '/uploads/files/documents/' $userSurvey->getId() . '/';
  1214.             $valid_file_count 0;
  1215.             foreach ($userFileDocuments as $files_group) {
  1216.                 foreach ($files_group as $files) {
  1217.                     foreach ($files as $filename) {
  1218.                         if (!file_exists($path $filename)) {
  1219.                             $this->addFlash('danger''Fichier Introuvable : ' $filename);
  1220.                             return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1221.                         }
  1222.                         $path_parts pathinfo($filename);
  1223.                         if ('pdf' !== strtolower($path_parts['extension'])) {
  1224.                             $this->addFlash('danger''Fichier non PDF : ' $filename);
  1225.                             return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1226.                         }
  1227.                         ++$valid_file_count;
  1228.                     }
  1229.                 }
  1230.             }
  1231.             if ($valid_file_count 0) {
  1232.                 $outputName $this->pdfService->clean((!$this->getUser() instanceof User 'undefined User' strtoupper((string)$userSurvey->getUser()->getLastname()) . '-' ucfirst((string)$userSurvey->getUser()->getName())) . '-Getax' date('Y'strtotime('-1 year')));
  1233.                 $zip = new \ZipArchive();
  1234.                 // The name of the Zip documents.
  1235.                 $zipName $this->getParameter('webdir') . '/uploads/files/documents/' $userSurvey->getId() . '/' $outputName '.zip';
  1236.                 $zip->open($zipName\ZipArchive::CREATE);
  1237.                 foreach ($userFileDocuments as $entity => $files_group) {
  1238.                     foreach ($files_group as $order => $files) {
  1239.                         foreach ($files as $key => $filename) {
  1240.                             $file $this->getParameter('webdir') . '/uploads/files/documents/' $userSurvey->getId() . '/' $filename;
  1241.                             $output_name $entity '.' $order '.' $key '.' $filename;
  1242.                             $zip->addFile($filebasename($output_name));
  1243.                         }
  1244.                     }
  1245.                 }
  1246.                 $zip->close();
  1247.                 $response = new Response(file_get_contents($zipName));
  1248.                 $response->headers->set('Content-Type''application/zip');
  1249.                 $response->headers->set('Content-Disposition''attachment;filename="' $outputName '.zip"');
  1250.                 $response->headers->set('Content-length'filesize($zipName));
  1251.                 @unlink($zipName);
  1252.                 return $response;
  1253.             } else {
  1254.                 $this->addFlash('danger''Aucun fichier trouvé pour cette prestation.');
  1255.                 return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1256.             }
  1257.         } else {
  1258.             $this->addFlash('danger''Aucun fichier à télécharger pour cette prestation.');
  1259.             $url $this->adminUrlGenerator
  1260.                 ->setController(UserSurveyCrudController::class)
  1261.                 ->setAction(Action::INDEX)
  1262.                 ->generateUrl();
  1263.             return $this->redirect($url);
  1264.         }
  1265.     }
  1266.     /**
  1267.      * @Route("/download/getax/files/{userFileId}/{userSurveyId}", name = "download_getax_files")
  1268.      *
  1269.      * @return Response
  1270.      */
  1271.     public function downloadGetaxFiles(Request $request$userFileId$userSurveyId)
  1272.     {
  1273.         $userFile $this->em->getRepository(UserFile::class)->find($userFileId);
  1274.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1275.         if (!$userSurvey) {
  1276.             throw new NotFoundHttpException();
  1277.         }
  1278.         if (!$userFile) {
  1279.             throw new NotFoundHttpException();
  1280.         }
  1281.         $userFileDocuments $userFile->getValidatedDocuments();
  1282.         if (!$userFileDocuments->isEmpty()) {
  1283.             $files_to_merge = [];
  1284.             $path $this->getParameter('webdir') . '/uploads/files/documents/' $userSurvey->getId() . '/';
  1285.             foreach ($userFileDocuments as $userFileDocument) {
  1286.                 $filename $userFileDocument->getFileName();
  1287.                 if (!file_exists($path $filename)) {
  1288.                     $this->addFlash('danger''Fichier Introuvable : ' $filename);
  1289.                     return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1290.                 }
  1291.                 $path_parts pathinfo($filename);
  1292.                 if ('pdf' !== strtolower($path_parts['extension'])) {
  1293.                     $this->addFlash('danger''Fichier non PDF : ' $filename);
  1294.                     return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1295.                 }
  1296.                 if ($userFileDocument->hasDocumentTagByCode('CODE_DECLA')) {
  1297.                     continue;
  1298.                 }
  1299.                 $files_to_merge[] = $filename;
  1300.             }
  1301.             if (!empty($files_to_merge)) {
  1302.                 $mergedFile $this->pdfService->merge($path$files_to_merge);
  1303.                 if (true === $mergedFile['result']) {
  1304.                     $outputName $this->pdfService->clean((!$this->getUser() instanceof User 'undefined User' strtoupper((string)$userSurvey->getUser()->getLastname()) . '-' ucfirst((string)$userSurvey->getUser()->getName())) . '-Getax' date('Y'strtotime('-1 year')));
  1305.                     $zip = new \ZipArchive();
  1306.                     $zipName $this->getParameter('webdir') . '/uploads/files/' $outputName '.zip';
  1307.                     $zip->open($zipName\ZipArchive::CREATE);
  1308.                     $zip->addFile($path $mergedFile['outputFileName'], $outputName '.pdf');
  1309.                     $zip->close();
  1310.                     $response = new Response(file_get_contents($zipName));
  1311.                     $response->headers->set('Content-Type''application/zip');
  1312.                     $response->headers->set('Content-Disposition''attachment;filename="' $outputName '.zip"');
  1313.                     $response->headers->set('Content-length'filesize($zipName));
  1314.                     @unlink($zipName);
  1315.                     return $response;
  1316.                 } else {
  1317.                     $this->addFlash('danger'"Problème lors de l'appel a ILovePDF : " $mergedFile['msg']);
  1318.                     return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1319.                 }
  1320.             } else {
  1321.                 $this->addFlash('danger''Aucun fichier trouvé pour cette prestation.');
  1322.                 return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1323.             }
  1324.         } else {
  1325.             $this->addFlash('danger''Aucun fichier à télécharger pour cette prestation.');
  1326.             return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1327.         }
  1328.     }
  1329.     /**
  1330.      * @Route("/download/getax/files/separated/{userFileId}/{userSurveyId}", name = "download_getax_files_separated")
  1331.      *
  1332.      * @return Response
  1333.      */
  1334.     public function downloadGetaxFilesSeparated(Request $request$userFileId$userSurveyId)
  1335.     {
  1336.         $userFile $this->em->getRepository(UserFile::class)->find($userFileId);
  1337.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1338.         if (!$userSurvey) {
  1339.             throw new NotFoundHttpException();
  1340.         }
  1341.         if (!$userFile) {
  1342.             throw new NotFoundHttpException();
  1343.         }
  1344.         $userFileDocuments $userFile->getValidatedDocuments();
  1345.         if (!$userFileDocuments->isEmpty()) {
  1346.             $files_to_merge = [];
  1347.             $path $this->getParameter('webdir') . '/uploads/files/documents/' $userSurvey->getId() . '/';
  1348.             foreach ($userFileDocuments as $userFileDocument) {
  1349.                 $filename $userFileDocument->getFileName();
  1350.                 if (!file_exists($path $filename)) {
  1351.                     $this->addFlash('danger''Fichier Introuvable : ' $filename);
  1352.                     return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1353.                 }
  1354.                 $path_parts pathinfo($filename);
  1355.                 if ('pdf' !== strtolower($path_parts['extension'])) {
  1356.                     $this->addFlash('danger''Fichier non PDF : ' $filename);
  1357.                     return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1358.                 }
  1359.                 if ($userFileDocument->hasDocumentTagByCode('CODE_DECLA')) {
  1360.                     continue;
  1361.                 }
  1362.                 $files_to_merge[] = $filename;
  1363.             }
  1364.             if (!empty($files_to_merge)) {
  1365.                 $outputName $this->pdfService->clean((!$this->getUser() instanceof User 'undefined User' strtoupper((string)$userSurvey->getUser()->getLastname()) . '-' ucfirst((string)$userSurvey->getUser()->getName())) . '-Getax' date('Y'strtotime('-1 year')));
  1366.                 $zip = new \ZipArchive();
  1367.                 $zipName $this->getParameter('webdir') . '/uploads/files/' $outputName '.zip';
  1368.                 $zip->open($zipName\ZipArchive::CREATE);
  1369.                 foreach ($files_to_merge as $i => $mergedFile) {
  1370.                     $zip->addFile($path $mergedFile$i '.' $mergedFile);
  1371.                 }
  1372.                 $zip->close();
  1373.                 $response = new Response(file_get_contents($zipName));
  1374.                 $response->headers->set('Content-Type''application/zip');
  1375.                 $response->headers->set('Content-Disposition''attachment;filename="' $outputName '.zip"');
  1376.                 $response->headers->set('Content-length'filesize($zipName));
  1377.                 @unlink($zipName);
  1378.                 return $response;
  1379.             } else {
  1380.                 $this->addFlash('danger''Aucun fichier trouvé pour cette prestation.');
  1381.                 return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1382.             }
  1383.         } else {
  1384.             $this->addFlash('danger''Aucun fichier à télécharger pour cette prestation.');
  1385.             return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId'userFileId' => $userFileId]);
  1386.         }
  1387.     }
  1388.     /**
  1389.      * @Route("/ajax/keep/pdf/pages/{userFileDocumentId}/{userSurveyId}", name = "ajax_keep_pdf_pages")
  1390.      *
  1391.      * @return Response
  1392.      */
  1393.     public function ajaxKeepPDFPages(Request $request$userFileDocumentId$userSurveyId)
  1394.     {
  1395.         $hasError false;
  1396.         // trying to get the userfiledocument
  1397.         $userFileDocument $this->em->getRepository(UserFileDocument::class)->find($userFileDocumentId);
  1398.         if (!$userFileDocument) {
  1399.             return new JsonResponse(['result' => false'msg' => 'Mauvais id']);
  1400.         }
  1401.         // fichier
  1402.         $path $this->getParameter('webdir') . '/uploads/files/documents/' $userSurveyId '/';
  1403.         $filename $userFileDocument->getFilename();
  1404.         if (!file_exists($path $filename)) {
  1405.             return new JsonResponse(['result' => false'msg' => 'Fichier non trouvé']);
  1406.         }
  1407.         // getting the page count
  1408.         try {
  1409.             $count $this->pdfService->countPDFPages($path $filename);
  1410.         } catch (\Exception $e) {
  1411.             return new JsonResponse(['result' => false'msg' => $e->getMessage()]);
  1412.         }
  1413.         $pageForm $this->createPdfPageForm(
  1414.             $this->generateUrl('admin_ajax_keep_pdf_pages', ['userFileDocumentId' => $userFileDocumentId'userSurveyId' => $userSurveyId]),
  1415.             $count
  1416.         );
  1417.         // handle form then redirect to base_url
  1418.         $pageForm->handleRequest($request);
  1419.         if ($pageForm->isSubmitted()) {
  1420.             $formData $pageForm->getData();
  1421.             $source $request->get('source_url');
  1422.             if ($pageForm->isValid()) {
  1423.                 // getting form data
  1424.                 $formData $pageForm->getData();
  1425.                 $pages = [];
  1426.                 foreach ($formData as $page => $data) {
  1427.                     if (true === $data) {
  1428.                         $pages[] = (int)str_replace('page'''$page);
  1429.                     }
  1430.                 }
  1431.                 if (!empty($pages)) {
  1432.                     $result $this->pdfService->keepPages($path$filename$pages);
  1433.                     if (true === $result['result']) {
  1434.                         $newUfd = clone $userFileDocument;
  1435.                         $newUfd->setFilename($result['outputFileName']);
  1436.                         $newUfd->setIsSlice(true);
  1437.                         $userFileDocument->setIsArchived(true);
  1438.                         foreach ($userFileDocument->getTags() as $tag) {
  1439.                             $newUfd->addTag($tag);
  1440.                         }
  1441.                         $this->em->persist($userFileDocument);
  1442.                         $this->em->persist($newUfd);
  1443.                         $this->em->flush();
  1444.                         if (str_contains($source$userFileDocument->getId())) {
  1445.                             $source str_replace($userFileDocument->getId(), $newUfd->getId(), $source);
  1446.                         }
  1447.                     } else {
  1448.                         $this->addFlash('danger'"Problème lors de l'appel a ILovePDF : " $result['msg']);
  1449.                     }
  1450.                 }
  1451.             } else {
  1452.                 $this->addFlash('danger'"Le formulaire n'est pas valide : " $pageForm->getErrors());
  1453.             }
  1454.             return $this->redirect($source);
  1455.         }
  1456.         return new JsonResponse($this->renderView(
  1457.             'admin/userFileDocument/modal_delete_pdf_pages.html.twig',
  1458.             [
  1459.                 'form' => $pageForm->createView(),
  1460.                 'hasError' => $hasError,
  1461.                 'pageCount' => $count,
  1462.             ]
  1463.         ));
  1464.     }
  1465.     private function createPdfPageForm($action$count)
  1466.     {
  1467.         // create form
  1468.         $pageForm $this->createFormBuilder(null, [
  1469.             'action' => $action,
  1470.             'attr' => [
  1471.                 'class' => 'form-inline',
  1472.             ],
  1473.         ]);
  1474.         foreach (range(1$count) as $i) {
  1475.             $pageForm->add('page' $iCheckboxType::class, [
  1476.                 'required' => false,
  1477.                 'data' => true,
  1478.                 'attr' => [
  1479.                     'class' => 'form-inline check-this ms-0',
  1480.                 ],
  1481.                 'label_attr' => [
  1482.                     'class' => 'checkbox-inline',
  1483.                 ],
  1484.                 'row_attr' => [
  1485.                     'class' => 'col-4 ps-0',
  1486.                 ],
  1487.             ]);
  1488.         }
  1489.         $pageForm->add('submit'SubmitType::class, [
  1490.             'label' => 'Garder ces pages',
  1491.             'attr' => [
  1492.                 'class' => 'form_submit btn btn-primary mt-4',
  1493.             ],
  1494.         ]);
  1495.         $pageForm $pageForm->getForm();
  1496.         return $pageForm;
  1497.     }
  1498.     /**
  1499.      * @Route("/convertImages/and/rename/files/{userSurveyId}", name = "convert_images_rename_files")
  1500.      *
  1501.      * @return Response
  1502.      */
  1503.     public function convertImageAndRenameFiles(Request $request$userSurveyId)
  1504.     {
  1505.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1506.         if (!$userSurvey) {
  1507.             throw new NotFoundHttpException();
  1508.         }
  1509.         $path $this->getParameter('webdir') . '/uploads/files/documents/' $userSurvey->getId() . '/';
  1510.         $filesToConvert = [];
  1511.         $renamed = [];
  1512.         $error false;
  1513.         $uf $userSurvey->getUserFile();
  1514.         if (!is_null($uf) && is_dir($path)) {
  1515.             foreach ($uf->getNotArchivedDocuments() as $ufd) {
  1516.                 // rename bad named files
  1517.                 if (is_null($ufd->getFilename())) {
  1518.                     continue;
  1519.                 }
  1520.                 $filename $ufd->getFilename();
  1521.                 if (!file_exists($path $filename)) {
  1522.                     $this->addFlash('danger''Fichier Introuvable : ' $filename);
  1523.                     $error true;
  1524.                     return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
  1525.                 }
  1526.                 $basename pathinfo($filenamePATHINFO_FILENAME);
  1527.                 $ext pathinfo($filenamePATHINFO_EXTENSION);
  1528.                 $newFilename $this->pdfService->clean($basename) . '.' $ext;
  1529.                 $ufd->setFilename($newFilename);
  1530.                 $this->em->persist($ufd);
  1531.                 copy($path $filename$path $newFilename);
  1532.                 $renamed[] = $ufd;
  1533.                 if ($this->pdfService->isImage($path$newFilename)) {
  1534.                     $filesToConvert[] = $ufd;
  1535.                 }
  1536.             }
  1537.             // saving new filenames
  1538.             $this->em->flush();
  1539.             // check if renamed files are ok.
  1540.             foreach ($renamed as $re) {
  1541.                 if (!file_exists($path $re->getFileName())) {
  1542.                     $error true;
  1543.                     $this->addFlash('danger''problème lors du renomage : fichier non trouvé !(' $re->getId() . ')');
  1544.                 }
  1545.             }
  1546.             if (!empty($filesToConvert)) {
  1547.                 foreach ($filesToConvert as $ufd) {
  1548.                     $result $this->pdfService->imageToPdf($path$ufd->getFileName());
  1549.                     if (true === $result['result']) {
  1550.                         // save new pdfs
  1551.                         $newUfd = clone $ufd;
  1552.                         $newUfd->setFilename($result['outputFileName']);
  1553.                         $ufd->setIsArchived(true);
  1554.                         foreach ($ufd->getTags() as $tag) {
  1555.                             $newUfd->addTag($tag);
  1556.                         }
  1557.                         $this->em->persist($ufd);
  1558.                         $this->em->persist($newUfd);
  1559.                         $this->em->flush();
  1560.                     } else {
  1561.                         $error true;
  1562.                         $this->addFlash('danger'"Problème lors de l'appel a ILovePDF : " $result['msg']);
  1563.                     }
  1564.                 }
  1565.             }
  1566.         }
  1567.         if (!$error) {
  1568.             $this->addFlash('success''Fichiers Réparés');
  1569.         }
  1570.         return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
  1571.     }
  1572.     /**
  1573.      * @Route("/ajax/createUserSurveyComment/{userSurveyId}", name = "ajax_create_usersurveycomment")
  1574.      */
  1575.     public function ajaxCreateUserSurveyComment(Request $request$userSurveyId)
  1576.     {
  1577.         $hasError false;
  1578.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1579.         if (!$userSurvey) {
  1580.             throw new NotFoundHttpException();
  1581.         }
  1582.         $userSurveyComment = new UserSurveyComment();
  1583.         $userSurveyComment->setUser($this->getUser());
  1584.         $userSurveyComment->setUserSurvey($userSurvey);
  1585.         $userSurveyCommentForm $this->createForm(
  1586.             UserSurveyCommentType::class,
  1587.             $userSurveyComment,
  1588.             [
  1589.                 'action' => $this->generateUrl('admin_ajax_create_usersurveycomment', ['userSurveyId' => $userSurveyId]),
  1590.             ]
  1591.         );
  1592.         $userSurveyCommentForm->handleRequest($request);
  1593.         if ($userSurveyCommentForm->isSubmitted()) {
  1594.             if ($userSurveyCommentForm->isValid()) {
  1595.                 $userSurveyComment $userSurveyCommentForm->getData();
  1596.                 $this->em->persist($userSurveyComment);
  1597.                 $this->em->flush();
  1598.                 $this->addFlash('success''Commentaire ajouté');
  1599.             } else {
  1600.                 $hasError true;
  1601.                 $this->addFlash('danger'"le commentaire n'as pas été ajouté");
  1602.             }
  1603.             $source $request->get('source_url');
  1604.             return $this->redirect($source);
  1605.         }
  1606.         return new JsonResponse($this->renderView('admin/modals/modal_create_edit_comment.html.twig', [
  1607.             'userSurveyCommentForm' => $userSurveyCommentForm->createView(),
  1608.             'hasError' => $hasError,
  1609.         ]));
  1610.     }
  1611.     /**
  1612.      * @Route("/ajax/editUserSurveyComment/{userSurveyCommentId}", name = "ajax_edit_usersurveycomment")
  1613.      */
  1614.     public function ajaxEditUserSurveyComment(Request $request$userSurveyCommentId)
  1615.     {
  1616.         $hasError false;
  1617.         $userSurveyComment $this->em->getRepository(UserSurveyComment::class)->find($userSurveyCommentId);
  1618.         if (!$userSurveyComment) {
  1619.             throw new NotFoundHttpException();
  1620.         }
  1621.         $userSurveyCommentForm $this->createForm(
  1622.             UserSurveyCommentType::class,
  1623.             $userSurveyComment,
  1624.             [
  1625.                 'action' => $this->generateUrl('admin_ajax_edit_usersurveycomment', ['userSurveyCommentId' => $userSurveyCommentId]),
  1626.             ]
  1627.         );
  1628.         $userSurveyCommentForm->handleRequest($request);
  1629.         if ($userSurveyCommentForm->isSubmitted()) {
  1630.             if ($userSurveyCommentForm->isValid()) {
  1631.                 $userSurveyComment $userSurveyCommentForm->getData();
  1632.                 $userSurveyComment->setDateUpdate(new DateTime());
  1633.                 $this->em->persist($userSurveyComment);
  1634.                 $this->em->flush();
  1635.                 $this->addFlash('success''Commentaire modifié');
  1636.             } else {
  1637.                 $hasError true;
  1638.                 $this->addFlash('danger'"le commentaire n'as pas été modifié");
  1639.             }
  1640.             $source $request->get('source_url');
  1641.             return $this->redirect($source);
  1642.         }
  1643.         return new JsonResponse($this->renderView('admin/modals/modal_create_edit_comment.html.twig', [
  1644.             'userSurveyCommentForm' => $userSurveyCommentForm->createView(),
  1645.             'hasError' => $hasError,
  1646.         ]));
  1647.     }
  1648.     /**
  1649.      * @Route("/ajax/deleteUserSurveyComment/{userSurveyCommentId}", name = "ajax_delete_usersurveycomment")
  1650.      *
  1651.      * @param Request $request
  1652.      *
  1653.      * @return JsonResponse
  1654.      */
  1655.     public function ajaxDeleteUserSurveyComment($userSurveyCommentId)
  1656.     {
  1657.         $userSurveyComment $this->em->getRepository(UserSurveyComment::class)->find($userSurveyCommentId);
  1658.         $userSurveyComment->setIsArchived(true);
  1659.         $this->em->persist($userSurveyComment);
  1660.         $this->em->flush();
  1661.         $this->addFlash('success''Commentaire supprimé');
  1662.         return new JsonResponse(true);
  1663.     }
  1664.     /**
  1665.      * @Route("/ajax/replyUserSurveyComment/{replyToId}", name = "ajax_reply_usersurveycomment")
  1666.      */
  1667.     public function ajaxReplyUserSurveyComment(Request $request$replyToId)
  1668.     {
  1669.         $hasError false;
  1670.         $originalComment $this->em->getRepository(UserSurveyComment::class)->find($replyToId);
  1671.         if (!$originalComment) {
  1672.             throw new NotFoundHttpException();
  1673.         }
  1674.         $userSurveyComment = new UserSurveyComment();
  1675.         $userSurveyComment->setUser($this->getUser());
  1676.         $userSurveyComment->setUserSurvey($originalComment->getUserSurvey());
  1677.         $userSurveyComment->setReplyTo($originalComment);
  1678.         $userSurveyCommentForm $this->createForm(
  1679.             UserSurveyCommentType::class,
  1680.             $userSurveyComment,
  1681.             [
  1682.                 'action' => $this->generateUrl('admin_ajax_reply_usersurveycomment', ['replyToId' => $replyToId]),
  1683.             ]
  1684.         );
  1685.         $userSurveyCommentForm->handleRequest($request);
  1686.         if ($userSurveyCommentForm->isSubmitted()) {
  1687.             if ($userSurveyCommentForm->isValid()) {
  1688.                 $userSurveyComment $userSurveyCommentForm->getData();
  1689.                 $this->em->persist($userSurveyComment);
  1690.                 $this->em->flush();
  1691.                 $this->addFlash('success''Commentaire ajouté');
  1692.             } else {
  1693.                 $hasError true;
  1694.                 $this->addFlash('danger'"le commentaire n'as pas été enregistré");
  1695.             }
  1696.             $source $request->get('source_url');
  1697.             return $this->redirect($source);
  1698.         }
  1699.         return new JsonResponse($this->renderView('admin/modals/modal_create_edit_comment.html.twig', [
  1700.             'userSurveyCommentForm' => $userSurveyCommentForm->createView(),
  1701.             'hasError' => $hasError,
  1702.         ]));
  1703.     }
  1704.     /**
  1705.      * @Route("/ajax/datelimit/{userSurveyId}",name = "ajax_date_limit")
  1706.      */
  1707.     public function ajaxUserSurveyDateLimit(Request $request$userSurveyId)
  1708.     {
  1709.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1710.         if (!$userSurvey) {
  1711.             throw new NotFoundHttpException();
  1712.         }
  1713.         $oldDateLimit $userSurvey->getDateLimit();
  1714.         $form $this->createForm(UserSurveyDateLimitType::class, $userSurvey, [
  1715.             'action' => $this->generateUrl('admin_ajax_date_limit', [
  1716.                 'userSurveyId' => $userSurveyId,
  1717.             ]),
  1718.         ]);
  1719.         $form->handleRequest($request);
  1720.         if ($form->isSubmitted()) {
  1721.             if ($form->isValid()) {
  1722.                 $userSurvey $form->getData();
  1723.                 $sendMail $form->get('sendMail')->getData();
  1724.                 $this->em->persist($userSurvey);
  1725.                 $this->em->flush();
  1726.                 $this->addFlash('success''informations sauvegardées');
  1727.                 if ($sendMail && $oldDateLimit != $userSurvey->getDateLimit()) {
  1728.                     $this->emailService->sendDateLimitUpdate($userSurvey);
  1729.                 }
  1730.             }
  1731.             return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
  1732.         }
  1733.         return new JsonResponse($this->renderView('admin/modals/userSurveyDateLimitModal.html.twig', [
  1734.             'form' => $form->createView(),
  1735.         ]));
  1736.     }
  1737.     /**
  1738.      * @Route("/paid/on/bexio/{userSurveyId}",name = "paid_on_bexio")
  1739.      */
  1740.     public function paidOnBexio($userSurveyId)
  1741.     {
  1742.         // Petit bouton pour patrice.
  1743.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1744.         if (!$userSurvey) {
  1745.             throw new NotFoundHttpException();
  1746.         }
  1747.         $userSurvey->setPaymentStatus('payedout');
  1748.         $this->em->persist($userSurvey);
  1749.         $this->em->flush();
  1750.         return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
  1751.     }
  1752.     /**
  1753.      * @Route("/save/pdf/renovation/{userFilePropertyId}/{userSurveyId}",name = "generate_pdf_renovation")
  1754.      */
  1755.     public function generateRenovationPdf($userFilePropertyId$userSurveyId)
  1756.     {
  1757.         $userFileProperty $this->em->getRepository(UserFileProperty::class)->find($userFilePropertyId);
  1758.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1759.         if (!$userFileProperty || !$userSurvey) {
  1760.             throw new NotFoundHttpException();
  1761.         }
  1762.         $userFile $userFileProperty->getUserFile();
  1763.         if (!$userFileProperty->getRenovations()->isEmpty()) {
  1764.             $url $this->generateUrl('print_renovation_table', ['userFilePropertyId' => $userFilePropertyId'surveyId' => $userSurvey->getSurvey()->getId()], UrlGeneratorInterface::ABSOLUTE_URL);
  1765.             $path $this->getParameter('webdir') . '/uploads/files/documents/' $userSurvey->getId() . '/';
  1766.             $outputFileName $userFileProperty->getFullAddress() . ' Rénovations';
  1767.             $result $this->pdfService->generateRenovationTablePdf($path$url$outputFileName);
  1768.             if ($result['result']) {
  1769.                 $pdf $result['outputFileName'];
  1770.                 $doc $this->em->getRepository(Document::class)->findOneBy(['code' => 'TABL_TRAV']);
  1771.                 $documentTag $userFile->getTag($doc);
  1772.                 $propertyTag $userFileProperty->getEntityTypeTag();
  1773.                 if (is_null($documentTag)) {
  1774.                     $documentTag = new DocumentTypeTag();
  1775.                     $documentTag->setUserFile($userFile);
  1776.                     $documentTag->setDocument($doc);
  1777.                     $this->em->persist($documentTag);
  1778.                 }
  1779.                 if (is_null($propertyTag)) {
  1780.                     $propertyTag = new EntityTypeTag();
  1781.                     $propertyTag->setUserFileProperty($userFileProperty);
  1782.                     $propertyTag->setUserFile($userFile);
  1783.                     $this->em->persist($propertyTag);
  1784.                 }
  1785.                 $userFileDocument = new UserFileDocument($pdf);
  1786.                 $userFileDocument->addTag($documentTag);
  1787.                 $userFileDocument->addTag($propertyTag);
  1788.                 $userFileDocument->setUserFile($userFile);
  1789.                 $this->em->persist($userFileDocument);
  1790.                 $this->em->flush();
  1791.             } else {
  1792.                 $this->addFlash('danger'"Problème lors de l'appel a ILovePDF : " $result['msg']);
  1793.             }
  1794.         } else {
  1795.             $this->addFlash('danger''Pas de rénovations dans la propriété');
  1796.         }
  1797.         return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurvey->getId()]);
  1798.     }
  1799.     /**
  1800.      * @Route("/document/edit/tags/{userSurveyId}/{userFileDocumentId}",name="document_edit_tags")
  1801.      */
  1802.     public function documentEditTags(Request $requestint $userSurveyIdint $userFileDocumentId): Response
  1803.     {
  1804.         $userFileDocument $this->em->getRepository(UserFileDocument::class)->find($userFileDocumentId);
  1805.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1806.         if (!$userSurvey || !$userFileDocument) {
  1807.             throw new NotFoundHttpException();
  1808.         }
  1809.         $userFile $userSurvey->getUserFile();
  1810.         $this->userSurveyService->updateDocumentTags($userFile$userSurvey);
  1811.         $this->userSurveyService->updateUserFileEntityTags($userFile);
  1812.         $this->em->persist($userFile);
  1813.         $this->em->flush();
  1814.         $tagsForm $this->createForm(UserFileDocumentTagsType::class, $userFileDocument, [
  1815.             'action' => $this->generateUrl('admin_document_edit_tags', ['userFileDocumentId' => $userFileDocumentId'userSurveyId' => $userSurveyId]),
  1816.         ]);
  1817.         $tagsForm->handleRequest($request);
  1818.         if ($tagsForm->isSubmitted()) {
  1819.             if ($tagsForm->isValid()) {
  1820.                 $userFileDocument $tagsForm->getData();
  1821.                 // get data from the 'documentTags' field
  1822.                 $documentTypeTags $tagsForm->get('documentTypeTags')->getData();
  1823.                 $entityTypeTags $tagsForm->get('entityTypeTags')->getData();
  1824.                 $userFileDocument->removeTags();
  1825.                 // handle the $documentTags data manually
  1826.                 // for example, find the Tag entities and add them to the UserFileDocument entity
  1827.                 foreach (explode(','$documentTypeTags) as $tagData) {
  1828.                     // assuming $tagData contains the ID of a Tag entity
  1829.                     $tag $this->em->getRepository(Tag::class)->find($tagData);
  1830.                     if ($tag) {
  1831.                         $userFileDocument->addTag($tag);
  1832.                     }
  1833.                 }
  1834.                 foreach (explode(','$entityTypeTags) as $tagData) {
  1835.                     // assuming $tagData contains the ID of a Tag entity
  1836.                     $tag $this->em->getRepository(Tag::class)->find($tagData);
  1837.                     if ($tag) {
  1838.                         $userFileDocument->addTag($tag);
  1839.                     }
  1840.                 }
  1841.                 $this->em->persist($userFileDocument);
  1842.                 $this->em->flush();
  1843.             } else {
  1844.                 $errorStr '';
  1845.                 foreach ($tagsForm->getErrors(true) as $error) {
  1846.                     $errorStr .= $error->getMessage();
  1847.                 }
  1848.                 $this->addFlash('danger'$errorStr);
  1849.             }
  1850.             $source $request->get('source_url');
  1851.             if ($source) {
  1852.                 return $this->redirect($source);
  1853.             } else {
  1854.                 return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
  1855.             }
  1856.         }
  1857.         return new JsonResponse($this->renderView('admin/modals/modalUserFileDocumentTags.html.twig', [
  1858.             'form' => $tagsForm->createView(),
  1859.         ]));
  1860.     }
  1861.     /**
  1862.      * @Route("/test/mail/{userSurveyId}",name = "test_mail")
  1863.      */
  1864.     public function renderMailTest($userSurveyId)
  1865.     {
  1866.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1867.         if (!$userSurvey) {
  1868.             throw new NotFoundHttpException();
  1869.         }
  1870.         $userFile $userSurvey->getUserFile();
  1871.         return $this->render('email/userSurvey/statusChange/CMU/PROCESSING_FILES_POSTED_CMU.html.twig', [
  1872.             'userSurvey' => $userSurvey,
  1873.         ]);
  1874.     }
  1875.     private function array_diff_recursive($array1$array2)
  1876.     {
  1877.         $difference = [];
  1878.         foreach ($array1 as $key => $value) {
  1879.             if (is_array($value)) {
  1880.                 if (!isset($array2[$key]) || !is_array($array2[$key])) {
  1881.                     $difference[$key] = $value;
  1882.                 } else {
  1883.                     $new_diff $this->array_diff_recursive($value$array2[$key]);
  1884.                     if (!empty($new_diff)) {
  1885.                         $difference[$key] = $new_diff;
  1886.                     }
  1887.                 }
  1888.             } elseif (!array_key_exists($key$array2) || $array2[$key] !== $value) {
  1889.                 $difference[$key] = $value;
  1890.             }
  1891.         }
  1892.         return $difference;
  1893.     }
  1894.     /**
  1895.      * @Route("/ajax/cmu/invalidCredential/{userSurveyId}", name = "ajax_cmu_invalid_credential")
  1896.      *
  1897.      * @param $userSurveyId
  1898.      */
  1899.     public function ajaxCmuInvalidCredential(Request $request$userSurveyId): RedirectResponse|JsonResponse
  1900.     {
  1901.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  1902.         if (!$userSurvey) {
  1903.             throw new NotFoundHttpException();
  1904.         }
  1905.         $owner null;
  1906.         if ($userSurvey->getUserFile()) {
  1907.             $owner $userSurvey->getUserFile()->getOwner();
  1908.         }
  1909.         if (!$owner) {
  1910.             throw new NotFoundHttpException();
  1911.         }
  1912.         $invalidCredentialForm $this->createForm(
  1913.             UserFilePersonInvalidCredentialType::class,
  1914.             $owner,
  1915.             [
  1916.                 'action' => $this->generateUrl('admin_ajax_cmu_invalid_credential', ['userSurveyId' => $userSurveyId]),
  1917.             ]
  1918.         );
  1919.         $invalidCredentialForm->handleRequest($request);
  1920.         if ($invalidCredentialForm->isSubmitted()) {
  1921.             if ($invalidCredentialForm->isValid()) {
  1922.                 $sendMail $invalidCredentialForm->get('sendMail')->getData();
  1923.                 $owner $invalidCredentialForm->getData();
  1924.                 $this->em->persist($owner);
  1925.                 $this->em->flush();
  1926.                 if (false === $owner->isHasValidFinanceCredentials()) {
  1927.                     $login $owner->getAnswerObject('fisc_num');
  1928.                     $password $owner->getAnswerObject('fisc_password');
  1929.                     if (!is_null($login)) {
  1930.                         $owner->removeUserFileAnswer($login);
  1931.                         $this->em->remove($login);
  1932.                     }
  1933.                     if (!is_null($password)) {
  1934.                         $owner->removeUserFileAnswer($password);
  1935.                         $this->em->remove($password);
  1936.                     }
  1937.                     $this->em->flush();
  1938.                 }
  1939.                 if (false === $owner->isHasValidUrssafCredentials()) {
  1940.                     $login $owner->getAnswerObject('login_urssaf');
  1941.                     $password $owner->getAnswerObject('pasword_urssaf');
  1942.                     if (!is_null($login)) {
  1943.                         $owner->removeUserFileAnswer($login);
  1944.                         $this->em->remove($login);
  1945.                     }
  1946.                     if (!is_null($password)) {
  1947.                         $owner->removeUserFileAnswer($password);
  1948.                         $this->em->remove($password);
  1949.                     }
  1950.                     $this->em->flush();
  1951.                 }
  1952.                 if (false === $owner->isHasValidPartnerUrssafCredentials()) {
  1953.                     $login $owner->getAnswerObject('login_ursaf_conjoint');
  1954.                     $password $owner->getAnswerObject('password_urssaf_conjoint');
  1955.                     if (!is_null($login)) {
  1956.                         $owner->removeUserFileAnswer($login);
  1957.                         $this->em->remove($login);
  1958.                     }
  1959.                     if (!is_null($password)) {
  1960.                         $owner->removeUserFileAnswer($password);
  1961.                         $this->em->remove($password);
  1962.                     }
  1963.                     $this->em->flush();
  1964.                 }
  1965.                 if (false === $owner->isHasValidFinanceCredentials() ||
  1966.                     false === $owner->isHasValidUrssafCredentials() ||
  1967.                     false === $owner->isHasValidPartnerUrssafCredentials()
  1968.                 ) {
  1969.                     $status $this->em->getRepository(UserSurveyStatus::class)->findOneBy(['code' => 'PROCESSING_FILES_MISSING']);
  1970.                     $userSurvey->setUserSurveyStatus($status);
  1971.                     $this->em->persist($userSurvey);
  1972.                     $this->em->flush();
  1973.                 }
  1974.                 if ($sendMail) {
  1975.                     $this->emailService->sendUserSurveyStatusChange($userSurvey);
  1976.                 }
  1977.                 $this->addFlash('success''Identifiants invalide sauvegardés');
  1978.             } else {
  1979.                 $this->addFlash('danger''Identifiants invalide non sauvegardés');
  1980.             }
  1981.             $source $request->get('source_url');
  1982.             return $this->redirect($source);
  1983.         }
  1984.         return new JsonResponse($this->renderView('admin/modals/modal_create_edit_comment.html.twig', [
  1985.             'userSurveyCommentForm' => $invalidCredentialForm->createView(),
  1986.         ]));
  1987.     }
  1988.     /**
  1989.      * @Route("/badPayer/change/{userId}", name = "bad_payer_change")
  1990.      */
  1991.     public function badPayerChange($userId)
  1992.     {
  1993.         $user $this->em->getRepository(User::class)->find($userId);
  1994.         if (!$user) {
  1995.             throw new NotFoundHttpException();
  1996.         }
  1997.         if ($user->isBadPayer() === true) {
  1998.             $user->setBadPayer(false);
  1999.         } else {
  2000.             $user->setBadPayer(true);
  2001.         }
  2002.         $this->em->persist($user);
  2003.         $this->em->flush();
  2004.         return $this->redirectToRoute('admin_customer_summary_index', ['userId' => $userId]);
  2005.     }
  2006.     /**
  2007.      * @Route("/generate/rs/pdf/{userSurveyId}/{test}", name = "generate_rs_pdf")
  2008.      */
  2009.     public function generateRsPDF($userSurveyId$test)
  2010.     {
  2011.         if ($test == 1) {
  2012.             $test true;
  2013.         } else {
  2014.             $test false;
  2015.         }
  2016.         $userSurvey $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
  2017.         $pdfContent $this->rsPdfService->generatePdf($userSurvey$test);
  2018.         if (!$pdfContent) {
  2019.             return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
  2020.         }
  2021.         return new Response($pdfContent200, [
  2022.             'Content-Type' => 'application/pdf',
  2023.             'Content-Disposition' => 'inline; filename="impression_RS.pdf"'
  2024.         ]);
  2025.     }
  2026. }