src/Controller/TimesheetController.php line 38

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\DeclarationLigne;
  4. use App\Form\TimesheetSearchType;
  5. use App\Repository\DeclarationLigneRepository;
  6. use App\Service\TimesheetCalculatorService;
  7. use App\Service\ExcelExportService;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpFoundation\StreamedResponse;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. /**
  14.  * @Route("/timesheet")
  15.  */
  16. class TimesheetController extends AbstractController
  17. {
  18.     private DeclarationLigneRepository $declarationLigneRepository;
  19.     private TimesheetCalculatorService $calculatorService;
  20.     private ExcelExportService $excelExportService;
  21.     
  22.     public function __construct(
  23.         DeclarationLigneRepository $declarationLigneRepository,
  24.         TimesheetCalculatorService $calculatorService,
  25.         ExcelExportService $excelExportService
  26.     ) {
  27.         $this->declarationLigneRepository $declarationLigneRepository;
  28.         $this->calculatorService $calculatorService;
  29.         $this->excelExportService $excelExportService;
  30.     }
  31.     
  32.     /**
  33.      * @Route("/", name="timesheet_index", methods={"GET", "POST"})
  34.      */
  35.     public function index(Request $request): Response
  36.     {
  37.         $form $this->createForm(TimesheetSearchType::class);
  38.         $form->handleRequest($request);
  39.         
  40.         $results = [];
  41.         $totals = [];
  42.         $searchParams = [];
  43.         $formSubmitted false;
  44.         if ($form->isSubmitted() && $form->isValid()) {
  45.              $formSubmitted true;
  46.             $searchParams $form->getData();
  47.             
  48.             // Recherche des lignes
  49.             $lignes $this->declarationLigneRepository->searchByConducteurAndPeriod(
  50.                 $searchParams['immatriculation'] ?? null,
  51.                 $searchParams['nom_client'] ?? null,
  52.                 $searchParams['date_debut'] ?? null,
  53.                 $searchParams['date_fin'] ?? null,
  54.                 $searchParams['agence'] ?? null
  55.             );
  56.             
  57.             // Calcul des heures pour chaque ligne
  58.             foreach ($lignes as $ligne) {
  59.                 $results[] = $this->calculatorService->calculateDay($ligne);
  60.             }
  61.             
  62.             // Calcul des totaux
  63.             if (!empty($results)) {
  64.                 $totals $this->calculatorService->calculatePeriod($results);
  65.             }
  66.         }
  67.         
  68.         // Données pour l'autocomplétion
  69.         $conducteurs $this->declarationLigneRepository->findDistinctConducteurs();
  70.         $immatriculations $this->declarationLigneRepository->findDistinctImmatriculations();
  71.         $agences $this->declarationLigneRepository->findDistinctAgences();
  72.         
  73.         return $this->render('timesheet/index.html.twig', [
  74.             'form' => $form->createView(),
  75.             'results' => $results,
  76.             'totals' => $totals,
  77.             'search_params' => $searchParams,
  78.             'conducteurs' => array_column($conducteurs'nom_client'),
  79.             'immatriculations' => array_column($immatriculations'immatriculation'),
  80.             'agences' => array_column($agences'agence'),
  81.             'export_url' => $this->generateUrl('timesheet_export'), 
  82.             'form_submitted' => $formSubmitted
  83.         ]);
  84.     }
  85.     
  86.  
  87.  
  88. /**
  89.  * @Route("/export", name="timesheet_export", methods={"POST"})
  90.  */
  91. // public function export(Request $request): Response
  92. // {
  93. //     // Récupérer les données du formulaire
  94. //     $formData = $request->request->all();
  95.     
  96. //     // Vérifier si les données viennent du formulaire timesheet_search
  97. //     if (isset($formData['timesheet_search'])) {
  98. //         $searchData = $formData['timesheet_search'];
  99.         
  100. //         $searchParams = [
  101. //             'immatriculation' => $searchData['immatriculation'] ?? null,
  102. //             'nom_client' => $searchData['nom_client'] ?? null,
  103. //             'agence' => $searchData['agence'] ?? null,
  104. //             'date_debut' => !empty($searchData['date_debut']) ? 
  105. //                 \DateTime::createFromFormat('Y-m-d', $searchData['date_debut']) : null,
  106. //             'date_fin' => !empty($searchData['date_fin']) ? 
  107. //                 \DateTime::createFromFormat('Y-m-d', $searchData['date_fin']) : null,
  108. //         ];
  109. //     } else {
  110. //         // Fallback pour les champs cachés directs
  111. //         $searchParams = [
  112. //             'immatriculation' => $request->request->get('immatriculation'),
  113. //             'nom_client' => $request->request->get('nom_client'),
  114. //             'date_debut' => $request->request->get('date_debut') ? 
  115. //                 \DateTime::createFromFormat('Y-m-d', $request->request->get('date_debut')) : null,
  116. //             'date_fin' => $request->request->get('date_fin') ? 
  117. //                 \DateTime::createFromFormat('Y-m-d', $request->request->get('date_fin')) : null,
  118. //             'agence' => $request->request->get('agence'),
  119. //         ];
  120. //     }
  121.     
  122. //     // Debug : afficher les paramètres reçus
  123. //     error_log("Paramètres d'export reçus: " . print_r($searchParams, true));
  124.     
  125. //     // Recherche des lignes avec les mêmes critères que la recherche
  126. //     $lignes = $this->declarationLigneRepository->searchByConducteurAndPeriod(
  127. //         $searchParams['immatriculation'],
  128. //         $searchParams['nom_client'],
  129. //         $searchParams['date_debut'],
  130. //         $searchParams['date_fin'],
  131. //         $searchParams['agence']
  132. //     );
  133.     
  134. //     // Debug : afficher le nombre de lignes trouvées
  135. //     error_log("Nombre de lignes trouvées pour l'export: " . count($lignes));
  136.     
  137. //     // Calcul des heures
  138. //     $days = [];
  139. //     foreach ($lignes as $ligne) {
  140. //         $days[] = $this->calculatorService->calculateDay($ligne);
  141. //     }
  142.     
  143. //     // Debug : afficher les dates exportées
  144. //     $dates = array_map(function($day) {
  145. //         return $day['date']->format('Y-m-d');
  146. //     }, $days);
  147. //     error_log("Dates exportées: " . implode(', ', $dates));
  148.     
  149. //     // Génération du fichier Excel
  150. //     $filename = sprintf(
  151. //         'feuille_heures_%s_%s_%s.xlsx',
  152. //         $searchParams['nom_client'] ?? 'all',
  153. //         $searchParams['date_debut'] ? $searchParams['date_debut']->format('Ymd') : 'all',
  154. //         $searchParams['date_fin'] ? $searchParams['date_fin']->format('Ymd') : 'all'
  155. //     );
  156.     
  157. //     return $this->excelExportService->generateTimesheetExcel($days, $filename);
  158. // }
  159. public function export(Request $request): Response
  160. {
  161.     // Récupérer les données du formulaire
  162.     $formData $request->request->all();
  163.     
  164.     // Vérifier si les données viennent du formulaire timesheet_search
  165.     if (isset($formData['timesheet_search'])) {
  166.         $searchData $formData['timesheet_search'];
  167.         
  168.         $searchParams = [
  169.             'immatriculation' => $searchData['immatriculation'] ?? null,
  170.             'nom_client' => $searchData['nom_client'] ?? null,
  171.             'agence' => $searchData['agence'] ?? null,
  172.             'date_debut' => !empty($searchData['date_debut']) ? 
  173.                 \DateTime::createFromFormat('Y-m-d'$searchData['date_debut']) : null,
  174.             'date_fin' => !empty($searchData['date_fin']) ? 
  175.                 \DateTime::createFromFormat('Y-m-d'$searchData['date_fin']) : null,
  176.         ];
  177.     } else {
  178.         // Fallback pour les champs cachés directs
  179.         $searchParams = [
  180.             'immatriculation' => $request->request->get('immatriculation'),
  181.             'nom_client' => $request->request->get('nom_client'),
  182.             'date_debut' => $request->request->get('date_debut') ? 
  183.                 \DateTime::createFromFormat('Y-m-d'$request->request->get('date_debut')) : null,
  184.             'date_fin' => $request->request->get('date_fin') ? 
  185.                 \DateTime::createFromFormat('Y-m-d'$request->request->get('date_fin')) : null,
  186.             'agence' => $request->request->get('agence'),
  187.         ];
  188.     }
  189.     
  190.     // CORRECTION CRITIQUE : Ajuster les heures des dates
  191.     if ($searchParams['date_debut'] instanceof \DateTime) {
  192.         $searchParams['date_debut']->setTime(000); // Début à minuit
  193.     }
  194.     
  195.     if ($searchParams['date_fin'] instanceof \DateTime) {
  196.         $searchParams['date_fin']->setTime(235959); // Fin à 23:59:59
  197.     }
  198.     
  199.     // Debug : afficher les paramètres reçus
  200.     error_log("Paramètres d'export reçus: " print_r([
  201.         'immatriculation' => $searchParams['immatriculation'],
  202.         'nom_client' => $searchParams['nom_client'],
  203.         'agence' => $searchParams['agence'],
  204.         'date_debut' => $searchParams['date_debut'] ? $searchParams['date_debut']->format('Y-m-d H:i:s') : null,
  205.         'date_fin' => $searchParams['date_fin'] ? $searchParams['date_fin']->format('Y-m-d H:i:s') : null,
  206.     ], true));
  207.     
  208.     // Recherche des lignes avec les mêmes critères que la recherche
  209.     $lignes $this->declarationLigneRepository->searchByConducteurAndPeriod(
  210.         $searchParams['immatriculation'],
  211.         $searchParams['nom_client'],
  212.         $searchParams['date_debut'],
  213.         $searchParams['date_fin'],
  214.         $searchParams['agence']
  215.     );
  216.     
  217.     // Debug : afficher le nombre de lignes trouvées
  218.     error_log("Nombre de lignes trouvées pour l'export: " count($lignes));
  219.     
  220.     // Afficher toutes les dates trouvées
  221.     foreach ($lignes as $index => $ligne) {
  222.         error_log("Ligne $index - Date: " $ligne->getDateJour()->format('Y-m-d H:i:s') . 
  223.                  " - Immat: " $ligne->getImmatriculation());
  224.     }
  225.     
  226.     // Calcul des heures
  227.     $days = [];
  228.     foreach ($lignes as $ligne) {
  229.         $days[] = $this->calculatorService->calculateDay($ligne);
  230.     }
  231.     
  232.     // Debug : afficher les dates exportées
  233.     $dates array_map(function($day) {
  234.         return $day['date']->format('Y-m-d');
  235.     }, $days);
  236.     error_log("Dates exportées: " implode(', '$dates));
  237.     
  238.     // Génération du fichier Excel
  239.     $filename sprintf(
  240.         'feuille_heures_%s_%s_%s.xlsx',
  241.         $searchParams['nom_client'] ?? 'all',
  242.         $searchParams['date_debut'] ? $searchParams['date_debut']->format('Ymd') : 'all',
  243.         $searchParams['date_fin'] ? $searchParams['date_fin']->format('Ymd') : 'all'
  244.     );
  245.     
  246.     return $this->excelExportService->generateTimesheetExcel($days$filename);
  247. }
  248. }