<?php
namespace App\Controller;
use App\Entity\DeclarationLigne;
use App\Form\TimesheetSearchType;
use App\Repository\DeclarationLigneRepository;
use App\Service\TimesheetCalculatorService;
use App\Service\ExcelExportService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/timesheet")
*/
class TimesheetController extends AbstractController
{
private DeclarationLigneRepository $declarationLigneRepository;
private TimesheetCalculatorService $calculatorService;
private ExcelExportService $excelExportService;
public function __construct(
DeclarationLigneRepository $declarationLigneRepository,
TimesheetCalculatorService $calculatorService,
ExcelExportService $excelExportService
) {
$this->declarationLigneRepository = $declarationLigneRepository;
$this->calculatorService = $calculatorService;
$this->excelExportService = $excelExportService;
}
/**
* @Route("/", name="timesheet_index", methods={"GET", "POST"})
*/
public function index(Request $request): Response
{
$form = $this->createForm(TimesheetSearchType::class);
$form->handleRequest($request);
$results = [];
$totals = [];
$searchParams = [];
$formSubmitted = false;
if ($form->isSubmitted() && $form->isValid()) {
$formSubmitted = true;
$searchParams = $form->getData();
// Recherche des lignes
$lignes = $this->declarationLigneRepository->searchByConducteurAndPeriod(
$searchParams['immatriculation'] ?? null,
$searchParams['nom_client'] ?? null,
$searchParams['date_debut'] ?? null,
$searchParams['date_fin'] ?? null,
$searchParams['agence'] ?? null
);
// Calcul des heures pour chaque ligne
foreach ($lignes as $ligne) {
$results[] = $this->calculatorService->calculateDay($ligne);
}
// Calcul des totaux
if (!empty($results)) {
$totals = $this->calculatorService->calculatePeriod($results);
}
}
// Données pour l'autocomplétion
$conducteurs = $this->declarationLigneRepository->findDistinctConducteurs();
$immatriculations = $this->declarationLigneRepository->findDistinctImmatriculations();
$agences = $this->declarationLigneRepository->findDistinctAgences();
return $this->render('timesheet/index.html.twig', [
'form' => $form->createView(),
'results' => $results,
'totals' => $totals,
'search_params' => $searchParams,
'conducteurs' => array_column($conducteurs, 'nom_client'),
'immatriculations' => array_column($immatriculations, 'immatriculation'),
'agences' => array_column($agences, 'agence'),
'export_url' => $this->generateUrl('timesheet_export'),
'form_submitted' => $formSubmitted,
]);
}
/**
* @Route("/export", name="timesheet_export", methods={"POST"})
*/
// public function export(Request $request): Response
// {
// // Récupérer les données du formulaire
// $formData = $request->request->all();
// // Vérifier si les données viennent du formulaire timesheet_search
// if (isset($formData['timesheet_search'])) {
// $searchData = $formData['timesheet_search'];
// $searchParams = [
// 'immatriculation' => $searchData['immatriculation'] ?? null,
// 'nom_client' => $searchData['nom_client'] ?? null,
// 'agence' => $searchData['agence'] ?? null,
// 'date_debut' => !empty($searchData['date_debut']) ?
// \DateTime::createFromFormat('Y-m-d', $searchData['date_debut']) : null,
// 'date_fin' => !empty($searchData['date_fin']) ?
// \DateTime::createFromFormat('Y-m-d', $searchData['date_fin']) : null,
// ];
// } else {
// // Fallback pour les champs cachés directs
// $searchParams = [
// 'immatriculation' => $request->request->get('immatriculation'),
// 'nom_client' => $request->request->get('nom_client'),
// 'date_debut' => $request->request->get('date_debut') ?
// \DateTime::createFromFormat('Y-m-d', $request->request->get('date_debut')) : null,
// 'date_fin' => $request->request->get('date_fin') ?
// \DateTime::createFromFormat('Y-m-d', $request->request->get('date_fin')) : null,
// 'agence' => $request->request->get('agence'),
// ];
// }
// // Debug : afficher les paramètres reçus
// error_log("Paramètres d'export reçus: " . print_r($searchParams, true));
// // Recherche des lignes avec les mêmes critères que la recherche
// $lignes = $this->declarationLigneRepository->searchByConducteurAndPeriod(
// $searchParams['immatriculation'],
// $searchParams['nom_client'],
// $searchParams['date_debut'],
// $searchParams['date_fin'],
// $searchParams['agence']
// );
// // Debug : afficher le nombre de lignes trouvées
// error_log("Nombre de lignes trouvées pour l'export: " . count($lignes));
// // Calcul des heures
// $days = [];
// foreach ($lignes as $ligne) {
// $days[] = $this->calculatorService->calculateDay($ligne);
// }
// // Debug : afficher les dates exportées
// $dates = array_map(function($day) {
// return $day['date']->format('Y-m-d');
// }, $days);
// error_log("Dates exportées: " . implode(', ', $dates));
// // Génération du fichier Excel
// $filename = sprintf(
// 'feuille_heures_%s_%s_%s.xlsx',
// $searchParams['nom_client'] ?? 'all',
// $searchParams['date_debut'] ? $searchParams['date_debut']->format('Ymd') : 'all',
// $searchParams['date_fin'] ? $searchParams['date_fin']->format('Ymd') : 'all'
// );
// return $this->excelExportService->generateTimesheetExcel($days, $filename);
// }
public function export(Request $request): Response
{
// Récupérer les données du formulaire
$formData = $request->request->all();
// Vérifier si les données viennent du formulaire timesheet_search
if (isset($formData['timesheet_search'])) {
$searchData = $formData['timesheet_search'];
$searchParams = [
'immatriculation' => $searchData['immatriculation'] ?? null,
'nom_client' => $searchData['nom_client'] ?? null,
'agence' => $searchData['agence'] ?? null,
'date_debut' => !empty($searchData['date_debut']) ?
\DateTime::createFromFormat('Y-m-d', $searchData['date_debut']) : null,
'date_fin' => !empty($searchData['date_fin']) ?
\DateTime::createFromFormat('Y-m-d', $searchData['date_fin']) : null,
];
} else {
// Fallback pour les champs cachés directs
$searchParams = [
'immatriculation' => $request->request->get('immatriculation'),
'nom_client' => $request->request->get('nom_client'),
'date_debut' => $request->request->get('date_debut') ?
\DateTime::createFromFormat('Y-m-d', $request->request->get('date_debut')) : null,
'date_fin' => $request->request->get('date_fin') ?
\DateTime::createFromFormat('Y-m-d', $request->request->get('date_fin')) : null,
'agence' => $request->request->get('agence'),
];
}
// CORRECTION CRITIQUE : Ajuster les heures des dates
if ($searchParams['date_debut'] instanceof \DateTime) {
$searchParams['date_debut']->setTime(0, 0, 0); // Début à minuit
}
if ($searchParams['date_fin'] instanceof \DateTime) {
$searchParams['date_fin']->setTime(23, 59, 59); // Fin à 23:59:59
}
// Debug : afficher les paramètres reçus
error_log("Paramètres d'export reçus: " . print_r([
'immatriculation' => $searchParams['immatriculation'],
'nom_client' => $searchParams['nom_client'],
'agence' => $searchParams['agence'],
'date_debut' => $searchParams['date_debut'] ? $searchParams['date_debut']->format('Y-m-d H:i:s') : null,
'date_fin' => $searchParams['date_fin'] ? $searchParams['date_fin']->format('Y-m-d H:i:s') : null,
], true));
// Recherche des lignes avec les mêmes critères que la recherche
$lignes = $this->declarationLigneRepository->searchByConducteurAndPeriod(
$searchParams['immatriculation'],
$searchParams['nom_client'],
$searchParams['date_debut'],
$searchParams['date_fin'],
$searchParams['agence']
);
// Debug : afficher le nombre de lignes trouvées
error_log("Nombre de lignes trouvées pour l'export: " . count($lignes));
// Afficher toutes les dates trouvées
foreach ($lignes as $index => $ligne) {
error_log("Ligne $index - Date: " . $ligne->getDateJour()->format('Y-m-d H:i:s') .
" - Immat: " . $ligne->getImmatriculation());
}
// Calcul des heures
$days = [];
foreach ($lignes as $ligne) {
$days[] = $this->calculatorService->calculateDay($ligne);
}
// Debug : afficher les dates exportées
$dates = array_map(function($day) {
return $day['date']->format('Y-m-d');
}, $days);
error_log("Dates exportées: " . implode(', ', $dates));
// Génération du fichier Excel
$filename = sprintf(
'feuille_heures_%s_%s_%s.xlsx',
$searchParams['nom_client'] ?? 'all',
$searchParams['date_debut'] ? $searchParams['date_debut']->format('Ymd') : 'all',
$searchParams['date_fin'] ? $searchParams['date_fin']->format('Ymd') : 'all'
);
return $this->excelExportService->generateTimesheetExcel($days, $filename);
}
}