<?php
// src/Controller/UploadProcessController.php
namespace App\Controller;
use App\Entity\DeclarationConducteur;
use App\Entity\DeclarationLigne;
use App\Entity\UploadBatch;
use App\Service\Project2ApiClient;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class UploadProcessController extends AbstractController
{
private EntityManagerInterface $em;
private string $projectDir;
private Project2ApiClient $apiClient;
public function __construct(
EntityManagerInterface $em,
ParameterBagInterface $parameterBag,
Project2ApiClient $apiClient
) {
$this->em = $em;
$this->projectDir = $parameterBag->get('kernel.project_dir');
$this->apiClient = $apiClient;
}
/**
* @Route("/upload/process/{id}", name="upload_process", methods={"POST"})
*/
public function process(UploadBatch $batch): JsonResponse
{
try {
if (!in_array($batch->getStatus(), ['uploaded', 'error'])) {
return $this->json(['error' => 'Document déjà traité'], 400);
}
$batch->setStatus('processing');
$this->em->flush();
$filePath = $this->projectDir . '/public/uploads/' . $batch->getStoredFilename();
if (!file_exists($filePath)) {
throw new \Exception('Fichier non trouvé: ' . $filePath);
}
// Créer un objet UploadedFile simulé pour l'API
$file = new \Symfony\Component\HttpFoundation\File\File($filePath);
$uploadedFile = new \Symfony\Component\HttpFoundation\File\UploadedFile(
$filePath,
$batch->getOriginalFilename(),
$batch->getMimeType(),
null,
true
);
// Appeler l'API
$extractedData = $this->apiClient->extractDataFromFile(
$uploadedFile,
$batch->getOriginalFilename()
);
// Vérifier que les données sont valides
if (empty($extractedData) || !isset($extractedData['lignes'])) {
throw new \Exception('Données extraites invalides depuis l\'API');
}
// Stocker en session
$this->get('session')->set('extracted_data_' . $batch->getId(), [
'raw_data' => $extractedData,
'batch_id' => $batch->getId(),
'timestamp' => time(),
'source' => 'project2_api'
]);
// Créer la déclaration
$declaration = $this->createDeclarationFromExtractedData($batch, $extractedData);
$this->em->persist($declaration);
$this->em->flush();
$batch->setStatus('processed');
$this->em->flush();
return $this->json([
'success' => true,
'message' => 'Extraction réussie via API. ' . count($extractedData['lignes']) . ' lignes détectées.',
'redirect' => $this->generateUrl('upload_review', ['id' => $batch->getId()]),
'stats' => [
'tables' => count($extractedData['lignes']),
'lines' => count($extractedData['lignes']),
'confidence' => $extractedData['confidence'] ?? 0
]
]);
} catch (\Exception $e) {
$batch->setStatus('error');
$this->em->flush();
error_log('Erreur traitement via API: ' . $e->getMessage());
return $this->json([
'success' => false,
'error' => 'Erreur: ' . $e->getMessage(),
'details' => $this->getParameter('kernel.debug') ? $e->getTraceAsString() : null
], 500);
}
}
/**
* Crée une déclaration à partir des données extraites
*/
private function createDeclarationFromExtractedData(UploadBatch $batch, array $extractedData): DeclarationConducteur
{
$declaration = new DeclarationConducteur();
$declaration->setUploadBatch($batch);
$declaration->setStatus('draft');
$declaration->setAgence($extractedData['agence'] ?? null);
$declaration->setImmatriculation($extractedData['immatriculation'] ?? null);
$declaration->setNumeroLicence($extractedData['numero_licence'] ?? null);
$declaration->setNomClient($extractedData['nom_client'] ?? null);
if (isset($extractedData['date_debut']) && $extractedData['date_debut']) {
$declaration->setDateDebut($this->parseDate($extractedData['date_debut']));
}
if (isset($extractedData['date_fin']) && $extractedData['date_fin']) {
$declaration->setDateFin($this->parseDate($extractedData['date_fin']));
}
// Ajouter les lignes
foreach ($extractedData['lignes'] ?? [] as $ligneData) {
$ligne = $this->createLigneFromData($declaration, $ligneData);
$declaration->addLigne($ligne);
}
return $declaration;
}
/**
* Crée une ligne à partir des données
*/
private function createLigneFromData(DeclarationConducteur $declaration, array $ligneData): DeclarationLigne
{
$ligne = new DeclarationLigne();
$ligne->setDeclaration($declaration);
$ligne->setAgence($declaration->getAgence());
$ligne->setImmatriculation($declaration->getImmatriculation());
$ligne->setNomClient($declaration->getNomClient());
if (isset($ligneData['date']) && $ligneData['date']) {
$parsedDate = $this->parseDate($ligneData['date']);
if ($parsedDate) {
$ligne->setDateJour($parsedDate);
}
}
$ligne->setLieuDepart($ligneData['lieu_depart'] ?? null);
$ligne->setKmDepart($ligneData['km_depart'] ?? null);
$ligne->setTranche1MatinDebut($ligneData['tranche_1_matin_debut'] ?? $ligneData['matin_debut'] ?? null);
$ligne->setTranche1MatinFin($ligneData['tranche_1_matin_fin'] ?? $ligneData['matin_fin'] ?? null);
$ligne->setTranche2MidiDebut($ligneData['tranche_2_midi_debut'] ?? $ligneData['midi_debut'] ?? null);
$ligne->setTranche2MidiFin($ligneData['tranche_2_midi_fin'] ?? $ligneData['midi_fin'] ?? null);
$ligne->setTranche3SoirDebut($ligneData['tranche_3_soir_debut'] ?? $ligneData['soir_debut'] ?? null);
$ligne->setTranche3SoirFin($ligneData['tranche_3_soir_fin'] ?? $ligneData['soir_fin'] ?? null);
$ligne->setTranche4AutreDebut($ligneData['tranche_4_autre_debut'] ?? null);
$ligne->setTranche4AutreFin($ligneData['tranche_4_autre_fin'] ?? null);
$ligne->setLieuArrivee($ligneData['lieu_arrivee'] ?? null);
$ligne->setKmArrivee($ligneData['km_arrivee'] ?? null);
$ligne->setTempsAnnexes($ligneData['temps_annexes'] ?? null);
$ligne->setTempsTotal($ligneData['temps_total'] ?? null);
$ligne->setCommentaires($ligneData['commentaires'] ?? null);
return $ligne;
}
/**
* @Route("/upload/test-api-connection", name="test_api_connection", methods={"GET"})
*/
public function testApiConnection(): JsonResponse
{
try {
$isConnected = $this->apiClient->testConnection();
$stats = $this->apiClient->getStats();
return $this->json([
'success' => true,
'connected' => $isConnected,
'stats' => $stats,
'api_url' => $_ENV['PROJECT2_API_URL'] ?? 'non configuré'
]);
} catch (\Exception $e) {
return $this->json([
'success' => false,
'error' => $e->getMessage()
], 500);
}
}
/**
* Parse une date
*/
private function parseDate(string $dateString): ?\DateTimeInterface
{
try {
$formats = ['d/m/Y', 'd-m-Y', 'Y-m-d', 'd/m/y', 'd-m-y'];
foreach ($formats as $format) {
$date = \DateTime::createFromFormat($format, $dateString);
if ($date !== false) {
return $date;
}
}
return new \DateTime($dateString);
} catch (\Exception $e) {
return null;
}
}
private function cleanupTempDir(string $tempDir): void
{
if (is_dir($tempDir)) {
$files = @scandir($tempDir);
if ($files) {
foreach ($files as $file) {
if ($file != '.' && $file != '..') {
@unlink($tempDir . '\\' . $file);
}
}
}
@rmdir($tempDir);
}
}
/**
* @Route("/upload/review/{id}", name="upload_review", methods={"GET", "POST"})
*/
public function review(Request $request, UploadBatch $batch): Response
{
$declaration = $batch->getDeclaration();
if (!$declaration) {
throw $this->createNotFoundException();
}
// Gérer l'ajout d'une nouvelle ligne
if ($request->isMethod('POST') && $request->request->has('add_line')) {
$ligne = new DeclarationLigne();
$ligne->setDeclaration($declaration);
$ligne->setAgence($declaration->getAgence());
$ligne->setImmatriculation($declaration->getImmatriculation());
$ligne->setNomClient($declaration->getNomClient());
$ligne->setDateJour(new \DateTime());
$declaration->addLigne($ligne);
$this->em->persist($ligne);
$this->em->flush();
$this->addFlash('success', 'Nouvelle ligne ajoutée');
return $this->redirectToRoute('upload_review', ['id' => $batch->getId()]);
}
// Gérer la suppression d'une ligne
if ($request->isMethod('POST') && $request->request->has('delete_line')) {
$lineId = $request->request->get('delete_line');
foreach ($declaration->getLignes() as $ligne) {
if ($ligne->getId() == $lineId) {
$declaration->removeLigne($ligne);
$this->em->remove($ligne);
break;
}
}
$this->em->flush();
$this->addFlash('success', 'Ligne supprimée');
return $this->redirectToRoute('upload_review', ['id' => $batch->getId()]);
}
// Gérer la validation complète
if ($request->isMethod('POST') && $request->request->has('validate_all')) {
return $this->validateDeclaration($request, $batch, $declaration);
}
// Gérer la sauvegarde brouillon
if ($request->isMethod('POST') && $request->request->has('save_draft')) {
return $this->saveDraft($request, $batch, $declaration);
}
// Récupérer les données brutes extraites pour information
$sessionData = $this->get('session')->get('extracted_data_' . $batch->getId());
$rawData = $sessionData['raw_data'] ?? null;
return $this->render('upload/review.html.twig', [
'batch' => $batch,
'declaration' => $declaration,
'rawData' => $rawData,
'ligneCount' => $declaration->getLignes()->count()
]);
}
// private function validateDeclaration(Request $request, UploadBatch $batch, DeclarationConducteur $declaration): Response
// {
// $data = $request->request->all();
// // Mettre à jour l'en-tête
// $declaration->setNomClient($data['nom_client'] ?? $declaration->getNomClient());
// $declaration->setImmatriculation($data['immatriculation'] ?? $declaration->getImmatriculation());
// $declaration->setAgence($data['agence'] ?? $declaration->getAgence());
// $declaration->setNumeroLicence($data['numero_licence'] ?? $declaration->getNumeroLicence());
// // Dates de période
// if (isset($data['date_debut']) && $data['date_debut']) {
// $declaration->setDateDebut(new \DateTime($data['date_debut']));
// }
// if (isset($data['date_fin']) && $data['date_fin']) {
// $declaration->setDateFin(new \DateTime($data['date_fin']));
// }
// // Mettre à jour les lignes existantes
// if (isset($data['lignes']) && is_array($data['lignes'])) {
// foreach ($data['lignes'] as $index => $ligneData) {
// $lignes = $declaration->getLignes()->toArray();
// if (isset($lignes[$index])) {
// $ligne = $lignes[$index];
// if (isset($ligneData['date']) && $ligneData['date']) {
// $ligne->setDateJour(new \DateTime($ligneData['date']));
// }
// $ligne->setLieuDepart($ligneData['lieu_depart'] ?? null);
// $ligne->setKmDepart($ligneData['km_depart'] ?? null);
// $ligne->setTranche1MatinDebut($ligneData['tranche_1_matin_debut'] ?? null);
// $ligne->setTranche1MatinFin($ligneData['tranche_1_matin_fin'] ?? null);
// $ligne->setTranche2MidiDebut($ligneData['tranche_2_midi_debut'] ?? null);
// $ligne->setTranche2MidiFin($ligneData['tranche_2_midi_fin'] ?? null);
// $ligne->setTranche3SoirDebut($ligneData['tranche_3_soir_debut'] ?? null);
// $ligne->setTranche3SoirFin($ligneData['tranche_3_soir_fin'] ?? null);
// $ligne->setTranche4AutreDebut($ligneData['tranche_4_autre_debut'] ?? null);
// $ligne->setTranche4AutreFin($ligneData['tranche_4_autre_fin'] ?? null);
// $ligne->setLieuArrivee($ligneData['lieu_arrivee'] ?? null);
// $ligne->setKmArrivee($ligneData['km_arrivee'] ?? null);
// $ligne->setTempsAnnexes($ligneData['temps_annexes'] ?? null);
// $ligne->setTempsTotal($ligneData['temps_total'] ?? null);
// $ligne->setCommentaires($ligneData['commentaires'] ?? null);
// $ligne->setIsCorrected(true);
// $ligne->setCorrectedAt(new \DateTimeImmutable());
// }
// }
// }
// $declaration->setProcessedAt(new \DateTimeImmutable());
// $declaration->setStatus('validated');
// $batch->setStatus('processed');
// $this->em->flush();
// // Nettoyer la session
// $this->get('session')->remove('extracted_data_' . $batch->getId());
// $this->addFlash('success', 'Déclaration validée et enregistrée avec succès !');
// return $this->redirectToRoute('upload_list');
// }
// private function saveDraft(Request $request, UploadBatch $batch, DeclarationConducteur $declaration): Response
// {
// $data = $request->request->all();
// // Mettre à jour l'en-tête
// $declaration->setNomClient($data['nom_client'] ?? $declaration->getNomClient());
// $declaration->setImmatriculation($data['immatriculation'] ?? $declaration->getImmatriculation());
// $declaration->setAgence($data['agence'] ?? $declaration->getAgence());
// $declaration->setNumeroLicence($data['numero_licence'] ?? $declaration->getNumeroLicence());
// // Dates de période
// if (isset($data['date_debut']) && $data['date_debut']) {
// $declaration->setDateDebut(new \DateTime($data['date_debut']));
// }
// if (isset($data['date_fin']) && $data['date_fin']) {
// $declaration->setDateFin(new \DateTime($data['date_fin']));
// }
// // Mettre à jour les lignes existantes
// if (isset($data['lignes']) && is_array($data['lignes'])) {
// foreach ($data['lignes'] as $index => $ligneData) {
// $lignes = $declaration->getLignes()->toArray();
// if (isset($lignes[$index])) {
// $ligne = $lignes[$index];
// if (isset($ligneData['date']) && $ligneData['date']) {
// $ligne->setDateJour(new \DateTime($ligneData['date']));
// }
// $ligne->setLieuDepart($ligneData['lieu_depart'] ?? null);
// $ligne->setKmDepart($ligneData['km_depart'] ?? null);
// $ligne->setTranche1MatinDebut($ligneData['tranche_1_matin_debut'] ?? null);
// $ligne->setTranche1MatinFin($ligneData['tranche_1_matin_fin'] ?? null);
// $ligne->setTranche2MidiDebut($ligneData['tranche_2_midi_debut'] ?? null);
// $ligne->setTranche2MidiFin($ligneData['tranche_2_midi_fin'] ?? null);
// $ligne->setTranche3SoirDebut($ligneData['tranche_3_soir_debut'] ?? null);
// $ligne->setTranche3SoirFin($ligneData['tranche_3_soir_fin'] ?? null);
// $ligne->setTranche4AutreDebut($ligneData['tranche_4_autre_debut'] ?? null);
// $ligne->setTranche4AutreFin($ligneData['tranche_4_autre_fin'] ?? null);
// $ligne->setLieuArrivee($ligneData['lieu_arrivee'] ?? null);
// $ligne->setKmArrivee($ligneData['km_arrivee'] ?? null);
// $ligne->setTempsAnnexes($ligneData['temps_annexes'] ?? null);
// $ligne->setTempsTotal($ligneData['temps_total'] ?? null);
// $ligne->setCommentaires($ligneData['commentaires'] ?? null);
// $ligne->setIsCorrected(true);
// $ligne->setCorrectedAt(new \DateTimeImmutable());
// }
// }
// }
// $declaration->setStatus('draft');
// $this->em->flush();
// $this->addFlash('success', 'Brouillon sauvegardé avec succès');
// return $this->redirectToRoute('upload_review', ['id' => $batch->getId()]);
// }
private function validateDeclaration(Request $request, UploadBatch $batch, DeclarationConducteur $declaration): Response
{
$data = $request->request->all();
// Mettre à jour l'en-tête
$declaration->setNomClient($data['nom_client'] ?? $declaration->getNomClient());
$declaration->setImmatriculation($data['immatriculation'] ?? $declaration->getImmatriculation());
$declaration->setAgence($data['agence'] ?? $declaration->getAgence());
$declaration->setNumeroLicence($data['numero_licence'] ?? $declaration->getNumeroLicence());
// Dates de période
if (isset($data['date_debut']) && $data['date_debut']) {
$declaration->setDateDebut(new \DateTime($data['date_debut']));
}
if (isset($data['date_fin']) && $data['date_fin']) {
$declaration->setDateFin(new \DateTime($data['date_fin']));
}
// Mettre à jour les lignes existantes AVEC les champs de l'entête
if (isset($data['lignes']) && is_array($data['lignes'])) {
foreach ($data['lignes'] as $index => $ligneData) {
$lignes = $declaration->getLignes()->toArray();
if (isset($lignes[$index])) {
$ligne = $lignes[$index];
// Mettre à jour les champs de l'entête dans la ligne
$ligne->setNomClient($declaration->getNomClient());
$ligne->setImmatriculation($declaration->getImmatriculation());
$ligne->setAgence($declaration->getAgence());
if (isset($ligneData['date']) && $ligneData['date']) {
$ligne->setDateJour(new \DateTime($ligneData['date']));
}
$ligne->setLieuDepart($ligneData['lieu_depart'] ?? null);
$ligne->setKmDepart($ligneData['km_depart'] ?? null);
$ligne->setTranche1MatinDebut($ligneData['tranche_1_matin_debut'] ?? null);
$ligne->setTranche1MatinFin($ligneData['tranche_1_matin_fin'] ?? null);
$ligne->setTranche2MidiDebut($ligneData['tranche_2_midi_debut'] ?? null);
$ligne->setTranche2MidiFin($ligneData['tranche_2_midi_fin'] ?? null);
$ligne->setTranche3SoirDebut($ligneData['tranche_3_soir_debut'] ?? null);
$ligne->setTranche3SoirFin($ligneData['tranche_3_soir_fin'] ?? null);
$ligne->setTranche4AutreDebut($ligneData['tranche_4_autre_debut'] ?? null);
$ligne->setTranche4AutreFin($ligneData['tranche_4_autre_fin'] ?? null);
$ligne->setLieuArrivee($ligneData['lieu_arrivee'] ?? null);
$ligne->setKmArrivee($ligneData['km_arrivee'] ?? null);
$ligne->setTempsAnnexes($ligneData['temps_annexes'] ?? null);
$ligne->setTempsTotal($ligneData['temps_total'] ?? null);
$ligne->setCommentaires($ligneData['commentaires'] ?? null);
$ligne->setIsCorrected(true);
$ligne->setCorrectedAt(new \DateTimeImmutable());
}
}
} else {
// Si pas de données de lignes dans la requête, mettre à jour quand même les champs d'entête
foreach ($declaration->getLignes() as $ligne) {
$ligne->setNomClient($declaration->getNomClient());
$ligne->setImmatriculation($declaration->getImmatriculation());
$ligne->setAgence($declaration->getAgence());
}
}
$declaration->setProcessedAt(new \DateTimeImmutable());
$declaration->setStatus('validated');
$batch->setStatus('processed');
$this->em->flush();
// Nettoyer la session
$this->get('session')->remove('extracted_data_' . $batch->getId());
$this->addFlash('success', 'Déclaration validée et enregistrée avec succès !');
return $this->redirectToRoute('upload_list');
}
private function saveDraft(Request $request, UploadBatch $batch, DeclarationConducteur $declaration): Response
{
$data = $request->request->all();
// Mettre à jour l'en-tête
$declaration->setNomClient($data['nom_client'] ?? $declaration->getNomClient());
$declaration->setImmatriculation($data['immatriculation'] ?? $declaration->getImmatriculation());
$declaration->setAgence($data['agence'] ?? $declaration->getAgence());
$declaration->setNumeroLicence($data['numero_licence'] ?? $declaration->getNumeroLicence());
// Dates de période
if (isset($data['date_debut']) && $data['date_debut']) {
$declaration->setDateDebut(new \DateTime($data['date_debut']));
}
if (isset($data['date_fin']) && $data['date_fin']) {
$declaration->setDateFin(new \DateTime($data['date_fin']));
}
// Mettre à jour les lignes existantes AVEC les champs de l'entête
if (isset($data['lignes']) && is_array($data['lignes'])) {
foreach ($data['lignes'] as $index => $ligneData) {
$lignes = $declaration->getLignes()->toArray();
if (isset($lignes[$index])) {
$ligne = $lignes[$index];
// Mettre à jour les champs de l'entête dans la ligne
$ligne->setNomClient($declaration->getNomClient());
$ligne->setImmatriculation($declaration->getImmatriculation());
$ligne->setAgence($declaration->getAgence());
if (isset($ligneData['date']) && $ligneData['date']) {
$ligne->setDateJour(new \DateTime($ligneData['date']));
}
$ligne->setLieuDepart($ligneData['lieu_depart'] ?? null);
$ligne->setKmDepart($ligneData['km_depart'] ?? null);
$ligne->setTranche1MatinDebut($ligneData['tranche_1_matin_debut'] ?? null);
$ligne->setTranche1MatinFin($ligneData['tranche_1_matin_fin'] ?? null);
$ligne->setTranche2MidiDebut($ligneData['tranche_2_midi_debut'] ?? null);
$ligne->setTranche2MidiFin($ligneData['tranche_2_midi_fin'] ?? null);
$ligne->setTranche3SoirDebut($ligneData['tranche_3_soir_debut'] ?? null);
$ligne->setTranche3SoirFin($ligneData['tranche_3_soir_fin'] ?? null);
$ligne->setTranche4AutreDebut($ligneData['tranche_4_autre_debut'] ?? null);
$ligne->setTranche4AutreFin($ligneData['tranche_4_autre_fin'] ?? null);
$ligne->setLieuArrivee($ligneData['lieu_arrivee'] ?? null);
$ligne->setKmArrivee($ligneData['km_arrivee'] ?? null);
$ligne->setTempsAnnexes($ligneData['temps_annexes'] ?? null);
$ligne->setTempsTotal($ligneData['temps_total'] ?? null);
$ligne->setCommentaires($ligneData['commentaires'] ?? null);
$ligne->setIsCorrected(true);
$ligne->setCorrectedAt(new \DateTimeImmutable());
}
}
} else {
// Si pas de données de lignes dans la requête, mettre à jour quand même les champs d'entête
foreach ($declaration->getLignes() as $ligne) {
$ligne->setNomClient($declaration->getNomClient());
$ligne->setImmatriculation($declaration->getImmatriculation());
$ligne->setAgence($declaration->getAgence());
}
}
$declaration->setStatus('draft');
$this->em->flush();
$this->addFlash('success', 'Brouillon sauvegardé avec succès');
return $this->redirectToRoute('upload_review', ['id' => $batch->getId()]);
}
// /**
// * @Route("/upload/test-conversion/{id}", name="test_conversion", methods={"GET"})
// */
// public function testConversion(UploadBatch $batch): Response
// {
// $filePath = $this->projectDir . '/public/uploads/' . $batch->getStoredFilename();
// $html = '<h1>Test de conversion PDF en images</h1>';
// $html .= '<p>Fichier: ' . basename($filePath) . '</p>';
// if (!file_exists($filePath)) {
// return new Response($html . '<p style="color: red;">❌ Fichier non trouvé</p>');
// }
// // Tester Ghostscript
// $html .= '<h2>Test Ghostscript</h2>';
// $html .= '<p>Chemin: ' . htmlspecialchars($this->ghostscriptPath) . '</p>';
// $tempDir = sys_get_temp_dir() . '\\test_gs_' . uniqid();
// mkdir($tempDir, 0777, true);
// $testImage = $tempDir . '\\test.jpg';
// $command = sprintf('"%s" -sDEVICE=jpeg -dFirstPage=1 -dLastPage=1 -r150 -dJPEGQ=90 -dNOPAUSE -dBATCH -dQUIET -sOutputFile="%s" "%s"',
// $this->ghostscriptPath, $testImage, $filePath);
// exec($command . ' 2>&1', $output, $returnCode);
// $html .= '<p>Commande: <code>' . htmlspecialchars($command) . '</code></p>';
// $html .= '<p>Code retour: ' . $returnCode . '</p>';
// $html .= '<p>Sortie: <pre>' . htmlspecialchars(implode("\n", $output)) . '</pre></p>';
// if (file_exists($testImage) && filesize($testImage) > 0) {
// $imageData = base64_encode(file_get_contents($testImage));
// $html .= '<p>✅ Image générée (' . filesize($testImage) . ' octets)</p>';
// $html .= '<img src="data:image/jpeg;base64,' . $imageData . '" style="max-width: 800px; border: 1px solid #ccc;">';
// // Tester la préparation du contenu
// $html .= '<h2>Test préparation pour OpenAI</h2>';
// try {
// $messages = $this->prepareContentForOpenAI($filePath, $batch->getExtension());
// $html .= '<p>✅ Préparation réussie</p>';
// $html .= '<pre>' . htmlspecialchars(json_encode($messages, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)) . '</pre>';
// } catch (\Exception $e) {
// $html .= '<p style="color: red;">❌ Erreur: ' . htmlspecialchars($e->getMessage()) . '</p>';
// }
// unlink($testImage);
// } else {
// $html .= '<p style="color: red;">❌ Aucune image générée</p>';
// // Tester pdftoppm
// $html .= '<h2>Test pdftoppm</h2>';
// if ($this->tryPdfToPpmConversion($filePath, $tempDir)) {
// $html .= '<p>✅ pdftoppm fonctionne</p>';
// $images = glob($tempDir . '\\alt_page*.jpg');
// foreach ($images as $image) {
// if (file_exists($image)) {
// $imageData = base64_encode(file_get_contents($image));
// $html .= '<img src="data:image/jpeg;base64,' . $imageData . '" style="max-width: 800px; border: 1px solid #ccc; margin-bottom: 10px;">';
// unlink($image);
// }
// }
// } else {
// $html .= '<p style="color: red;">❌ pdftoppm ne fonctionne pas</p>';
// }
// }
// @rmdir($tempDir);
// return new Response($html);
// }
}