From 9b617eac730b664e81e6f3df009d365bd790b9cb Mon Sep 17 00:00:00 2001 From: Tolotsoa Date: Fri, 22 Aug 2025 10:16:33 +0300 Subject: [PATCH] refactor creation file pdf --- gestion/lib/Service/InvoicePdfService.php | 97 +++++++++++++++-------- 1 file changed, 63 insertions(+), 34 deletions(-) diff --git a/gestion/lib/Service/InvoicePdfService.php b/gestion/lib/Service/InvoicePdfService.php index 62cd532..15f4729 100644 --- a/gestion/lib/Service/InvoicePdfService.php +++ b/gestion/lib/Service/InvoicePdfService.php @@ -113,17 +113,7 @@ class InvoicePdfService } $pdfFilename = $prefixPdf."_".$pdfFilename; $filenames = []; - foreach($factureFolders as $folder) { - try { - $storage->newFolder($folder); - } catch(\OCP\Files\NotPermittedException $e) { - } - $ff_pdf = $folder.$pdfFilename.'.pdf'; - $storage->newFile($ff_pdf); - $file_pdf = $storage->get($ff_pdf); - $file_pdf->putContent($pdfContent); - $filenames[] = $ff_pdf; - } + $filenames = $this->savePdfToFolders($factureFolders, $pdfFilename, $pdfContent, $storage); $this->gestionBdd->setFactureGeneratedDate($factureId); return [ "content" => $pdfContent, @@ -211,20 +201,7 @@ class InvoicePdfService $pdfContent = $pdf->Output('', 'S'); $pdfFilename = $pdf->GetInvoiceFilename(); $filenames = []; - - foreach($factureFolders as $folder) { - try { - $storage->newFolder($folder); - } catch(TemplateException $e) { - // Ignore si le dossier existe déjà - } - $ff_pdf = $folder.$pdfFilename; - $storage->newFile($ff_pdf); - $file_pdf = $storage->get($ff_pdf); - $file_pdf->putContent($pdfContent); - $filenames[] = $ff_pdf; - } - + $filenames = $this->savePdfToFolders($factureFolders, $pdfFilename, $pdfContent, $storage); $this->gestionBdd->setFactureGeneratedDate($factureId); return [ "content" => $pdfContent, @@ -276,16 +253,10 @@ class InvoicePdfService } $clientRacineFolder = $racinePath.'CLIENTS/'.mb_strtoupper($clientNameInFolder, 'UTF-8').'/'; $filename = "FACTURE".'_'.$pdf->GetMultipleInvoiceFilename($month, $year); - $filenamePath = $clientRacineFolder.$filename.'.pdf'; $pdfContent = $pdf->Output('', 'S'); - try { - $storage->newFolder($clientRacineFolder); - } catch(\OCP\Files\NotPermittedException $e) { - } - $storage->newFile($filenamePath); - $file_pdf = $storage->get($filenamePath); - $file_pdf->putContent($pdfContent); - return $filenamePath; + $singleFolderArray = [$clientRacineFolder]; + $filenames = $this->savePdfToFolders($singleFolderArray, $filename, $pdfContent, $storage); + return $filenames[0]; } public function generateInvoiceRecap($filter, $filterType, $date, $idNextCloud) @@ -666,4 +637,62 @@ class InvoicePdfService "Si les frais de recouvrement sont supérieurs à ce montant forfaitaire, une indemnisation complémentaire " . "sera due sur présentation de justificatifs (articles L 441-3 et L 441-6 du code de commerce)."; } + + /** + * Fonction générique pour sauvegarder un fichier PDF dans plusieurs dossiers + * + * @param array $factureFolders Liste des dossiers où sauvegarder + * @param string $pdfFilename Nom du fichier PDF (sans extension) + * @param string $pdfContent Contenu binaire du PDF + * @param mixed $storage Instance de stockage Nextcloud + * @return array Liste des chemins des fichiers créés + */ + private function savePdfToFolders(array $factureFolders, string $pdfFilename, string $pdfContent, $storage): array + { + $filenames = []; + + foreach ($factureFolders as $folder) { + // --- GESTION DU CHEMIN --- + if (($_ENV['APP_ENV'] ?? 'prod') === 'dev') { + // En dev : remplacer les accents et caractères spéciaux pour Docker + $relativeFolder = $this->sanitizePathDev($folder); + $pdfFileNameSafe = $this->sanitizePathDev($pdfFilename); + } else { + // En prod : garder UTF-8, juste retirer slash initial + $relativeFolder = ltrim($folder, '/'); + $pdfFileNameSafe = $pdfFilename; + } + + // --- CREATION DU DOSSIER --- + try { + if (!$storage->nodeExists($relativeFolder)) { + $storage->newFolder($relativeFolder); + } + } catch (\Exception $e) { + error_log("ERROR creating folder '$relativeFolder': " . $e->getMessage()); + // Ne pas faire exit, continuer avec les autres dossiers + continue; + } + + // --- CHEMIN COMPLET DU FICHIER --- + $ff_pdf = rtrim($relativeFolder, '/') . '/' . $pdfFileNameSafe . '.pdf'; + + // --- CREATION OU MISE A JOUR DU FICHIER --- + try { + if ($storage->nodeExists($ff_pdf)) { + $file_pdf = $storage->get($ff_pdf); + } else { + $file_pdf = $storage->newFile($ff_pdf); + } + $file_pdf->putContent($pdfContent); + $filenames[] = $ff_pdf; + } catch (\Throwable $e) { + error_log("ERROR on file '$ff_pdf': " . $e->getMessage()); + // Ne pas faire exit, continuer avec les autres fichiers + continue; + } + } + + return $filenames; + } }