src/Controller/CongeController.php line 195

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use JMS\Serializer\SerializationContext;
  4. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\Routing\Annotation\Route;
  9. use App\Entity\Conge;
  10. use App\Entity\CongeDroitAnnuel;
  11. use App\Entity\ParametrageTexte;
  12. use App\Entity\RefRole;
  13. use App\Entity\Utilisateur;
  14. use App\Entity\UtilisateurInformation;
  15. use App\Entity\Workflow;
  16. use App\Form\CongeType;
  17. use App\Entity\RefGabarit;
  18. use App\Entity\RefAffectation;
  19. use Doctrine\Persistence\ManagerRegistry;
  20. use Symfony\Component\Mailer\MailerInterface;
  21. use App\Services\GeneratePdf;
  22. use App\Services\AccessRule;
  23. use JMS\Serializer\SerializerInterface;
  24. use Symfony\Component\Mime\Email;
  25. use App\Services\Lib\EmailSHDecision;
  26. use App\Entity\CongeType as CongeTypes;
  27. use App\Entity\DemandeReport;
  28. use Twig\Environment;
  29. use App\Entity\RefAffectationCalendrier;
  30. use Symfony\Component\Mime\Part\DataPart;
  31. /**
  32.  * Class CongeController
  33.  * @package App\Controller
  34.  */
  35. class CongeController extends AbstractController
  36. {
  37.     final public const ERROR_VALIDATION_FORM 'Erreur lors de la validation du formulaire';
  38.     final public const ERROR_OCCURED 'Une erreur est survenue';
  39.     final public const ERROR_FILE 'Fichier introuvable';
  40.     private $doctrine;
  41.     private $mailer;
  42.     private $generatePdf;
  43.     private $accessRule;
  44.     private $serializer;
  45.     private $twig;
  46.     private  $emailSHDecision;
  47.     public function __construct(ManagerRegistry $doctrineMailerInterface $mailerGeneratePdf $generatePdfEnvironment $twigAccessRule $accessRuleSerializerInterface $serializerEmailSHDecision $emailSHDecision)
  48.     {
  49.         $this->doctrine $doctrine;
  50.         $this->mailer $mailer;
  51.         $this->generatePdf $generatePdf;
  52.         $this->accessRule $accessRule;
  53.         $this->serializer $serializer;
  54.         $this->emailSHDecision $emailSHDecision;
  55.         $this->twig $twig;
  56.     }
  57.     #[Route(path'/api/conges/{id}'name'ctsweb_get_conge'methods: ['GET'], requirements: ['id' => '\d+'])]
  58.     public function detail(Conge $conge): JsonResponse
  59.     {
  60.         $jsonv = [];
  61.         $repositoryUI $this->doctrine->getManager()->getRepository(UtilisateurInformation::class);
  62.         $uid $conge->getUtilisateur()->getIdUtilisateur();
  63.         $utilisateurData $repositoryUI->findDataForPageProfil($uid);
  64.         $accessRuleService $this->getServiceAccessRule();
  65.         if (!$accessRuleService->hasRightTodetailAccess($conge)) {
  66.             return new JsonResponse(''JsonResponse::HTTP_FORBIDDEN);
  67.         }
  68.         // Obtenir les données sérialisées de "$conge" et les décoder en tableau associatif
  69.         $congeSerialized $this->serialize($conge);
  70.         $congeSerializedArray json_decode($congeSerializedtrue);
  71.         // Appeler les méthodes de l'entité "Conge" sur l'objet "$conge"
  72.         $uData $this->serialize($utilisateurData);
  73.         $jsonv['items']['conge'] = $congeSerializedArray;
  74.         if (isset($jsonv['items']['conge']['items']['pieceMotif'])) {
  75.             $jsonv['items']['conge']['items']['pieceMotif'] = (isset($jsonv['items']['conge']['items']['pieceMotif']) && !empty($jsonv['items']['conge']['items']['pieceMotif'])) ? json_decode((string) $jsonv['items']['conge']['items']['pieceMotif'], true512JSON_THROW_ON_ERROR) : [];
  76.         }
  77.         $jsonv['items']['user'] = json_decode((string) $uDatatrue512JSON_THROW_ON_ERROR);
  78.         $json_merge json_encode($jsonv);
  79.         return new JsonResponse($json_mergeJsonResponse::HTTP_OK, [], true);
  80.     }
  81.     #[Route(path'/api/conges/state/{state}'name'ctsweb_list_conge'methods: ['GET'])]
  82.     public function list(string $state): JsonResponse
  83.     {
  84.         $validStates array_keys(Workflow::STATES);
  85.         if (!in_array($state$validStates)) {
  86.             return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
  87.         }
  88.         $entityManager $this->doctrine->getManager();
  89.         $today = new \DateTime();
  90.         if (in_array($state, ['accepted''rejected'])) {
  91.             $conges $entityManager
  92.                 ->getRepository(Conge::class)
  93.                 ->findAllUntillCurrentDate($this->getUser()->getUtilisateur());
  94.             $report $entityManager
  95.                 ->getRepository(DemandeReport::class)
  96.                 ->findAllUntillCurrentDate($this->getUser()->getUtilisateur());
  97.         } else {
  98.             $conges $entityManager
  99.                 ->getRepository(Conge::class)
  100.                 ->findAllUntillCurrentWaiting($this->getUser()->getUtilisateur());
  101.             $report $entityManager
  102.                 ->getRepository(DemandeReport::class)
  103.                 ->findAllUntillCurrentWaiting($this->getUser()->getUtilisateur());
  104.         }
  105.         $dataconges array_map(function ($conge) use ($today) {
  106.             $congeArray json_decode((string) $this->serializeto($conge), true512JSON_THROW_ON_ERROR);
  107.             $congeArray[0]['dateDebut'] = date_format(date_create($congeArray[0]['dateDebut']), 'Y-m-d');
  108.             $congeArray[0]['dateFin'] = date_format(date_create($congeArray[0]['dateFin']), 'Y-m-d');
  109.             $congeArray[0]['choixConge'] = 1;
  110.             if ($conge->getDateFin() < $today) {
  111.                 $congeArray[0]['isTooLate'] = true;
  112.             }
  113.             return $congeArray[0];
  114.         }, $conges);
  115.         $newReport $this->createNewReport();
  116.         $datareport array_map(function ($report) use ($newReport) {
  117.             $reportArray json_decode((string) $this->serializeto($report), true512JSON_THROW_ON_ERROR);
  118.             return array_merge($reportArray[0], $newReport);
  119.         }, $report);
  120.         $mergedData array_merge($dataconges$datareport);
  121.         return new JsonResponse(
  122.             $this->serialize($mergedData),
  123.             JsonResponse::HTTP_OK,
  124.             [],
  125.             true
  126.         );
  127.     }
  128.     /**
  129.      * @return JsonResponse
  130.      */
  131.     #[Route(path'/api/conges/archive/{utilisateur}'name'ctsweb_conges-archive'methods: ['GET'], requirements: ['utilisateur' => '\d+'])]
  132.     public function findMyArchive(Utilisateur $utilisateur)
  133.     {
  134.         $entityManager $this->doctrine->getManager();
  135.         $arhives $entityManager
  136.             ->getRepository(Conge::class)
  137.             ->findBy(
  138.                 [
  139.                     'workflow' => [Workflow::CO_SIGNWorkflow::CO_REJECTWorkflow::CO_ANNULE],
  140.                     'utilisateur' => $utilisateur
  141.                 ],
  142.                 ['dateDebut' => 'DESC']
  143.             );
  144.         $arhivesreport $entityManager
  145.             ->getRepository(DemandeReport::class)
  146.             ->findBy([
  147.                 'workflow' => [Workflow::RE_SIGNWorkflow::RE_REJECTWorkflow::RE_ANNULE],
  148.                 'utilisateur' => $utilisateur
  149.             ]);
  150.         $newReport $this->createNewReport();
  151.         $datareport array_map(function ($arhivesreport) use ($newReport) {
  152.             $reportArray json_decode((string) $this->serializeto($arhivesreport), true512JSON_THROW_ON_ERROR);
  153.             return array_merge($reportArray[0], $newReport);
  154.         }, $arhivesreport);
  155.         $mergedData array_merge($arhives,  $datareport);
  156.         return new JsonResponse(
  157.             $this->serialize($mergedData),
  158.             JsonResponse::HTTP_OK,
  159.             [],
  160.             true
  161.         );
  162.     }
  163.     /**
  164.      * @return JsonResponse
  165.      */
  166.     #[Route(path'/api/conges/management/state/{state}'name'ctsweb_list_for_management_conge'methods: ['GET'])]
  167.     public function managementList(string $state)
  168.     {
  169.         $repositoryUI $this->doctrine->getManager()->getRepository(UtilisateurInformation::class);
  170.         $uid $this->getUser()->getIdUtilisateur();
  171.         $utilisateurData $repositoryUI->findDataForPageProfil($uid);
  172.         $role $this->getUser()->getUtilisateur()->getIdRole();
  173.         if (!in_array($roleUtilisateur::MANAGE)) {
  174.             return new JsonResponse([], JsonResponse::HTTP_FORBIDDEN);
  175.         }
  176.         $states = ['current''waiting'];
  177.         if (!in_array($state$states)) {
  178.             return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
  179.         }
  180.         $entityManager $this->doctrine->getManager();
  181.         $affectation $this->getUser()->getIdAffectation();
  182.         $federation $this->getUser()->getIdFederation();
  183.         if ('waiting' == $state) {
  184.             $workflow Workflow::CO_WAITING;
  185.             $workflowR Workflow::RE_WAITING;
  186.             //federation on
  187.             if (RefRole::ROLE_FEDE === $role || RefRole::ROLE_FEDE_INVITE === $role) {
  188.                 $affectation null;
  189.             } else if (RefRole::ROLE_DR === $role || RefRole::ROLE_DR_SIGNATAIRE === $role || RefRole::ROLE_GCR === $role) {
  190.                 $federation null;
  191.             } else {
  192.                 $federation null;
  193.                 $affectation null;
  194.             }
  195.         } else {
  196.             $workflow Workflow::CO_ACCEPTED;
  197.             $workflowR Workflow::RE_SIGN;
  198.             if (RefRole::ROLE_FEDE === $role || RefRole::ROLE_FEDE_INVITE === $role) {
  199.                 $affectation null;
  200.             } else if (RefRole::ROLE_DR === $role || RefRole::ROLE_DR_SIGNATAIRE === $role || RefRole::ROLE_GCR === $role) {
  201.                 $federation null;
  202.             } else {
  203.                 $affectation null;
  204.                 $federation null;
  205.             }
  206.         }
  207.         if (RefRole::ROLE_DS_ADMIN === $role) {
  208.             $conges $entityManager
  209.                 ->getRepository(Conge::class)
  210.                 ->findByWorkflowAndUserTypeAdmin($workflow$federation$affectation);
  211.             $report $entityManager
  212.                 ->getRepository(DemandeReport::class)
  213.                 ->findByWorkflowAndUserTypeAdmin($workflowR$federation$affectation);
  214.         } else {
  215.             $conges $entityManager
  216.                 ->getRepository(Conge::class)
  217.                 ->findByWorkflowAndUserType($workflow$federation$affectation);
  218.             $report $entityManager
  219.                 ->getRepository(DemandeReport::class)
  220.                 ->findByWorkflowAndUserType($workflowR$federation$affectation);
  221.         }
  222.         if (
  223.             (Workflow::CO_ACCEPTED === $workflow || Workflow::CO_SIGN === $workflow)
  224.             && (in_array($roleUtilisateur::MANAGER))
  225.         ) {
  226.             $today = (new \DateTime())->format("Y-m-d");
  227.             /** @var Conge $conge */
  228.             foreach ($conges as $conge) {
  229.                 $isTooLate true;
  230.                 $end = clone $conge['dateFin'];
  231.                 if (RefRole::ROLE_DS_ADMIN === $role && $end->modify('+3 month')->format("Y-m-d") > $today) {
  232.                     $isTooLate false;
  233.                 } elseif ($end->format("Y-m-d") > $today) {
  234.                     $isTooLate false;
  235.                 }
  236.                 $conge['isTooLate'] = $isTooLate;
  237.             }
  238.         }
  239.         $dataconges = [];
  240.         foreach ($conges as $conge) {
  241.             $cong = array();
  242.             if (isset($conge)) {
  243.                 $cong json_decode((string) $this->serializeto($conge), true512JSON_THROW_ON_ERROR);
  244.                 if (isset($cong) && (is_countable($cong) ? count($cong) : 0) > 0) {
  245.                     $cong[0]['dateDebut'] = date_format(date_create($cong[0]['dateDebut']), 'Y-m-d');
  246.                     $cong[0]['dateFin'] = date_format(date_create($cong[0]['dateFin']), 'Y-m-d');
  247.                     $dataconges[] = $cong[0];
  248.                 }
  249.             }
  250.         }
  251.         $datareport = [];
  252.         /** @var DemandeReport $report */
  253.         foreach ($report as $reports) {
  254.             if (isset($reports)) {
  255.                 $rep json_decode((string) $this->serializeto($reports), true512JSON_THROW_ON_ERROR);
  256.                 if (isset($rep) && (is_countable($rep) ? count($rep) : 0) > 0) {
  257.                     // $datareport[] = $rep[0];
  258.                     $newReport $this->createNewReportDtnSH();
  259.                 }
  260.                 $datareport[] = array_merge($rep[0], $newReport);
  261.             }
  262.         };
  263.         // Fusionner les tableaux $dataconges et $report
  264.         $mergedData array_merge($dataconges,  $datareport);
  265.         return new JsonResponse(
  266.             $this->serialize($mergedData),
  267.             JsonResponse::HTTP_OK,
  268.             [],
  269.             true
  270.         );
  271.     }
  272.     /**
  273.      * @return JsonResponse
  274.      */
  275.     #[Route(path'/api/conges'name'ctsweb_create_conge'methods: ['POST'])]
  276.     public function create(Request $request)
  277.     {
  278.         $utilisateurInformation $this->getUser();
  279.         $utilisateur $utilisateurInformation->getUtilisateur();
  280.         $idRole $utilisateur->getIdRole();
  281.         $accessRuleService $this->getServiceAccessRule();
  282.         if (!$accessRuleService->hasRightForTakingDayOff()) {
  283.             return new JsonResponse(''JsonResponse::HTTP_FORBIDDEN);
  284.         }
  285.         $conge = new Conge();
  286.         $form $this->handleRequest($request$conge'all''post');
  287.         $em $this->doctrine->getManager();
  288.         $repository $em->getRepository(Conge::class);
  289.         $reporeport $em->getRepository(DemandeReport::class);
  290.         try {
  291.             if ($form->isSubmitted() && $form->isValid()) {
  292.                 $entityManager $this->doctrine->getManager();
  293.                 // $demande_enCours = $reporeport->countCurrentWaiting($year, $this->getUser());
  294.                 // if (!$demande_enCours) {
  295.                 //     // $retour['conge'] = false;
  296.                 //     $retour['demande_report'] = false;
  297.                 //     return $retour;
  298.                 // }
  299.                 // $today = (new \DateTime());
  300.                 // $year = $today->format("Y");
  301.                 // var_dump( $conge->getDateFin());
  302.                 // var_dump(  new \DateTime("$year-09-01"));
  303.                 // die();
  304.                 if ($conge->getCongeType()->getCode() == CongeTypes::CAN || $conge->getCongeType()->getCode() == CongeTypes::RTT) {
  305.                     $id_affectation $utilisateurInformation->getIdAffectation()->getIdAffectation();
  306.                     $requiredCheval $this->getChevalConge($conge$id_affectation);
  307.                     if (!$requiredCheval) {
  308.                         $result = [
  309.                             'success' => false,
  310.                             'error' => sprintf('Votre période de congés est à cheval sur deux années, veuillez déposer une demande par année de gestion')
  311.                         ];
  312.                         return new JsonResponse($resultJsonResponse::HTTP_BAD_REQUEST);
  313.                     }
  314.                 }
  315.                 if ($conge->getCongeType()->getCode() == CongeTypes::CEX) {
  316.                     $requiredFields $this->getRequiredMotifOrPieceJointeForCexConge($conge);
  317.                     if (!empty($requiredFields)) {
  318.                         $result = [
  319.                             'success' => false,
  320.                             'error' => sprintf(' %s  pour un congé de type CE'$requiredFields)
  321.                         ];
  322.                         return new JsonResponse($resultJsonResponse::HTTP_BAD_REQUEST);
  323.                     }
  324.                 }
  325.                 //verifier le soldes des comptes pour le Cet et RAA
  326.                 if ($conge->getCongeType()->getCode() == CongeTypes::CET || $conge->getCongeType()->getCode() == CongeTypes::RAA) {
  327.                     if (!$this->verifier_solde_comptes($conge)) {
  328.                         $result = [
  329.                             'success' => false,
  330.                             'error' => sprintf('Le nombre de jours ouvrés demandé doit être égale ou inférieur au solde de votre %s.'$conge->getCongeType()->getLibelle())
  331.                         ];
  332.                         return new JsonResponse($resultJsonResponse::HTTP_BAD_REQUEST);
  333.                     }
  334.                 }
  335.                 if ($conge->getCongeType()->getCode() == CongeTypes::RAA) {
  336.                     $id_affectation $utilisateurInformation->getIdAffectation()->getIdAffectation();
  337.                     if (!$repository->checkDemandeReportAA($conge$id_affectation)) {
  338.                         $result = [
  339.                             'success' => false,
  340.                             'error' => sprintf('la date de début et la date de fin de congés de  %s doivent être incluses dans la période de débit du report année antérieure fixée par le SH'$conge->getCongeType()->getLibelle())
  341.                         ];
  342.                         return new JsonResponse($resultJsonResponse::HTTP_BAD_REQUEST);
  343.                     }
  344.                 }
  345.                 if (!$repository->check_chevauchement($conge$this->getUser()->getIdUtilisateur())) {
  346.                     $result = [
  347.                         'success' => false,
  348.                         'error' => 'Il y a déjà un congé déposé sur cette période'
  349.                     ];
  350.                     return new JsonResponse($resultJsonResponse::HTTP_BAD_REQUEST);
  351.                 }
  352.                 if (Conge::DTN === $request->request->get('from')) {
  353.                     $conge->setAvisDtn(true);
  354.                 }
  355.                 // $IdUtilisateur = $em->getRepository(Utilisateur::class)->findOneBy(['idUtilisateur' => $this->getUser()->getIdUtilisateur()]);
  356.                 // $conge->setUtilisateur($IdUtilisateur);
  357.                 $entityManager->persist($conge);
  358.                 $entityManager->flush();
  359.                 if ($idRole == RefRole::ROLE_CTS || $idRole == RefRole::ROLE_FEDE || $idRole == RefRole::ROLE_FEDE_INVITE) {
  360.                     $this->sendMailNotification();
  361.                 }
  362.                 return new JsonResponse(
  363.                     [
  364.                         'success' => true,
  365.                         'Conge' => $conge->getId()
  366.                     ],
  367.                     JsonResponse::HTTP_CREATED
  368.                 );
  369.             } else {
  370.                 $result = [
  371.                     'success' => false,
  372.                     'data' => self::ERROR_VALIDATION_FORM,
  373.                     'error' => (string) $form->getErrors(truefalse)
  374.                 ];
  375.             }
  376.         } catch (\Exception $e) {
  377.             echo $e->getMessage();
  378.             $result = [
  379.                 'success' => false,
  380.                 'data' => self::ERROR_OCCURED
  381.             ];
  382.         }
  383.         return new JsonResponse($resultJsonResponse::HTTP_BAD_REQUEST);
  384.     }
  385.     private function sendMailNotification()
  386.     {
  387.         $em $this->doctrine->getManager();
  388.         $gabRep $em->getRepository(RefGabarit::class);
  389.         $ui $this->getUser();
  390.         $uid $this->getUser()->getUtilisateur()->getIdUtilisateur();
  391.         $uimail $em->getRepository(Utilisateur::class)->findBy(['idUtilisateur' => $uid])[0]->getCourriel();
  392.         $role $this->getUser()->getUtilisateur()->getIdRole();
  393.         $subject sprintf('CTS-WEB : Congés à valider - %s %s'$ui->getNom(), $ui->getPrenom());
  394.         $emailMailer $this->getParameter('mailer_user');
  395.         $expediteurMail =  (filter_var($emailMailerFILTER_VALIDATE_EMAIL)) ? $emailMailer 'donotreply@sports.gouv.fr';
  396.         //$host = $this->getParameter('host');
  397.         $mail_contact null;
  398.         $mail_ass_info $this->doctrine->getManager()->getRepository(ParametrageTexte::class)->getByCode('COURRIEL_ASSISTANCE_INFO');
  399.         if ((is_countable($mail_ass_info) ? count($mail_ass_info) : 0) > 0)
  400.             $mail_contact $mail_ass_info[0]->getTexte();
  401.         if (RefRole::ROLE_FEDE === $role || RefRole::ROLE_FEDE_INVITE === $role || RefRole::ROLE_CTS === $role) {
  402.             $federation $ui->getIdFederation()->getIdFederation();
  403.             $affectation $ui->getIdAffectation()->getIdAffectation();
  404.         } else {
  405.             $federation null;
  406.             $affectation $ui->getIdAffectation()->getIdAffectation();
  407.         }
  408.         $recipients $gabRep->emailNotification($federation$affectation'emailConges');
  409.         // if (!filter_var($recipients, FILTER_VALIDATE_EMAIL)) {
  410.         //     $recipients = [];
  411.         // }
  412.         if (!empty($recipients)) {
  413.             $message = (new Email())
  414.                 ->subject($subject)
  415.                 ->from($expediteurMail)
  416.                 ->to(...$recipients)
  417.                 ->html(
  418.                     $this->twig->render(
  419.                         'Notification/notification_conge_dtn.html.twig',
  420.                         ['host' => $mail_contact'civility' => $ui->getCivilite(), 'lastname' => $ui->getNom(), 'firstname' => $ui->getPrenom(), 'mailDemandeur' => $expediteurMail]
  421.                     ),
  422.                     'text/html'
  423.                 );
  424.             $this->mailer->send($message);
  425.         }
  426.     }
  427.     /**
  428.      * @return JsonResponse
  429.      */
  430.     #[Route(path'/api/update_conges/{id}'name'ctsweb_update_conge'methods: ['POST'], requirements: ['id' => '\d+'])]
  431.     public function update(Request $requestConge $conge)
  432.     {
  433.         $utilisateurInformation $this->getUser();
  434.         $accessRuleService $this->getServiceAccessRule();
  435.         $utilisateur $utilisateurInformation->getUtilisateur();
  436.         $idRole $utilisateur->getIdRole();
  437.         if (!$accessRuleService->hashRightToModify($conge)) {
  438.             return new JsonResponse(''JsonResponse::HTTP_FORBIDDEN);
  439.         }
  440.         // $conge = new Conge();
  441.         $form $this->handleRequest($request$conge'all''post');
  442.         $em $this->doctrine->getManager();
  443.         $repository $em->getRepository(Conge::class);
  444.         if ($form->isSubmitted() && $form->isValid()) {
  445.             $em $this->doctrine->getManager();
  446.             $workflow $em->getRepository(Workflow::class)->find(Workflow::CO_WAITING);
  447.             if (Workflow::CO_SIGN != $conge->getWorkflow()->getIdWorkflow())
  448.                 $conge->setWorkflow($workflow);
  449.             $entityManager $this->doctrine->getManager();
  450.             // if ($idRole == RefRole::ROLE_CTS || $idRole == RefRole::ROLE_FEDE || $idRole == RefRole::ROLE_FEDE_INVITE) {
  451.             if ($idRole == RefRole::ROLE_CTS) {
  452.                 if ($conge->getCongeType()->getCode() == CongeTypes::CAN || $conge->getCongeType()->getCode() == CongeTypes::RTT) {
  453.                     $id_affectation $utilisateurInformation->getIdAffectation()->getIdAffectation();
  454.                     $requiredCheval $this->getChevalConge($conge$id_affectation);
  455.                     if (!$requiredCheval) {
  456.                         $result = [
  457.                             'success' => false,
  458.                             'error' => sprintf('Votre période de congés est à cheval sur deux années, veuillez déposer une demande par année de gestion')
  459.                         ];
  460.                         return new JsonResponse($resultJsonResponse::HTTP_BAD_REQUEST);
  461.                     }
  462.                 }
  463.                 if ($conge->getCongeType()->getCode() == CongeTypes::CEX) {
  464.                     $requiredFields $this->getRequiredMotifOrPieceJointeForCexConge($conge);
  465.                     if (!empty($requiredFields)) {
  466.                         $result = [
  467.                             'success' => false,
  468.                             'error' => sprintf(' %s  pour un congé de type CE'$requiredFields)
  469.                         ];
  470.                         return new JsonResponse($resultJsonResponse::HTTP_BAD_REQUEST);
  471.                     }
  472.                 }
  473.                 //verifier le soldes des comptes pour le Cet et RAA
  474.                 if ($conge->getCongeType()->getCode() == CongeTypes::CET || $conge->getCongeType()->getCode() == CongeTypes::RAA) {
  475.                     if (!$this->verifier_solde_comptes($conge)) {
  476.                         $result = [
  477.                             'success' => false,
  478.                             'error' => sprintf('Le nombre de jours ouvrés demandé doit être égale ou inférieur au solde de votre %s.'$conge->getCongeType()->getLibelle())
  479.                         ];
  480.                         return new JsonResponse($resultJsonResponse::HTTP_BAD_REQUEST);
  481.                     }
  482.                 }
  483.                 if ($conge->getCongeType()->getCode() == CongeTypes::RAA) {
  484.                     $id_affectation $utilisateurInformation->getIdAffectation()->getIdAffectation();
  485.                     if (!$repository->checkDemandeReportAA($conge$id_affectation)) {
  486.                         $result = [
  487.                             'success' => false,
  488.                             'error' => sprintf('la date de début et la date de fin de congés de  %s doivent être incluses dans la période de débit du report année antérieure fixée par le SH'$conge->getCongeType()->getLibelle())
  489.                         ];
  490.                         return new JsonResponse($resultJsonResponse::HTTP_BAD_REQUEST);
  491.                     }
  492.                 }
  493.                 if (!$repository->check_chevauchement($conge$this->getUser()->getIdUtilisateur())) {
  494.                     $result = [
  495.                         'success' => false,
  496.                         'error' => 'Il y a déjà un congé déposé sur cette période'
  497.                     ];
  498.                     return new JsonResponse($resultJsonResponse::HTTP_BAD_REQUEST);
  499.                 }
  500.             }
  501.             $entityManager->persist($conge);
  502.             $entityManager->flush();
  503.             $result = ['success' => true];
  504.             $status JsonResponse::HTTP_OK;
  505.         } else {
  506.             $result = [
  507.                 'success' => false,
  508.                 'data' => self::ERROR_VALIDATION_FORM,
  509.                 'error' => (string) $form->getErrors(truefalse)
  510.             ];
  511.             $status JsonResponse::HTTP_BAD_REQUEST;
  512.         }
  513.         return new JsonResponse($result$status);
  514.     }
  515.     #[Route(path'/api/delete_conges/{id}'name'ctsweb_delete_conge'requirements: ['id' => '\d+'])]
  516.     public function delete(Conge $conge)
  517.     {
  518.         try {
  519.             $em $this->doctrine->getManager();
  520.             $repository $em->getRepository(Conge::class);
  521.             $cg $repository->findOneBy(['id' => $conge->getId()]);
  522.             if ($cg) {
  523.                 if ($cg->getWorkflow()->getIdWorkflow() == Workflow::CO_SIGN or $cg->getWorkflow()->getIdWorkflow() == Workflow::CO_ACCEPTED) {
  524.                     $workflow $em->getRepository(Workflow::class)->find(Workflow::CO_ANNULE);
  525.                     $conge->setWorkflow($workflow);
  526.                     $em->persist($conge);
  527.                     $em->flush();
  528.                     $data = ['success' => true'data' => 'Le congé a été annulé'];
  529.                     return new JsonResponse($data);
  530.                 } else {
  531.                     $repository->deleteConge($conge->getId());
  532.                     $data = ['success' => true'data' => 'Le congé a été supprimé'];
  533.                     return new JsonResponse($data);
  534.                 }
  535.             }
  536.         } catch (\Exception $e) {
  537.             $data = ['success' => false'data' => $e->getMessage()];
  538.             return new JsonResponse($data);
  539.         }
  540.     }
  541.     /**
  542.      * @return JsonResponse
  543.      */
  544.     #[Route(path'/api/conges/{id}/change-status'name'ctsweb_change_status_conge'methods: ['POST'], requirements: ['id' => '\d+'])]
  545.     public function changeStatus(Request $requestConge $conge)
  546.     {
  547.         $accessRuleService $this->getServiceAccessRule();
  548.         if (!$accessRuleService->isAdmin()) {
  549.             return new JsonResponse(''JsonResponse::HTTP_FORBIDDEN);
  550.         }
  551.         $form $this->handleRequest($request$conge'status''status');
  552.         if ($form->isSubmitted() && $form->isValid()) {
  553.             $conge->setFrom(Conge::ADMIN);
  554.             $entityManager $this->doctrine->getManager();
  555.             $entityManager->flush();
  556.             $result = ['success' => true];
  557.             $status JsonResponse::HTTP_OK;
  558.         } else {
  559.             $result = [
  560.                 'success' => false,
  561.                 'data' => self::ERROR_VALIDATION_FORM,
  562.                 'error' => (string) $form->getErrors(truefalse)
  563.             ];
  564.             $status JsonResponse::HTTP_BAD_REQUEST;
  565.         }
  566.         return new JsonResponse($result$status);
  567.     }
  568.     /**
  569.      * @return JsonResponse
  570.      */
  571.     #[Route(path'/api/conges/response/{id}'name'ctsweb_response_conge'methods: ['POST'], requirements: ['id' => '\d+'])]
  572.     public function response(Request $requestConge $conge)
  573.     {
  574.         $form $this->handleRequest(
  575.             $request,
  576.             $conge,
  577.             'response',
  578.             'response'
  579.         );
  580.         
  581.         $entityManager $this->doctrine->getManager();
  582.         if ($form->isValid()) {
  583.             
  584.             $accessRuleService $this->getServiceAccessRule();
  585.             $this->update($request$conge);
  586.            
  587.             if (Conge::DTN === $conge->getFrom()) {
  588.                 if (!$accessRuleService->hashRightToResponse($conge) && !$accessRuleService->isAdmin()) {
  589.                     return new JsonResponse(''JsonResponse::HTTP_FORBIDDEN);
  590.                 }
  591.                 
  592.                 $congeId $conge->getId();
  593.                 $avisDtn = ($conge->getResponse()) ? 0;
  594.                 $update $entityManager->getRepository(Conge::class)->updateavisDtn($congeId$avisDtn);
  595.                 // $conge->setAvisDtn($conge->getResponse());
  596.             } elseif (Conge::MANAGER === $conge->getFrom() || Conge::ADMIN === $conge->getFrom()) {
  597.                 $this->setWorkflow($conge);
  598.             }
  599.             $entityManager->flush();
  600.             if ($conge->getResponse() && !is_null($conge->getId())) {
  601.                 $role $this->getUser()->getUtilisateur()->getIdRole();
  602.                 
  603.                 if (in_array($roleUtilisateur::MANAGER)) {
  604.                     $this->initSignatureConges($conge->getId());
  605.                 }
  606.             }
  607.             $result = ["success" => true];
  608.             $response JsonResponse::HTTP_OK;
  609.         } else {
  610.             $result = [
  611.                 'success' => false,
  612.                 'data' => self::ERROR_VALIDATION_FORM,
  613.                 'error' => (string) $form->getErrors(truefalse)
  614.             ];
  615.             $response JsonResponse::HTTP_BAD_REQUEST;
  616.         }
  617.         return new JsonResponse($result$response);
  618.     }
  619.     /**
  620.      * @return JsonResponse
  621.      */
  622.     #[Route(path'/api/conges/generate-to-print'name'ctsweb_print_conge'methods: ['POST'])]
  623.     public function generateToPrint(Request $request)
  624.     {
  625.         $accessRuleService $this->getServiceAccessRule();
  626.         if (!$accessRuleService->hasRightForTakingDayOff()) {
  627.             return new JsonResponse(''JsonResponse::HTTP_FORBIDDEN);
  628.         }
  629.         $conge = new Conge();
  630.         $form $this->handleRequest($request$conge'all''post');
  631.         $em $this->doctrine->getManager();
  632.         $repository $em->getRepository(Conge::class);
  633.         try {
  634.             if ($form->isSubmitted() && $form->isValid()) {
  635.                 $entityManager $this->doctrine->getManager();
  636.                 $conge->setUtilisateur($this->getUser()->getUtilisateur());
  637.                 $serviceGeneratePdf $this->generatePdf;
  638.                 $entityManager->persist($conge);
  639.                 $content $serviceGeneratePdf->generatePdf($congetrue);
  640.                 $filename sha1($conge->getId()) . '.pdf';
  641.                 $response $this->getResponse($content$filename);
  642.             } else {
  643.                 $response = new JsonResponse(['error' => self::ERROR_FILE], JsonResponse::HTTP_BAD_REQUEST);
  644.             }
  645.         } catch (\Exception) {
  646.             $response = new JsonResponse(['error' => self::ERROR_FILE], JsonResponse::HTTP_BAD_REQUEST);
  647.         }
  648.         return $response;
  649.     }
  650.     /**
  651.      * @return Response
  652.      */
  653.     #[Route(path'/api/conges/pdf/{id}'name'ctsweb_conges_generate-pdf'methods: ['GET'], requirements: ['id' => '\d+'])]
  654.     public function pdf(Conge $conge)
  655.     {
  656.         if (
  657.             Workflow::CO_REJECT === $conge->getWorkflow()->getIdWorkflow()
  658.             || Workflow::CO_SIGN === $conge->getWorkflow()->getIdWorkflow()
  659.         ) {
  660.             $filename sha1($conge->getId()) . '.pdf';
  661.             $path $this->getParameter('dir_file_conge') . $filename;
  662.             if (file_exists($path)) {
  663.                 $content file_get_contents($pathFILE_USE_INCLUDE_PATH);
  664.                 $response $this->getResponse($content$filename);
  665.             } else {
  666.                 $response = new JsonResponse(['error' => self::ERROR_FILE], JsonResponse::HTTP_BAD_REQUEST);
  667.             }
  668.         } else {
  669.             $serviceGeneratePdf $this->generatePdf;
  670.             $content $serviceGeneratePdf->generatePdf($congefalse);
  671.             $filename sha1($conge->getId()) . '.pdf';
  672.             $response $this->getResponse($content$filename);
  673.         }
  674.         return $response;
  675.     }
  676.     #[Route(path'/api/conges/status/list'name'ctsweb_conges_status-list-pdf'methods: ['GET'], requirements: ['id' => '\d+'])]
  677.     public function statusList(): JsonResponse
  678.     {
  679.         $entityManager $this->doctrine->getManager();
  680.         $statuses $entityManager
  681.             ->getRepository(Workflow::class)
  682.             ->findBy(['idWorkflow' => Workflow::FILTER]);
  683.         return new JsonResponse(
  684.             $this->serialize($statuses),
  685.             JsonResponse::HTTP_OK,
  686.             [],
  687.             true
  688.         );
  689.     }
  690.     /**
  691.      * @return \Symfony\Component\Form\FormInterface
  692.      */
  693.     private function handleRequest(
  694.         Request $request,
  695.         Conge $conge,
  696.         string $label,
  697.         string $validationGroup
  698.     ) {
  699.         $data json_decode($request->getContent(), true512JSON_THROW_ON_ERROR);
  700.         if (isset($data['pieceMotif'])) {
  701.             $data['pieceMotif'] = json_encode($data['pieceMotif'], JSON_THROW_ON_ERROR);
  702.         }
  703.         $request->request->replace(is_array($data) ? $data : []);
  704.         $form $this->createForm(
  705.             CongeType::class,
  706.             $conge,
  707.             ['label' => $label'validation_groups' => $validationGroup]
  708.         );
  709.         $form->handleRequest($request);
  710.         return $form;
  711.     }
  712.     /**
  713.      * @param array $states
  714.      * @return mixed
  715.      */
  716.     private function serializeto($item)
  717.     {
  718.         $data = [$item];
  719.         $context = new SerializationContext();
  720.         $context->setSerializeNull(true);
  721.         return $this->serializer->serialize($data'json'$context);
  722.     }
  723.     /**
  724.      * @param array $states
  725.      * @return mixed
  726.      */
  727.     private function serialize($item)
  728.     {
  729.         $data = ["items" => $item];
  730.         $context = new SerializationContext();
  731.         $context->setSerializeNull(true);
  732.         return $this->serializer->serialize($data'json'$context);
  733.     }
  734.     /**
  735.      * @return object
  736.      */
  737.     private function getServiceAccessRule()
  738.     {
  739.         return $this->accessRule;
  740.     }
  741.     private function setWorkflow(Conge $conge)
  742.     {
  743.         $workflow Workflow::CO_REJECT;
  744.         if ($conge->getResponse()) {
  745.             $workflow Workflow::CO_ACCEPTED;
  746.         }
  747.         $entityManager $this->doctrine->getManager();
  748.         $workflowEntity $entityManager
  749.             ->getRepository(Workflow::class)
  750.             ->find($workflow);
  751.         $conge->setWorkflow($workflowEntity);
  752.     }
  753.     public function getResponse(string $contentstring $filename): Response
  754.     {
  755.         return new Response(
  756.             $content,
  757.             Response::HTTP_OK,
  758.             [
  759.                 'Content-Type' => 'application/pdf',
  760.                 'Content-Length' => strlen($content),
  761.                 'Content-Disposition' => "attachment;filename=\"{$filename}",
  762.                 'Accept-Ranges' => 'bytes'
  763.             ]
  764.         );
  765.     }
  766.     /**
  767.      * @return JsonResponse
  768.      */
  769.     #[Route(path'/api/calendrier-conges-info'name'ctsweb_calendrier-conges-info'methods: ['GET'])]
  770.     public function getCalendrierConges()
  771.     {
  772.         try {
  773.             $utilisateurInformation $this->getUser();
  774.             $affectation $utilisateurInformation->getIdAffectation()->getIdAffectation();
  775.             $entityManager $this->doctrine->getManager();
  776.             $affectionEntity $entityManager
  777.                 ->getRepository(RefAffectation::class)
  778.                 ->findOneBy(["idAffectation" => $affectation]);
  779.             // $dateBascule = $affectionEntity->getDateBascule();
  780.             $today = new \DateTime();
  781.             $today $today->format('Y-m-d');
  782.             $getRefCalendrier =  $entityManager
  783.                 ->getRepository(RefAffectationCalendrier::class)
  784.                 ->getRefCalendrier($affectation);
  785.             $calendrier $getRefCalendrier['calendrierAffectation'];
  786.             $getCheckbox =  $entityManager
  787.                 ->getRepository(RefAffectationCalendrier::class)
  788.                 ->findLastByRefAffectationId($affectation);
  789.             if (isset($getCheckbox['0']) && !empty($getCheckbox['0'])) {
  790.                 $Checkbox  =  $getCheckbox['0']['calendrier_scolaire'];
  791.             } else {
  792.                 $Checkbox  =  false;
  793.             }
  794.             $data = ["data" => ["calendrier_scolaire" => $calendrier"calendrier_checkbox" => $Checkbox]];
  795.             $data json_encode($data);
  796.             return new JsonResponse($dataJsonResponse::HTTP_OK, [], true);
  797.         } catch (\Exception $e) {
  798.             echo $e->getMessage();
  799.             $result = [
  800.                 'success' => false,
  801.                 'data' => self::ERROR_OCCURED
  802.             ];
  803.             return new JsonResponse($resultJsonResponse::HTTP_BAD_REQUEST);
  804.         }
  805.     }
  806.     /**
  807.      * @return JsonResponse
  808.      */
  809.     #[Route(path'/api/calendrier-conges-info-form'name'ctsweb_calendrier-conges-info-form'methods: ['GET'])]
  810.     public function getCalendrierCongesForm()
  811.     {
  812.         try {
  813.             $utilisateurInformation $this->getUser();
  814.             $affectation $utilisateurInformation->getIdAffectation()->getIdAffectation();
  815.             $entityManager $this->doctrine->getManager();
  816.             $getRefCalendrier =  $entityManager
  817.                 ->getRepository(RefAffectationCalendrier::class)
  818.                 ->getRefCalendrier($affectation);
  819.             $calendrier $getRefCalendrier['calendrierAffectation'];
  820.             $data = ["data" => ["calendrier_scolaire" => $calendrier]];
  821.             $data json_encode($data);
  822.             return new JsonResponse($dataJsonResponse::HTTP_OK, [], true);
  823.         } catch (\Exception $e) {
  824.             echo $e->getMessage();
  825.             $result = [
  826.                 'success' => false,
  827.                 'data' => self::ERROR_OCCURED
  828.             ];
  829.             return new JsonResponse($resultJsonResponse::HTTP_BAD_REQUEST);
  830.         }
  831.     }
  832.     #[Route(path'/api/calendrier-conges'name'ctsweb_calendrier-conges'methods: ['POST'])]
  833.     // ...
  834.     public function changerRefAffectationCalendrier(Request $request)
  835.     {
  836.         try {
  837.             $data json_decode($request->getContent(), true512JSON_THROW_ON_ERROR);
  838.             $request->request->replace(is_array($data) ? $data : []);
  839.             $params $request->request->all();
  840.             $utilisateurInformation $this->getUser();
  841.             $affectation $utilisateurInformation->getIdAffectation();
  842.             $entityManager $this->doctrine->getManager();
  843.             $aujourdhui = new \DateTime();
  844.             $refAffectationCalendrier = new RefAffectationCalendrier();
  845.             $refAffectationCalendrier->setIdAff($affectation->getIdAffectation());
  846.             $today = (new \DateTime());
  847.             $refAffectationCalendrierRepository $entityManager->getRepository(RefAffectationCalendrier::class);
  848.             $currentYear $today->format("Y");
  849.             $nextYear $currentYear 1;
  850.             $lastbascule $refAffectationCalendrierRepository->findLastByRefAffectationId($affectation->getIdAffectation());
  851.             if (isset($lastbascule[0]) && !empty($lastbascule[0])) {
  852.                 $lastbasculeCalendrier = isset($lastbascule[0]['calendrier_scolaire']) ? $lastbascule[0]['calendrier_scolaire'] : '';
  853.             } else {
  854.                 $lastbasculeCalendrier false;
  855.             }
  856.             if ($params["calendrier_scolaire"]) {
  857.                 if (!$lastbasculeCalendrier) {
  858.                     // Si nous sommes après le 1er septembre, fixer la date de bascule au 1er septembre de l'année prochaine
  859.                     if ($aujourdhui >= new \DateTime('first day of September')) {
  860.                         $dateBascule = new \DateTime('first day of September next year');
  861.                         $refAffectationCalendrier->setCalendrierScolaire(true);
  862.                         $refAffectationCalendrier->setDateBascule($dateBascule);
  863.                         // Fixer la date de début au lendemain de la date de bascule
  864.                         $refAffectationCalendrier->setDateDebut($dateBascule);
  865.                         // Sauvegarder l'objet $RefAffectationCalendrier dans la base de données (EntityManager) pour suivre les changements de RefAffectationCalendrier.
  866.                         $entityManager->persist($refAffectationCalendrier);
  867.                         $entityManager->flush();
  868.                     } else {
  869.                         if (isset($lastbascule[0]) && !empty($lastbascule[0])) {
  870.                             $datebasculeCalendrier $lastbascule[0]['date_bascule'];
  871.                             // $datebasculeCalendrier = $datebasculeCalendrier->format('Y-m-d');
  872.                         } else {
  873.                             $datebasculeCalendrier false;
  874.                         }
  875.                         if ($datebasculeCalendrier  < new \DateTime('first day of September')) {
  876.                             // Vérifier si la dernière ligne correspond à un type d'affectation spécifique
  877.                             $dateBascule = new \DateTime('first day of September');
  878.                             $isLastLineForSpecificAffectation $refAffectationCalendrierRepository->findLastByRefAffectationIdcivile($affectation->getIdAffectation(), $dateBascule);
  879.                             if (!$isLastLineForSpecificAffectation) {
  880.                                 $dateBascule = new \DateTime('first day of September');
  881.                                 $refAffectationCalendrier->setCalendrierScolaire(true);
  882.                                 $refAffectationCalendrier->setDateBascule($dateBascule);
  883.                                 // Fixer la date de début au lendemain de la date de bascule
  884.                                 $refAffectationCalendrier->setDateDebut($dateBascule);
  885.                                 // Sauvegarder l'objet $RefAffectationCalendrier dans la base de données (EntityManager) pour suivre les changements de RefAffectationCalendrier.
  886.                                 $entityManager->persist($refAffectationCalendrier);
  887.                                 $entityManager->flush();
  888.                             }
  889.                         } else {
  890.                             // SUPPRIMER LE CALENDRIER 
  891.                             if (isset($lastbascule[0]['id']) && !empty($lastbascule[0]['id'])) {
  892.                                 // var_dump($lastbascule[0]['id']);
  893.                                 $this->deleteByIdRefAffectation($lastbascule[0]['id']);
  894.                             }
  895.                         }
  896.                     }
  897.                 }
  898.             } else {
  899.                 $dateBascule = new \DateTime('first day of January next year');
  900.                 $isLastLineForSpecificAffectation $refAffectationCalendrierRepository->findLastByRefAffectationIdcivile($affectation->getIdAffectation(), $dateBascule);
  901.                 $isLineForSpecificAffectation $refAffectationCalendrierRepository->findLastByRefAffectationId($affectation->getIdAffectation());
  902.                 if (!$isLastLineForSpecificAffectation &&  $isLineForSpecificAffectation) {
  903.                     // Si nous sommes après le 1er janvier, fixer la date de bascule au 1er janvier de l'année prochaine
  904.                     if ($aujourdhui >= new \DateTime('first day of January')) {
  905.                         $dateBascule = new \DateTime('first day of January next year');
  906.                         $refAffectationCalendrier->setCalendrierScolaire(false);
  907.                         $refAffectationCalendrier->setDateBascule($dateBascule);
  908.                         $date_debut $dateBascule;
  909.                         $refAffectationCalendrier->setDateDebut($date_debut);
  910.                         // Sauvegarder l'objet $RefAffectationCalendrier dans la base de données (EntityManager) pour suivre les changements de RefAffectationCalendrier.
  911.                         $entityManager->persist($refAffectationCalendrier);
  912.                         $entityManager->flush();
  913.                     }
  914.                 }
  915.             }
  916.             $data = ['success' => true'data' => 'Mise à jour effectuée avec succès'];
  917.             return new JsonResponse($data);
  918.         } catch (\Exception $e) {
  919.             echo $e->getMessage();
  920.             $data = [
  921.                 'success' => false,
  922.                 'data' => self::ERROR_OCCURED
  923.             ];
  924.         }
  925.         return new JsonResponse($dataJsonResponse::HTTP_BAD_REQUEST);
  926.     }
  927.     public function deleteByIdRefAffectation($id)
  928.     {
  929.         $entityManager $this->doctrine->getManager();
  930.         $entity $entityManager->getRepository(RefAffectationCalendrier::class)->findOneBy(['id' => $id]);
  931.         if ($entity) {
  932.             $entityManager->remove($entity);
  933.             $entityManager->flush();
  934.             return true;
  935.         }
  936.         return false;
  937.     }
  938.     public function initSignatureConges($idconges)
  939.     {
  940.         try {
  941.             // $listeConges =   explode(',', $request->request->get('listeConges'));
  942.             // $listeConges = json_decode($request->getContent(), true);
  943.             $em $this->doctrine->getManager();
  944.             $congesRepo $em->getRepository(Conge::class);
  945.             $workflow $em->getRepository(Workflow::class)->find(Workflow::CO_SIGN);
  946.             $jourdhui = (new \DateTime())->format('Y-m-d');
  947.             $utilisateurRepository $em->getRepository(Utilisateur::class);
  948.             $congObj $congesRepo->find($idconges);
  949.             $idUtilisateur $congObj->getUtilisateur()->getIdUtilisateur();
  950.             $idSignataire $this->getUser()->getUtilisateur()->getIdUtilisateur();
  951.             $affectationSignataire $em->getRepository(UtilisateurInformation::class)->findOneByIdUtilisateur($idSignataire)->getIdAffectation()->getIdAffectation();
  952.             $affectation $em->getRepository(UtilisateurInformation::class)->findOneByIdUtilisateur($idUtilisateur)->getIdAffectation()->getIdAffectation();
  953.             
  954.             // TODO: Valider la logique de sélection du signataire en fonction de l'affectation.
  955.             /*  if ($affectationSignataire == $affectation) {
  956.                 $signataire = $em->getRepository(UtilisateurInformation::class)->findOneBy(['utilisateur' =>$idSignataire]);
  957.             }
  958.             else {
  959.                 if ($affectation != 1) {
  960.                     $drsignataire = $em->getRepository(UtilisateurInformation::class)->findDrSuperieur($affectation);
  961.                 } else {
  962.                     $drsignataire = $em->getRepository(UtilisateurInformation::class)->findDsSuperieur($affectation);
  963.                 }
  964.                 $signataire = $em->getRepository(UtilisateurInformation::class)->findOneByIdUtilisateur($drsignataire);
  965.             }*/
  966.             if ($affectation != 1) {
  967.                 $drsignataire $em->getRepository(UtilisateurInformation::class)->findDrSuperieur($affectation);
  968.             } else {
  969.                 $drsignataire $em->getRepository(UtilisateurInformation::class)->findDsSuperieur($affectation);
  970.             }
  971.             $signataire $em->getRepository(UtilisateurInformation::class)->findOneByIdUtilisateur($drsignataire);
  972.             
  973.             $path $signataire->getScan() ? $this->getParameter('dir_file_signature') . $signataire->getScan()->getAbsolutePath() : '';
  974.             if ($path && file_get_contents($path)) {
  975.                 $pathvrai $path;
  976.             } else {
  977.                 $pathvrai "";
  978.             }
  979.             $info_signature = array(
  980.                 'nom' => $signataire->getNom(),
  981.                 'prenom' => $signataire->getPrenom(),
  982.                 'dateSignature' => date("d/m/Y"),
  983.                 'sup' => true,
  984.                 'fonction' => $signataire->getFonction(),
  985.                 'path' =>  $pathvrai,
  986.                 'civilite' => $signataire->getCivilite()
  987.             );
  988.             
  989.             //  foreach ($listeConges as $conge) {
  990.             $congObj $congesRepo->find($idconges);
  991.             $congObj->setWorkflow($workflow);
  992.             $idUtilisateur $congObj->getUtilisateur()->getIdUtilisateur();
  993.             // $email = $utilisateurRepository->findCourrielById($idUtilisateur)[0]['courriel'];
  994.             $emails $utilisateurRepository->findCourrielById($idUtilisateur);
  995.             $email = isset($emails[0]['courriel']) ? $emails[0]['courriel'] : null;
  996.             // }
  997.             $beginDate $congObj->getDateDebut();
  998.             $mail $this->emailSHDecision->getMail(
  999.                 EmailSHDecision::SIGNED,
  1000.                 EmailSHDecision::CONGE,
  1001.                 $email,
  1002.                 $beginDate
  1003.             );
  1004.             if ($mail) {
  1005.                 $this->mailer->send($mail);
  1006.             }
  1007.             // $info_signature['dateSignature']=$congObj->getDateDerniereModification();
  1008.             //  $em->setDateDeSignature($jourdhui);
  1009.             //  $em->setSignataire($signataire);
  1010.             $em->persist($congObj);
  1011.             $em->flush();
  1012.             $this->generatePdf->generatePdf($congObjfalse$affectation$info_signature);
  1013.             $message 'Tous les conges ont été signés avec succès.';
  1014.             $return = array(
  1015.                 'success' => true,
  1016.                 'data' => $message
  1017.             );
  1018.         } catch (\Exception $e) {
  1019.             $message 'Un ou plusieurs congés n\'ont pu être signés.';
  1020.             $return = array(
  1021.                 'success' => false,
  1022.                 'data' => $e->getMessage()
  1023.             );
  1024.         }
  1025.         return new JsonResponse(
  1026.             $return,
  1027.             JsonResponse::HTTP_CREATED
  1028.         );
  1029.     }
  1030.     private function getChevalConge($conge,  $Idaffectation)
  1031.     {
  1032.         $entityManager $this->doctrine->getManager();
  1033.         $today = (new \DateTime());
  1034.         $year $today->format("Y");
  1035.         $getRefCalendrier =  $entityManager
  1036.             ->getRepository(RefAffectationCalendrier::class)
  1037.             ->getRefCalendrier($Idaffectation);
  1038.         $dateBasculeCongeSolaire $getRefCalendrier['dateBascule'];
  1039.         $congeScolaire $getRefCalendrier['calendrierScolaire'];
  1040.         $today = (new \DateTime());
  1041.         $year $today->format("Y");;
  1042.         if (!$congeScolaire) {
  1043.             if ($conge->getDateFin()->format('Y') != $conge->getDateDebut()->format('Y')) {
  1044.                 return false;
  1045.             }
  1046.         } else {
  1047.             if ((true === $congeScolaire) && ($dateBasculeCongeSolaire $today) && ($today < new \DateTime("$year-09-01"))) {
  1048.                 $annee $year;
  1049.             } else {
  1050.                 $annee $year 1;
  1051.             }
  1052.             if ((int)$conge->getDateFin()->format('m') >=  && (int)$conge->getDateDebut()->format('m') <= 8) {
  1053.                 return false;
  1054.             }
  1055.         }
  1056.         return true;
  1057.     }
  1058.     private function getRequiredMotifOrPieceJointeForCexConge($conge)
  1059.     {
  1060.         $requiredFields = array();
  1061.         if ($conge->getCongeType()->getCode() == CongeTypes::CEX) {
  1062.             if ($conge->getMotifConge() == "") {
  1063.                 $requiredFields[] = "Le Motif de congé doit être renseigné";
  1064.             }
  1065.             if ($conge->getPieceMotif() == "") {
  1066.                 $requiredFields[] = "Vous devez joindre un justificatif ";
  1067.             }
  1068.         }
  1069.         return implode(" et "$requiredFields);
  1070.     }
  1071.     #[Route(path'/api/report-conge'name'ctsweb_calendrier-report'methods: ['POST'])]
  1072.     public function updateCalendrierReport(Request $request)
  1073.     {
  1074.         try {
  1075.             $data json_decode($request->getContent(), true512JSON_THROW_ON_ERROR);
  1076.             $request->request->replace(is_array($data) ? $data : []);
  1077.             $params $request->request->all();
  1078.             // Appeler la fonction pour mettre à jour les dates dans l'entité RefAffectation
  1079.             $this->updateDatesInRefAffectation($params);
  1080.             $data = ['success' => true'data' => 'Mise à jour effectuée avec succès'];
  1081.             return new JsonResponse($data);
  1082.         } catch (\Exception $e) {
  1083.             $data = [
  1084.                 'success' => false,
  1085.                 'data' =>  $e->getMessage()
  1086.             ];
  1087.         }
  1088.         return new JsonResponse($dataJsonResponse::HTTP_BAD_REQUEST);
  1089.     }
  1090.     /**
  1091.      * Met à jour les dates de l'entité RefAffectation avec les valeurs fournies.
  1092.      *
  1093.      * @param array $params Tableau contenant les dates à mettre à jour
  1094.      *
  1095.      * @throws \Exception Si une ou plusieurs des dates requises sont manquantes ou nulles
  1096.      */
  1097.     public function updateDatesInRefAffectation(array $params): void
  1098.     {
  1099.         // Vérifier si toutes les dates requises sont présentes et non nulles
  1100.         if (!$this->areDatesValid($params)) {
  1101.             throw new \Exception('Une ou plusieurs des dates requises sont manquantes ou nulles.');
  1102.         }
  1103.         // Créer des objets DateTime à partir des chaînes de dates
  1104.         $dateDebutCredit = new \DateTime($params['dateDebutCredit']);
  1105.         $dateFinCredit = new \DateTime($params['dateFinCredit']);
  1106.         $dateDebutDebit = new \DateTime($params['dateDebutDebit']);
  1107.         $dateFinDebit = new \DateTime($params['dateFinDebit']);
  1108.         $utilisateurInformation $this->getUser();
  1109.         $affectation $utilisateurInformation->getIdAffectation();
  1110.         $entityManager $this->doctrine->getManager();
  1111.         $affectionEntity $entityManager
  1112.             ->getRepository(RefAffectation::class)
  1113.             ->findOneBy(["idAffectation" => $affectation]);
  1114.         // Mettre à jour les propriétés de dates de l'entité
  1115.         $affectionEntity->setDateDebutCredit($dateDebutCredit);
  1116.         $affectionEntity->setDateFinCredit($dateFinCredit);
  1117.         $affectionEntity->setDateDebutDebit($dateDebutDebit);
  1118.         $affectionEntity->setDateFinDebit($dateFinDebit);
  1119.         $entityManager->persist($affectionEntity);
  1120.         $entityManager->flush();
  1121.     }
  1122.     /**
  1123.      * Vérifie si toutes les dates requises sont présentes, non nulles et valides.
  1124.      *
  1125.      * @param array $params Tableau contenant les dates à vérifier
  1126.      *
  1127.      * @return bool true si toutes les dates sont valides, false sinon
  1128.      * @throws \Exception Si une date est manquante, nulle, invalide ou si la date de début est supérieure ou égale à la date de fin
  1129.      */
  1130.     private function areDatesValid(array $params): bool
  1131.     {
  1132.         // Liste des dates requises
  1133.         $requiredDates = [
  1134.             'dateDebutCredit',
  1135.             'dateFinCredit',
  1136.             'dateDebutDebit',
  1137.             'dateFinDebit'
  1138.         ];
  1139.         // Vérifier si toutes les dates requises sont présentes, non nulles et valides
  1140.         foreach ($requiredDates as $dateKey) {
  1141.             if (!isset($params[$dateKey]) || empty($params[$dateKey])) {
  1142.                 throw new \Exception("La date '$dateKey' est manquante ou nulle.");
  1143.             }
  1144.             // Exclure la date '1970-01-01'
  1145.             if ($params[$dateKey] === '1970-01-01') {
  1146.                 throw new \Exception("La date '$dateKey' est invalide.");
  1147.             }
  1148.             // Vérifier le format de la date
  1149.             if (!strtotime($params[$dateKey])) {
  1150.                 throw new \Exception("La date '$dateKey' est invalide.");
  1151.             }
  1152.             // Créer l'objet DateTime
  1153.             $date = new \DateTime($params[$dateKey]);
  1154.             // Vérifier si l'objet DateTime a été créé avec succès
  1155.             if (!$date) {
  1156.                 throw new \Exception("La date '$dateKey' est invalide.");
  1157.             }
  1158.         }
  1159.         // Vérifier la relation entre les dates de début et de fin pour les crédits
  1160.         $dateDebutCredit \DateTime::createFromFormat('Y-m-d'$params['dateDebutCredit']);
  1161.         $dateFinCredit \DateTime::createFromFormat('Y-m-d'$params['dateFinCredit']);
  1162.         if ($dateDebutCredit $dateFinCredit) {
  1163.             throw new \Exception("La date de début 'dateDebutCredit' doit être inférieure à la date de fin 'dateFinCredit'.");
  1164.         }
  1165.         // Vérifier la relation entre les dates de début et de fin pour les débits
  1166.         $dateDebutDebit \DateTime::createFromFormat('Y-m-d'$params['dateDebutDebit']);
  1167.         $dateFinDebit \DateTime::createFromFormat('Y-m-d'$params['dateFinDebit']);
  1168.         if ($dateDebutDebit $dateFinDebit) {
  1169.             throw new \Exception("La date de début 'dateDebutDebit' doit être inférieure à la date de fin 'dateFinDebit'.");
  1170.         }
  1171.         // Débit report année antérieure >= Crédit report année antérieure
  1172.         if ($dateDebutDebit $dateDebutCredit) {
  1173.             throw new \Exception("La date de début 'Date débit report année antérieure' doit être superieure ou égale  à la date de fin 'Date crédit report année antérieure'.");
  1174.         }
  1175.         return true;
  1176.     }
  1177.     /**
  1178.      * @return JsonResponse
  1179.      */
  1180.     #[Route(path'/api/calendrier-report-info'name'ctsweb_calendrier-report-info'methods: ['GET'])]
  1181.     public function getCalendrierReport()
  1182.     {
  1183.         $jsonv = [];
  1184.         try {
  1185.             $utilisateurInformation $this->getUser();
  1186.             $affectation $utilisateurInformation->getIdAffectation()->getIdAffectation();
  1187.             $entityManager $this->doctrine->getManager();
  1188.             $affectionEntity $entityManager
  1189.                 ->getRepository(RefAffectation::class)
  1190.                 ->findOneBy(["idAffectation" => $affectation]);
  1191.             $getRefCalendrier =  $entityManager
  1192.                 ->getRepository(RefAffectationCalendrier::class)
  1193.                 ->getRefCalendrier($affectation);
  1194.             $calendrier $getRefCalendrier['calendrierAffectation'];
  1195.             $anneeEnCours date('Y'); // Récupère l'année en cours
  1196.             // Si $calendrier est faux, retourne l'année en cours
  1197.             // Sinon, retourne l'année précédente divisée par l'année en cours
  1198.             $annee $calendrier ? ($anneeEnCours 1) . '/' $anneeEnCours $anneeEnCours;
  1199.             // Récupère les dates 'dateDebutCredit', 'dateFinCredit', 'dateDebutDebit' et 'dateFinDebit' de $affectionEntity si elles existent
  1200.             $dateDebutCredit = isset($affectionEntity) ? $affectionEntity->getDateDebutCredit() : null;
  1201.             $dateFinCredit = isset($affectionEntity) ? $affectionEntity->getDateFinCredit() : null;
  1202.             $dateDebutDebit = isset($affectionEntity) ? $affectionEntity->getDateDebutDebit() : null;
  1203.             $dateFinDebit = isset($affectionEntity) ? $affectionEntity->getDateFinDebit() : null;
  1204.             // Crée le tableau items avec les valeurs récupérées
  1205.             $items = [
  1206.                 'annee' => $annee,
  1207.                 'dateDebutCredit' => isset($dateDebutCredit) ? $dateDebutCredit->format('Y-m-d H:i:s') : null,
  1208.                 'dateFinCredit' => isset($dateFinCredit) ? $dateFinCredit->format('Y-m-d H:i:s') : null,
  1209.                 'dateDebutDebit' => isset($dateDebutDebit) ? $dateDebutDebit->format('Y-m-d H:i:s') : null,
  1210.                 'dateFinDebit' => isset($dateFinDebit) ? $dateFinDebit->format('Y-m-d H:i:s') : null,
  1211.             ];
  1212.             $jsonv['items'] = $items;
  1213.             $json_merge json_encode($jsonv);
  1214.             return new JsonResponse($json_mergeJsonResponse::HTTP_OK, [], true);
  1215.         } catch (\Exception $e) {
  1216.             // Gérer les exceptions
  1217.             return new JsonResponse(['error' => "Une erreur s'est produite."], JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
  1218.         }
  1219.     }
  1220.     function createNewReport(): array
  1221.     {
  1222.         return [
  1223.             'dateDebut' => "-",
  1224.             'dateFin' => "-",
  1225.             'avisDtn' => "-",
  1226.             "congeType" => [
  1227.                 "id" => 6,
  1228.                 "libelle" => Workflow::STATETYPE[DemandeReport::TYPE_ONE],
  1229.                 "description" => null,
  1230.                 "code" => "DDR",
  1231.                 "nbJourTotal" => null,
  1232.                 "nouveauSolde" => null,
  1233.                 "solde" => null,
  1234.             ],
  1235.             'dateDebutType' =>  [
  1236.                 "libelle" => null,
  1237.                 "code" => null
  1238.             ],
  1239.             'dateFinType' => [
  1240.                 "libelle" => null,
  1241.                 "code" => null
  1242.             ],
  1243.             'isTooLate' => null,
  1244.             'motifConge' => null,
  1245.             'pieceMotif' => null,
  1246.             'commentaireSh' => null,
  1247.             'commentaireDtn' => null,
  1248.             'choixConge' => '2'
  1249.         ];
  1250.     }
  1251.     function createNewReportDtnSH(): array
  1252.     {
  1253.         return [
  1254.             'dateDebut' => "-",
  1255.             'dateFin' => "-",
  1256.             'avisDtn' => "-",
  1257.             "libelle" => Workflow::STATETYPE[DemandeReport::TYPE_ONE],
  1258.             "code" => "DDR",
  1259.             'dateDebutType' =>  null,
  1260.             'dateFinType' =>  null,
  1261.             'isTooLate' => null,
  1262.             'motifConge' => null,
  1263.             'pieceMotif' => null,
  1264.             'commentaireSh' => null,
  1265.             'commentaireDtn' => null,
  1266.             'choixConge' => '2'
  1267.         ];
  1268.     }
  1269.     function verifier_solde_comptes(Conge $conge)
  1270.     {
  1271.         $entityManager $this->doctrine->getManager();
  1272.         $year $this->getYear($conge);
  1273.         $utilisateurInformation $this->getUser();
  1274.         $utilisateur $utilisateurInformation->getUtilisateur();
  1275.         $recapitulatif $entityManager
  1276.             ->getRepository(UtilisateurInformation::class)
  1277.             ->getInfos($utilisateur$year);
  1278.         if ($conge->getCongeType()->getCode() == CongeTypes::CET) {
  1279.             $soldecompte $recapitulatif['totalCet'] - $recapitulatif['givenCet'];
  1280.         } else {
  1281.             $soldecompte $recapitulatif['totalReport'] - $recapitulatif['givenRaa'];
  1282.         }
  1283.         if ($soldecompte $conge->getNbJour()) {
  1284.             return false;
  1285.         }
  1286.         return true;
  1287.     }
  1288.     public function getYear($conge)
  1289.     {
  1290.         $today = new \DateTime();
  1291.         $year $today->format("Y");
  1292.         $utilisateur $this->getUser()->getIdUtilisateur();
  1293.         $entityManager $this->doctrine->getManager();
  1294.         $utilisateurInformation $entityManager
  1295.             ->getRepository(UtilisateurInformation::class)
  1296.             ->findOneBy(["idUtilisateur" => $utilisateur]);
  1297.         if ($utilisateurInformation) {
  1298.             $idaffectation $utilisateurInformation->getIdAffectation()->getIdAffectation();
  1299.             $affectation $entityManager
  1300.                 ->getRepository(RefAffectation::class)
  1301.                 ->findOneBy(["idAffectation" => $idaffectation]);
  1302.             $getRefCalendrier =  $entityManager
  1303.                 ->getRepository(RefAffectationCalendrier::class)
  1304.                 ->getRefCalendrier($idaffectation);
  1305.             $calendrierScolaire $getRefCalendrier['calendrierScolaire'];
  1306.             $dateBasculeCongeSolaire  $getRefCalendrier['dateBascule'];
  1307.             if ($affectation) {
  1308.                 // $calendrierScolaire = $affectation->getCalendrierScolaire();
  1309.                 // $dateBasculeCong$dateBasculeCongeSolaire eSolaire = $affectation->getDateBascule();
  1310.                 if ((true === $calendrierScolaire) && ($dateBasculeCongeSolaire $today) && ($today < new \DateTime("$year-09-01"))) {
  1311.                     return $year 1;
  1312.                 } else {
  1313.                     return $year;
  1314.                 }
  1315.             }
  1316.         }
  1317.         // Si l'année n'a pas pu être obtenue à partir de l'objet Utilisateur, on retourne l'année en cours
  1318.         return $year;
  1319.     }
  1320.     #[Route(path'/api/send'name'ctsweb_sendEmail'methods: ['GET'])]
  1321.     public function sendTestEmail(MailerInterface $mailer)
  1322.     {
  1323.         chmod($this->getParameter('dir_file_rapport') . "RAA_2023_abboub_ali_vba.pdf"0644);
  1324.         $attachmentPath $this->getParameter('dir_file_rapport') . "RAA_2023_abboub_ali_vba.pdf";
  1325.         $email = (new Email())
  1326.             ->from('cts-web.assistance@sports.gouv.fr')
  1327.             ->to('dame.sall@soprasteria.com')
  1328.             ->subject('Test Email')
  1329.             ->text('This is a test email sent from Symfony 5.4.')
  1330.             //  ->attachFromPath( $this->getParameter('dir_file_rapport')."RAA_2023_abboub_ali_vba.pdf");
  1331.             ->attach(fopen($attachmentPath'r'));
  1332.         // ->attachFromPath($attachmentPath);
  1333.         $mailer->send($email);
  1334.         return new Response('Test email sent.');
  1335.     }
  1336. }