src/Controller/Mouvement/ArretController.php line 726

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Mouvement;
  3. use DateTime;
  4. use App\Entity\PMotif;
  5. use App\Entity\PPiece;
  6. use App\Entity\PDossier;
  7. use App\Entity\Pemploye;
  8. use App\Entity\LContract;
  9. use App\Entity\Prubrique;
  10. use App\Entity\PPrelevement;
  11. use App\Entity\PArretTravail;
  12. use App\Entity\PPrelevementLg;
  13. use App\Entity\PArretTravailLg;
  14. use App\Controller\ApiController;
  15. use App\Service\CalculPaieService;
  16. use Doctrine\Persistence\ManagerRegistry;
  17. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  18. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\HttpFoundation\JsonResponse;
  23. use Symfony\Component\HttpFoundation\ParameterBag;
  24. use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader;
  25. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  26. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  27. #[Route('/mouvement/arret')]
  28. class ArretController extends AbstractController
  29. {
  30.     private $em;
  31.     private $calculPaieService;
  32.     private $api;
  33.     public function __construct(ManagerRegistry $doctrine CalculPaieService $calculPaieServiceApiController $api)
  34.     {
  35.         $this->em $doctrine->getManager();
  36.         $this->calculPaieService $calculPaieService;
  37.         $this->api $api;
  38.         
  39.     }
  40.     #[Route('/'name'app_mouvement_arret'options:['expose' => true])]
  41.     public function index(Request $request): Response
  42.     {
  43.         $now = new DateTime();
  44.         // Get the current date in a specific format (e.g., 'Y-m-d H:i:s')
  45.         $currentDate $now->format('Y-m');
  46.        
  47.         $dossier $request->getSession()->get('dossier');
  48.         $operations $this->api->check($this->getUser(), 'app_mouvement_arret'$this->em$request);
  49.         if(!is_array($operations)) {
  50.             return $this->redirectToRoute('app_site');  
  51.         }elseif(count($operations) == 0) {
  52.             return $this->render('includes/404.html.twig');
  53.         }
  54.         
  55.         // $queryBuilder = $this->em->createQueryBuilder()
  56.         // ->select('a.id as arret_id,p.id as employe_id,p.code as matricule,m.designation as motif,a.DateDebut as date_debut,a.dateFin as date_fin,a.dateReprise as date_rep')
  57.         // ->from(PArretTravail::class, 'a')
  58.         // ->innerJoin('a.contract', 'c')
  59.         // ->innerJoin('c.employe', 'p')
  60.         // ->innerJoin('a.motif', 'm')
  61.         // ->Where('a.active = 1')
  62.         // ->andWhere('c.dossier = :dossier')
  63.         // ->setParameter('dossier', $dossier);
  64.         // $results = $queryBuilder->getQuery()->getResult();
  65.         $pmotif $this->em->getRepository(PMotif::class)->findBy(['active' => ]);
  66.         
  67.         $queryBuilder $this->em->createQueryBuilder()
  68.         ->select('contract.id as id, p.nom as nom, p.matricule as matricule , p.prenom')
  69.         ->from(LContract::class, 'contract')
  70.         ->innerJoin('contract.employe''p')
  71.         ->innerJoin('contract.dossier''d')
  72.         ->Where('contract.active = 1')
  73.         ->andWhere('d.id = :dossier')
  74.         ->setParameter('dossier'$dossier);        // $elements = $this->em->getRepository(Prubrique::class)->findBy(['sens' => [1, -1]]);
  75.         $pemployes $queryBuilder->getQuery()->getResult();
  76.         return $this->render('mouvement/Arret/index.html.twig', [
  77.             'motifs' => $pmotif,
  78.             'operations' => $operations,
  79.             'pemployes' => $pemployes,
  80.             'date' => $currentDate,
  81.         ]);
  82.     }
  83.     #[Route('/arret_traitement'name'app_mouvement_arret_traitement'options:['expose' => true])]
  84.     public function arret_traitement(Request $request): Response
  85.     {
  86.         $startDate $request->get('datedebut');
  87.         $endDate $request->get('datefin');
  88.         $dateRanges $this->generateDateRange($startDate$endDate);    
  89.         //   dd($dateRanges);
  90.       
  91.         // test period exist : 
  92. //         $arret = $this->em->getRepository(PArretTravail::class)->add_Arret($request);
  93. // // dd($request);
  94. //         $arret_lg = $this->em->getRepository(PArretTravailLg::class)->add_Arret_lg($request,$dateRanges,$arret);
  95.         return new JsonResponse($dateRanges);        
  96.        
  97.     }
  98.     
  99.     #[Route('/arret_traitement_verification'name'arret_traitement_verification'options:['expose' => true])]
  100.     public function arret_traitement_verification(Request $request): Response
  101.     {
  102.         $id_cnt $request->get('id_emp_arret');
  103.         // $endDate = $request->get('datefin');
  104.         // $dateRanges = $this->generateDateRange($startDate, $endDate);    
  105.         // //   dd($dateRanges);
  106.     //   dd($request->get('editedData'));
  107.         // test period exist : 
  108.         foreach ($request->get('editedData') as  $sheet) {
  109.           
  110.            
  111.             $period_exist $this->period_exist($id_cnt$this->em);  
  112.             if ($period_exist) {
  113.     
  114.             foreach ($period_exist as $period) {
  115.                        
  116.                 if($sheet['period'] == $period['code']){
  117.                     $days $sheet['days'] + $period['nbr'];
  118.                     if ($days 26) {
  119.                         dd('error');
  120.                         $error 1;
  121.                         $emp $sheet[1];
  122.                         $prd $period['code'];
  123.                     }
  124.                     
  125.                 }
  126.                 
  127.             }
  128.           }
  129.         }
  130.         $arret $this->em->getRepository(PArretTravail::class)->add_Arret($request$this->getUser());
  131.         $arret_lg $this->em->getRepository(PArretTravailLg::class)->add_Arret_lg($request,$request->get('editedData'),$arret);
  132.         $this->em->flush();
  133.         return new JsonResponse($arret_lg);        
  134.        
  135.     }
  136. //     public function generateDateRange($startDate, $endDate, $sunday = null) {
  137. //     $currentPeriodeDate = new \DateTime();
  138. //     $currentPeriode = $currentPeriodeDate->modify('first day of this month');
  139. //     $date = new DateTime($startDate);
  140. //     $currentDate = new DateTime($startDate);   // 16-10-2023
  141. //     $currentDateFix = new DateTime($startDate);   // 16-10-2023
  142. //     $endDateFix = new DateTime($endDate);          // 07-11-2023
  143. //     $endDate = new DateTime($endDate);          // 07-11-2023
  144. //     $startDate = new DateTime($startDate);          // 07-11-2023
  145.    
  146. //     // dd($intervalOriginal);
  147. //     if((int)$startDate->format('m') < (int)$currentPeriode->format('m') && (int)$startDate->format('y') == (int)$currentPeriode->format('y')) {
  148. //         $interval = $currentDate->diff($currentPeriodeDate);
  149. //         // dd($interval->days);
  150. //         // dump($endDate);
  151. //         if((int)$endDate->format('m') < (int)$currentPeriode->format('m') && (int)$endDate->format('y') == (int)$currentPeriode->format('y')) {
  152. //             $interval = $currentDate->diff($endDate);
  153. //             $endDate = clone $currentPeriode;
  154. //         }
  155. //         $currentDate = clone $currentPeriode;
  156. //         // dd($currentDate, $endDate);
  157. //         $endDate->modify('+'.$interval->days.' day');
  158. //     }
  159. //     // dd($currentDate, $endDate);
  160. //     $dateRanges = [];
  161. //     $leftDays = 0;
  162. //     while ($currentDate <= $endDate) {
  163. //         $monthEndDate = clone $currentDate; // 16-10-2023
  164. //         $monthEndDateFix = clone $currentDateFix; // 16-10-2023
  165. //         $monthEndDate->modify('last day of this month'); // 31-10-2023
  166. //         $monthEndDateFix = clone $currentDateFix; // 16-10-2023
  167. //         if ($monthEndDate > $endDate) {
  168. //             $monthEndDate = $endDate;
  169. //         }
  170. //         $daysInMonth = 0;
  171. //         $daysInMonthFix = 0;
  172. //         $tmpDate = clone $currentDate;
  173. //         while ($tmpDate <= $monthEndDate) {
  174. //             if($sunday and $sunday == 1) {
  175. //                 $daysInMonth++;   
  176. //                 $tmpDate->modify('+1 day');
  177. //             } else {
  178. //                 if ($tmpDate->format('N') != 7) { // Exclude Sundays
  179. //                     $daysInMonth++;
  180. //                 }
  181. //                 $tmpDate->modify('+1 day');
  182. //             }
  183. //             $daysInMonthFix++;
  184. //         }
  185. //         $periode = $this->calculPaieService->getPeriode($currentDate->format('mY'));
  186. //         $period_my = $currentDate->format('mY');
  187. //         // $periode = $this->calculPaieService->getPeriode($currentDate->format('mY'));
  188. //         // $period_my = $currentDate->format('mY');
  189. //         if(($currentDate->format('m') == '02' && ((int)$startDate->format('m') < (int)$currentDate->format('m') or  $currentDate->format('j') == '1')  && (int)$currentDate->format('m') < (int)$endDate->format('m'))) {
  190. //             if($daysInMonth < 26 or $daysInMonth > 26) {
  191. //                 $daysInMonth = 26;
  192. //             }
  193. //         }
  194. //         elseif ($daysInMonth > 26) {
  195. //             $daysInMonth = 26;
  196. //         }
  197.       
  198. //         // dd($intervalOriginal);
  199. //         $dateRanges[] = [
  200. //             'start' => $currentDateFix->format('Y-m-d'),
  201. //             'end' => $monthEndDateFix->modify('+' . ($daysInMonthFix - 1). ' day')->format('Y-m-d'),
  202. //             'days' => $daysInMonth,
  203. //             'period' => $periode->getid(),
  204. //             'period_my' => $period_my,
  205. //         ];
  206. //         $currentDate->modify('first day of next month');
  207. //         $currentDateFix->modify('first day of next month');
  208. //         $date->modify('+1 month');
  209. //     }
  210. //     // die;
  211. //     return $dateRanges;
  212. // }
  213. public function generateDateRange($startDate$endDate$sunday null) {
  214.     $checkStartDate = new DateTime($startDate);
  215.     $checkCurrentDate = new DateTime();
  216.     $checkStartDate->modify('first day of this month');
  217.     $checkCurrentDate->modify('first day of this month');
  218.     $checkStartDate $checkStartDate->format('Y-m-d');
  219.     $checkCurrentDate $checkCurrentDate->format('Y-m-d');
  220.     $date = new DateTime();
  221.     $currentDate = new DateTime($startDate);   // 16-10-2023
  222.     $endDate = new DateTime($endDate);          // 07-11-2023
  223.     $startDate = new DateTime($startDate);
  224.     $dateRanges = [];
  225.     $daysInMonthTotal 0;
  226.     $periode $this->calculPaieService->getPeriode($date->format('mY'));
  227.     $period_my null;
  228.     
  229.     while ($currentDate <= $endDate) {
  230.         $realDate = clone $currentDate// 16-10-2023
  231.         $monthEndDate = clone $currentDate// 16-10-2023
  232.         $monthEndDate->modify('last day of this month'); // 31-10-2023
  233.         if ($monthEndDate $endDate) {
  234.             $monthEndDate $endDate;
  235.         }
  236.         $daysInMonth 0;
  237.         $tmpDate = clone $currentDate;
  238.         while ($tmpDate <= $monthEndDate) {
  239.             if($sunday and $sunday == 1) {
  240.                 $daysInMonth++;   
  241.                 $tmpDate->modify('+1 day');
  242.             } else {
  243.                 if ($tmpDate->format('N') != 7) { // Exclude Sundays
  244.                     $daysInMonth++;
  245.                 }
  246.                 $tmpDate->modify('+1 day');
  247.             }
  248.         }
  249.         // $periode = $this->calculPaieService->getPeriode($currentDate->format('mY'));
  250.         // $period_my = $currentDate->format('mY');
  251.         
  252.         if(($currentDate->format('m') == '02' && ((int)$startDate->format('m') < (int)$currentDate->format('m') or  $currentDate->format('j') == '1')  && (int)$currentDate->format('m') < (int)$endDate->format('m'))) {
  253.             if($daysInMonth 26 or $daysInMonth 26) {
  254.                 $daysInMonth 26;
  255.             }
  256.         }
  257.         elseif ($daysInMonth 26) {
  258.             $daysInMonth 26;
  259.         }
  260.         // dump($daysInMonth);
  261.         // dd($checkCurrentDate > $checkStartDate);
  262.         $break 0;
  263.         if($checkCurrentDate $checkStartDate) {
  264.             if(($daysInMonthTotal $daysInMonth) > 26) {
  265.                 if($daysInMonth $daysInMonthTotal) {
  266.                     if($daysInMonth 26) {
  267.                         $rest = ($daysInMonth $daysInMonthTotal )+ (26 $daysInMonth);
  268.                         $daysInMonth $daysInMonth $rest;
  269.                     } else {
  270.                         $rest $daysInMonth $daysInMonthTotal;
  271.                         $daysInMonth $daysInMonth $rest;
  272.                     }
  273.                    
  274.                 } else {
  275.                     // dd($daysInMonth, $daysInMonthTotal);
  276.                     $rest 26 $daysInMonthTotal;
  277.                     if($rest == 0) {
  278.                         $break 1;
  279.                     }
  280.                     $daysInMonth $daysInMonth $rest;
  281.                 }
  282.                 $daysInMonthTotal 0;
  283.                 // dd($realDate, $rest);
  284.                 if($break == 0) {
  285.                     $dateRanges[] = [
  286.                         'start' => $realDate->format('Y-m-d'),
  287.                         'end' => ($sunday and $sunday == 1) ? $this->addDays($realDate$rest 1)->format('Y-m-d') : $this->addDays($realDate$rest 1)->format('Y-m-d'),
  288.                         'days' => $rest,
  289.                         'period' => $periode->getid(),
  290.                         'period_my' => $period_my,
  291.                     ];
  292.                     $realDate->modify('+1 day');
  293.                 }
  294.                 $date->modify('+1 month');
  295.                 // dd($realDateEnd);
  296.                 
  297.                 // $startRealDate->modify('+1 day');
  298.             }
  299.             $daysInMonthTotal += $daysInMonth;
  300.         }
  301.         
  302.        
  303.         // dd($daysInMonthTotal);
  304.         $periode $this->calculPaieService->getPeriode($date->format('mY'));
  305.         $period_my $date->format('mY');
  306.         $dateRanges[] = [
  307.             'start' => $realDate->format('Y-m-d'),
  308.             'end' => $monthEndDate->format('Y-m-d'),
  309.             'days' => $daysInMonth,
  310.             'period' => $periode->getid(),
  311.             'period_my' => $period_my,
  312.         ];
  313.         // $realDate->modify('+1 day');
  314.         // dd($dateRanges);
  315.         $currentDate->modify('first day of next month');
  316.         if($checkCurrentDate <= $checkStartDate) {
  317.             $date->modify('+1 month');
  318.         }
  319.     }
  320.     // die;
  321.     // $mergedData = [];
  322.     // foreach ($dateRanges as $item) {
  323.     //     $period_my = $item["period_my"];
  324.     //     if (!isset($mergedData[$period_my])) {
  325.     //         // If the period_my is not already in the merged array, add it
  326.     //         $mergedData[$period_my] = $item;
  327.     //     } else {
  328.     //         // If the period_my is already in the merged array, update the "end" and "days" values
  329.     //         $mergedData[$period_my]["end"] = $item["end"];
  330.     //         $mergedData[$period_my]["days"] += $item["days"];
  331.     //     }
  332.     // }
  333.     // $mergedData = array_values($mergedData);
  334.     // dd($mergedData);
  335.     return $dateRanges;
  336. }
  337.     public function period_exist($emp_id,$em) {
  338.         $query "SELECT SUM(parret_travail_lg.nombre_jour) as nbr,periode.id,periode.code as code 
  339.         FROM `parret_travail_lg` 
  340.                     INNER JOIN parret_travail ON parret_travail_lg.arret_travail_id=parret_travail.id
  341.                     INNER JOIN lcontract ON lcontract.id=parret_travail.contract_id
  342.                     INNER JOIN periode ON periode.id=parret_travail_lg.periode_id 
  343.                     where lcontract.id=$emp_id and parret_travail.active = 1 and parret_travail_lg.active = 1  group BY periode.id";
  344.                         $stmt $em->getConnection()->prepare($query);
  345.                         $newstmt $stmt->executeQuery();   
  346.                         $result $newstmt->fetchAll();
  347.                         // dd($result);
  348.         return $result;
  349.                     
  350.     }
  351. //       public function generateDateRange($startDate, $endDate) {
  352. //     $currentDate = new DateTime($startDate);
  353. //     $endDate = new DateTime($endDate);
  354. //     $dateRanges = [];
  355. //     while ($currentDate <= $endDate) {
  356. //         $monthEndDate = clone $currentDate;
  357. //         $monthEndDate->modify('last day of this month');
  358. //         if ($monthEndDate > $endDate) {
  359. //             $monthEndDate = $endDate;
  360. //         }
  361. //         // Calculate the number of days excluding Sundays
  362. //         $daysInMonth = 0;
  363. //         while ($currentDate <= $monthEndDate) {
  364. //             if ($currentDate->format('N') != 7) { // Exclude Sunday (7)
  365. //                 $daysInMonth++;
  366. //             }
  367. //             $currentDate->modify('+1 day');
  368. //         }
  369. //         // Check if the days in the month exceed 26, if so, move to the next period
  370. //         if ($daysInMonth > 26) {
  371. //             // You need to determine how many days to move to the next period
  372. //             $daysToMove = $daysInMonth - 26;
  373. //             // Adjust the $endDate accordingly
  374. //             $endDate->modify('+' . $daysToMove . ' days');
  375. //         }
  376. //         // Get the period for the current month
  377. //         $periode = $this->calculPaieService->getPeriode($currentDate->format('mY'));
  378. //         $dateRanges[] = [
  379. //             'start' => $currentDate->format('Y-m-d'),
  380. //             'end' => $monthEndDate->format('Y-m-d'),
  381. //             'days' => $daysInMonth,
  382. //             'period' => $periode->getid(),
  383. //         ];
  384. //         // Move to the next month
  385. //         $currentDate->modify('first day of next month');
  386. //     }
  387. //     return $dateRanges;
  388. // }
  389.     // }
  390.    
  391.  
  392. #[Route('/arret_canvas'name'app_mouvement_arret_mass_canvas'options:['expose' => true])]
  393. public function epreuveCanvas() {
  394.     $spreadsheet = new Spreadsheet();
  395.     $sheet $spreadsheet->getActiveSheet();
  396.     $sheet->setCellValue('A1''ID_Motif');
  397.     $sheet->setCellValue('B1''Id_Contract');
  398.     $sheet->setCellValue('C1''Date arret');
  399.     $sheet->setCellValue('D1''Fin Previsionnelle');
  400.     $sheet->setCellValue('E1''Reprise de travail ');
  401.   
  402.     $writer = new Xlsx($spreadsheet);
  403.     $fileName 'canvas_arret.xlsx';
  404.     $temp_file tempnam(sys_get_temp_dir(), $fileName);
  405.     $writer->save($temp_file);
  406.     return $this->file($temp_file$fileNameResponseHeaderBag::DISPOSITION_INLINE);
  407. }
  408. #[Route('/app_mouvement_arret_mass_canvas_retard'name'app_mouvement_arret_mass_canvas_retard'options:['expose' => true])]
  409. public function app_mouvement_arret_mass_canvas_retard() {
  410.     $spreadsheet = new Spreadsheet();
  411.     $sheet $spreadsheet->getActiveSheet();
  412.     $sheet->setCellValue('A1''Id_Contract');
  413.     $sheet->setCellValue('B1''Nombre de jours');
  414.   
  415.     $writer = new Xlsx($spreadsheet);
  416.     $fileName 'canvas_retard.xlsx';
  417.     $temp_file tempnam(sys_get_temp_dir(), $fileName);
  418.     $writer->save($temp_file);
  419.     return $this->file($temp_file$fileNameResponseHeaderBag::DISPOSITION_INLINE);
  420. }
  421. #[Route('/arret_canvas_motif'name'app_mouvement_arret_mass_canvas_motif'options:['expose' => true])]
  422. public function epreuveCanvas_motif() {
  423.   
  424.    
  425.     $count 0;
  426.     $spreadsheet = new Spreadsheet();
  427.     $sheet $spreadsheet->getActiveSheet();
  428.     $sheet->setCellValue('A1''ID_Motif');
  429.     $sheet->setCellValue('B1''Designation');
  430.     $i=2;
  431.     $pmotifs $this->em->getRepository(PMotif::class)->findBy(['active' => 1]);
  432.     
  433.     foreach ($pmotifs as $motif) {
  434.                   
  435.         $sheet->setCellValue('A'.$i$motif->getId());
  436.         $sheet->setCellValue('B'.$i$motif->getDesignation());
  437.     
  438.         $i++;
  439.         $count++;
  440.     }
  441.   
  442.     $writer = new Xlsx($spreadsheet);
  443.     $fileName 'canvas_Motif.xlsx';
  444.     $temp_file tempnam(sys_get_temp_dir(), $fileName);
  445.     $writer->save($temp_file);
  446.     return $this->file($temp_file$fileNameResponseHeaderBag::DISPOSITION_INLINE);
  447. }
  448. #[Route('/upload_arret'name'app_mouvement_arret_mass_upload'options: ['expose' => true])]
  449.     public function app_mouvement_arret_mass_upload(Request $request ): Response
  450.     {
  451.         // $dossier = $this->em->getRepository(PDossier::class)->find($request->get('dossier'));
  452.         $dossier $request->getSession()->get('dossier');
  453.         $error 0;
  454.         $prd '';
  455.         $reader = new Reader();
  456.         $spreadsheet $reader->load($request->files->get('file'));
  457.         $reader->setReadDataOnly(true); 
  458.         $reader->setReadEmptyCells(false);
  459.         $period $request->get('period');
  460.         $worksheet $spreadsheet->getActiveSheet();
  461.         $spreadSheetArys $worksheet->toArray();
  462.         unset($spreadSheetArys[0]);
  463.         $array = [];
  464.         // dd($spreadSheetArys);
  465.         $count 0;
  466.         foreach ($spreadSheetArys as $key => $sheet) {
  467.       
  468.             $startDate = new \DateTime($sheet[2]);
  469.             $startDate $startDate->format('Y-m-d');
  470.             // $parsedDate = strtotime($startDate);
  471.             // if ($parsedDate !== false) {
  472.             // }
  473.             $endDate = new \DateTime($sheet[3]);
  474.             $endDate $endDate->format('Y-m-d');
  475.             // $parsedDate = strtotime($endDate);
  476.             // if ($parsedDate !== false) {
  477.             // }
  478.             // if($sheet[1] == 1910) {
  479.             //     dd($startDate, $endDate);
  480.             // }
  481.             $dateRanges $this->generateDateRange($startDate$endDate$sheet[5]);  
  482.             // dd($dateRanges);
  483.             $period_exist $this->period_exist($sheet[1], $this->em);  
  484.             if ($period_exist) {
  485.                 foreach ($period_exist as $period) {
  486.                         foreach ($dateRanges as $date) {
  487.                         
  488.                             if($date['period'] == $period['id']){
  489.                                 $days $date['days'] + $period['nbr'];
  490.                                 if ($days 26) {
  491.                                     $error 1;
  492.                                     $emp $sheet[1];
  493.                                     $prd $period['code'];
  494.                                 }
  495.                                 
  496.                             }
  497.                             
  498.                         }
  499.                 }
  500.             }
  501.             $motif $this->em->getRepository(PMotif::class)->find($sheet[0]);
  502.             if (!$motif) {
  503.                 $error 2;
  504.             }
  505.         }
  506.         if($error == 0){
  507.             // dd($spreadSheetArys);
  508.             foreach ($spreadSheetArys as $key => $sheet) {
  509.                 $newArray = [];
  510.             
  511.             
  512.                 $newArray = new ParameterBag([
  513.                     "id_emp_arret" => $sheet[1], // Combine elements 0 and 1
  514.                     "motif_id" => $sheet[0], // Element 2
  515.                     "datedebut" => date('Y-m-d'strtotime($sheet[2])), // Format date for element 3
  516.                     "datefin" => date('Y-m-d'strtotime($sheet[3])), // Format date for element 4
  517.                     "datereprise" => date('Y-m-d'strtotime($sheet[4])), 
  518.                 ]);
  519.                 $startDate $sheet[2];
  520.                 $endDate $sheet[3];
  521.                 $dateRanges $this->generateDateRange($startDate$endDate$sheet[5]);  
  522.                 $period_exist $this->period_exist($newArray->get('id_emp_arret'), $this->em);  
  523.                 
  524.                 $arret $this->em->getRepository(PArretTravail::class)->add_Arret($newArray$this->getUser());
  525.                 // if(count($dateRanges) == 0) {
  526.                 //     dd($dateRanges, $sheet[1], date('Y-m-d', strtotime($sheet[2])), date('Y-m-d', strtotime($sheet[3])));
  527.                 // } 
  528.                 $arretlg $this->em->getRepository(PArretTravailLg::class)->add_Arret_lg($newArray,$dateRanges,$arret);
  529.                 }
  530.                 $this->em->flush();
  531.             }
  532.         else if($error == 2){
  533.             return new JsonResponse('Motif ID '$sheet[0] .' n\'existe pas.'500);
  534.         }
  535.         else{
  536.             // dd($employe->getcode());
  537.             return new JsonResponse('L employe avec le matricule'.$emp.' a plusieurs de 26 jrs periode  '.$prd500);
  538.         }
  539.         return new JsonResponse('ok');
  540.     }
  541. #[Route('/app_mouvement_arret_mass_upload_retard'name'app_mouvement_arret_mass_upload_retard'options: ['expose' => true])]
  542.     public function app_mouvement_arret_mass_upload_retard(Request $request ): Response
  543.     {
  544.         $reader = new Reader();
  545.         $spreadsheet $reader->load($request->files->get('file'));
  546.         $periode $request->get('period');
  547.         $date = new \DateTime($periode);
  548.         $periode $this->calculPaieService->getPeriode($date->format('mY'));
  549.         $worksheet $spreadsheet->getActiveSheet();
  550.         $spreadSheetArys $worksheet->toArray();
  551.         unset($spreadSheetArys[0]);
  552.         // dd($spreadSheetArys);
  553.         $motif $this->em->getRepository(PMotif::class)->find(13);
  554.         foreach ($spreadSheetArys as $key => $sheet) {
  555.             $contract $this->em->getRepository(LContract::class)->findOneBy(['id' => $sheet[0], 'active' => true]);
  556.             if(!$contract) {
  557.                 return new JsonResponse('Contrat introuvable à la ligne '.($key 1).' !'500);                
  558.             } 
  559.             $arretTravail = new PArretTravail();
  560.             $arretTravail->setContract($contract);
  561.             $arretTravail->setMotif($motif);
  562.             $this->em->persist($arretTravail);
  563.             
  564.             $arretTravailLg = new PArretTravailLg();
  565.             $arretTravailLg->setArretTravail($arretTravail);
  566.             $arretTravailLg->setPeriode($periode);
  567.             $arretTravailLg->setNombreJour($sheet[1]);
  568.             
  569.             $this->em->persist($arretTravailLg);
  570.             
  571.         }
  572.         $this->em->flush();
  573.         return new JsonResponse('Bien enregistrer');
  574.     }
  575.     
  576.     #[Route('/parret_aff'name'app_parret_aff'options: ['expose' => true])]
  577.     public function app_parret_aff(Request $request): Response
  578.     {
  579.         $draw $request->query->get('draw');
  580.         $start $request->query->get('start') ?? 0;
  581.         $length $request->query->get('length') ?? 10;
  582.         $search $request->query->all('search')["value"];
  583.         $orderColumnIndex $request->query->all('order')[0]['column'];
  584.         $orderColumn $request->query->all("columns")[$orderColumnIndex]['name'];
  585.         $orderDir $request->query->all('order')[0]['dir'] ?? 'asc';
  586.         $dossier $request->getSession()->get('dossier');
  587.         // dd($dossier);
  588.         $queryBuilder $this->em->createQueryBuilder()
  589.         ->select('a.id as arret_id,p.id as employe_id,p.nom,p.prenom,
  590.         p.code as matricule,m.designation as motif,a.DateDebut as date_debut,a.dateFin as date_fin,a.dateReprise as date_rep')
  591.         ->from(PArretTravail::class, 'a')
  592.         ->innerJoin('a.contract''c')
  593.         ->innerJoin('c.employe''p')
  594.         ->innerJoin('a.motif''m')
  595.         ->Where('a.active = 1')
  596.         ->andWhere('c.dossier = :dossier')
  597.         ->setParameter('dossier'$dossier);
  598.       
  599.         if (!empty($search)) {
  600.             $queryBuilder->andWhere('(a.id LIKE :search OR p.id LIKE :search OR m.designation LIKE :search OR p.nom LIKE :search OR p.prenom LIKE :search
  601.              OR  a.DateDebut LIKE :search OR a.dateFin LIKE :search OR a.dateReprise LIKE :search OR p.code LIKE :search)')
  602.                 ->setParameter('search'"%$search%");
  603.         }
  604.         if (!empty($orderColumn)) {
  605.             $queryBuilder->orderBy("$orderColumn"$orderDir);
  606.         }
  607.         $filteredRecords count($queryBuilder->getQuery()->getResult());
  608.         // Paginate results
  609.         $queryBuilder->setFirstResult($start)
  610.             ->setMaxResults($length);
  611.         $results $queryBuilder->getQuery()->getResult();
  612.     // dd($results);
  613.         
  614.         // dd($results);
  615.         $totalRecords $this->em->createQueryBuilder()
  616.         ->select('COUNT(a.id)')
  617.         ->from(PArretTravail::class, 'a')
  618.         ->innerJoin('a.contract''c')
  619.         ->innerJoin('c.employe''p')
  620.         ->innerJoin('a.motif''m')
  621.         ->Where('a.active = 1')
  622.         ->andWhere('c.dossier = :dossier')
  623.         ->setParameter('dossier'$dossier)
  624.         ->getQuery()
  625.         ->getSingleScalarResult();
  626.         return new JsonResponse([
  627.             'draw' => $draw,
  628.             'recordsTotal' => $totalRecords,
  629.             'recordsFiltered' => $filteredRecords,
  630.             'data' => $results,
  631.         ]);
  632.     }
  633.     #[Route('/parret_aff_details/{code}'name'app_parret_aff_details'options: ['expose' => true])]
  634.     public function app_parret_aff_details($code): Response
  635.     {
  636.         // dd($code)
  637.         $arret $this->em->getRepository(PArretTravail:: class)->find(['id' => $code]);
  638.         // dd($arret->getActiveArretTravailLgs());
  639.         $html $this->renderView('mouvement/Arret/includes/arret_detail.html.twig', ['arret' => $arret'arretLgs' => $arret->getArretTravailLgs()]);
  640.         // $html = $this->renderView('mouvement/Arret/includes/arret_detail.html.twig', ['arret' => $arret, 'arretLgs' => $arret->getActiveArretTravailLgs()]);
  641.        return new JsonResponse($html);
  642.         
  643. }
  644.    
  645.     #[Route('/parret_lg_desactiver/{code}'name'app_parret_lg_desactiver'options: ['expose' => true])]
  646.     public function app_parret_lg_desactiver($code): Response
  647.     {
  648.         // dd($code)
  649.         $arret $this->em->getRepository(PArretTravailLg:: class)->desactiver($code$this->getUser());
  650.         // dd($arret->getActiveArretTravailLgs());
  651.         // $html = $this->renderView('mouvement/Arret/includes/arret_detail.html.twig', ['arret' => $arret, 'arretLgs' => $arret->getActiveArretTravailLgs()]);
  652.        return new JsonResponse($arret);
  653.         
  654.     }
  655.     function addDays($start_date$days_to_add$sunday null) {
  656.         $current_date $start_date;
  657.         // $interval = new \DateInterval('P1D');  // P1D represents a period of 1 day
  658.         // dd($sunday);
  659.         // $i = 1;
  660.         while ($days_to_add 0) {
  661.             if(is_null($sunday)) {
  662.                 if( $current_date->format('N') != 7) {
  663.                     $days_to_add--;
  664.                 }
  665.             } else {
  666.                 
  667.                 $days_to_add--;
  668.             }
  669.             // if ($current_date->format('N') != 7 && is_null($sunday)) {  // Check if it's not a Sunday (Monday is 1, Sunday is 7)
  670.             //     $days_to_add--;
  671.             // }
  672.             // dd($days_to_add);     
  673.             $current_date->modify('+1 day');
  674.             if ($current_date->format('N') == && is_null($sunday) && $days_to_add == 0) {
  675.                 $current_date->modify('+1 day');
  676.             }
  677.         }
  678.         // dd($i, $originalDays);
  679.         return $current_date;
  680.     }
  681.    
  682. }