From b5c15c0425835e4e5d38df7c919597a969272721 Mon Sep 17 00:00:00 2001 From: Tolotsoa Date: Tue, 26 Aug 2025 16:59:51 +0300 Subject: [PATCH] feat change template pdf HT --- gestion/lib/Db/Bdd.php | 17 ++- .../InvoiceGroupPdfHandler.php | 126 +++++++++++++----- gestion/lib/Service/InvoicePdfHandler.php | 124 +++++++++++------ gestion/lib/Service/InvoicePdfService.php | 83 +----------- 4 files changed, 196 insertions(+), 154 deletions(-) diff --git a/gestion/lib/Db/Bdd.php b/gestion/lib/Db/Bdd.php index cc14019..ad53cd7 100644 --- a/gestion/lib/Db/Bdd.php +++ b/gestion/lib/Db/Bdd.php @@ -3522,6 +3522,13 @@ class Bdd $products = $this->getDevisProduits($invoice["devis_id"]); $invoice["products"] = $products; $invoice["configuration"] = $configuration; + // Déterminer la TVA pour cette facture + $hasTva = true; // Valeur par défaut + if(isset($invoice['client_id']) && $invoice['client_id']) { + $client = $this->getClientById($invoice['client_id']); + $hasTva = ($client && isset($client['tva'])) ? ($client['tva'] == 1) : true; + } + $invoice["is_tva"] = $hasTva; $isClientInsideGroup = $invoice["group_id"] != null; if($isClientInsideGroup) { @@ -5441,6 +5448,13 @@ COMMENTAIRES: ".$comment; $defaultTvaValue = $configuration->tva_default; $factureData = $this->getFactureByFactureId($factureId); $isFactureForSingleClient = $factureData['fk_client_id'] != null && $factureData['fk_client_id'] != 0; + + $hasTva = true; // Valeur par défaut + if($isFactureForSingleClient) { + $client = $this->getClientById($factureData['fk_client_id']); + $hasTva = ($client && isset($client['tva'])) ? ($client['tva'] == 1) : true; + } + $devisMentionFilters = [ DevisMentionConstant::FACTURED_FORMATTED, DevisMentionConstant::FACTURED @@ -5564,7 +5578,7 @@ COMMENTAIRES: ".$comment; } elseif($globalTvaValue > 0) { $tvaLabel = "TVA ".$globalTvaValue. "%"; } else { - $tvaLabel = "TVA (exonéré)"; + $tvaLabel = "TVA 0 %"; } $totaPricesArray = [ @@ -5573,6 +5587,7 @@ COMMENTAIRES: ".$comment; "TOTAL TTC" => $totalTtc ]; + $factureData["is_tva"] = $hasTva; $factureData["devis"] = $factureDevisList; $factureData["configuration"] = $configuration; $configurationAdresses = FileExportHelpers::GetAddressAndCityFromAddress($configuration->adresse); diff --git a/gestion/lib/Service/InvoiceGroupPdfHandler/InvoiceGroupPdfHandler.php b/gestion/lib/Service/InvoiceGroupPdfHandler/InvoiceGroupPdfHandler.php index 08d099c..1fdc287 100644 --- a/gestion/lib/Service/InvoiceGroupPdfHandler/InvoiceGroupPdfHandler.php +++ b/gestion/lib/Service/InvoiceGroupPdfHandler/InvoiceGroupPdfHandler.php @@ -54,6 +54,8 @@ class InvoiceGroupPdfHandler extends FPDF public $additionalArticlesLineBasedOnMultiline = 0; public $interLigneHeader = 5; + public $hasTva = true; + public function Header() { if ($this->logo != "nothing") { @@ -132,6 +134,8 @@ class InvoiceGroupPdfHandler extends FPDF $this->devisCountToGet = ($this->devisCount <= $this->maxArticlePerPage) ? $this->devisCount : $this->maxArticlePerPage; $this->devisList = $this->factureData['devis']; $this->logo = $logo; + // Déterminer si la TVA est applicable + $this->hasTva = isset($factureData['is_tva']) ? $factureData['is_tva'] : true; } public function GetInvoiceFilename() @@ -174,6 +178,7 @@ class InvoiceGroupPdfHandler extends FPDF $this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport('Tél : ') . FileExportHelpers::FormatTextForExport($this->factureData['configuration']->telephone), 0, 1); $this->Cell(0, $this->interLigneHeader, 'Mail : ' . $this->factureData['configuration']->mail, 0, 1); } + public function DrawInvoiceClientInfo() { $this->SetFont('ComicSans', '', 10); @@ -188,7 +193,6 @@ class InvoiceGroupPdfHandler extends FPDF $addressWidthGreaterThanMaxWidth = $addressWidth > $availableWidhtForClientInfo; $addressIsMoreThanTwoLines = ($addressWidth / $availableWidhtForClientInfo) > 2; - $clientInfoYAxis = $addressIsMoreThanTwoLines ? 35 : 40; $this->SetXY($clientInfoXAxis, $clientInfoYAxis); $this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport($clientName)); @@ -217,7 +221,6 @@ class InvoiceGroupPdfHandler extends FPDF } else { $clientInfoYAxis += $this->interLigneHeader; } - } else { $clientAddresses = explode(",", $clientAddress); foreach ($clientAddresses as $address) { @@ -245,15 +248,24 @@ class InvoiceGroupPdfHandler extends FPDF } $this->SetXY($clientInfoXAxis, $clientInfoYAxis); $this->Cell(0, $this->interLigneHeader, trim(FileExportHelpers::FormatTextForExport($this->factureData['client_adress_city']))); - if ($this->factureData['siret']) { + + // Gestion Siret ou TVA intracommunautaire selon is_tva + if ($this->hasTva) { + // Avec TVA : afficher le Siret + if ($this->factureData['siret']) { + $clientInfoYAxis += $this->interLigneHeader; + $this->SetXY($clientInfoXAxis, $clientInfoYAxis); + $this->Cell(0, $this->interLigneHeader, 'Siret: ' . $this->factureData['siret']); + } + } else { + // Sans TVA : afficher N° TVA intracommunautaire (même si vide) $clientInfoYAxis += $this->interLigneHeader; $this->SetXY($clientInfoXAxis, $clientInfoYAxis); - $this->Cell(0, $this->interLigneHeader, 'Siret: ' . $this->factureData['siret']); + $tvaIntracommu = isset($this->factureData['group_tva_intracommu']) ? $this->factureData['group_tva_intracommu'] : ''; + $this->Cell(0, $this->interLigneHeader, 'TVA intracom : ' . $tvaIntracommu); } } - - public function DrawInvoiceInfoTable() { $startInvoiceInfoTable = 70; @@ -283,22 +295,31 @@ class InvoiceGroupPdfHandler extends FPDF public function DrawArticlesTableRect() { - $this->SetLineWidth(0.2); $gapBetweenStartingOfArticlesTableAndColumnName = 7; $additionnalheight = 0.75; $tableHeight = $this->thereIsOrderOrCaseNumber ? (137 + $additionnalheight) : (137 + 6 + $additionnalheight); $this->Rect(3, $this->startingYOfArticlesTable, 204, $tableHeight, "D"); - // $this->RoundedRect(3, $this->startingYOfArticlesTable, 204, $tableHeight,5 ,'1234',"D"); - // cadre titre des colonnes + + // Cadre titre des colonnes $this->Line(3, $this->startingYOfArticlesTable + $gapBetweenStartingOfArticlesTableAndColumnName, 207, $this->startingYOfArticlesTable + $gapBetweenStartingOfArticlesTableAndColumnName); - // les traits verticaux colonnes + + // Les traits verticaux colonnes $additionalMargRight = 1; $endingLine = 233 + $additionnalheight; + + // Lignes verticales communes $this->Line(27 + $additionalMargRight, $this->startingYOfArticlesTable, 27 + $additionalMargRight, $endingLine); - $this->Line(142 + $additionalMargRight, $this->startingYOfArticlesTable, 142 + $additionalMargRight, $endingLine); - $this->Line(164 + $additionalMargRight, $this->startingYOfArticlesTable, 164 + $additionalMargRight, $endingLine); - $this->Line(182 + $additionalMargRight, $this->startingYOfArticlesTable, 182 + $additionalMargRight, $endingLine); + + if ($this->hasTva) { + // Avec TVA : 3 colonnes de prix (Date | Description | HT | TVA | TTC) + $this->Line(142 + $additionalMargRight, $this->startingYOfArticlesTable, 142 + $additionalMargRight, $endingLine); + $this->Line(164 + $additionalMargRight, $this->startingYOfArticlesTable, 164 + $additionalMargRight, $endingLine); + $this->Line(182 + $additionalMargRight, $this->startingYOfArticlesTable, 182 + $additionalMargRight, $endingLine); + } else { + // Sans TVA : 2 colonnes seulement (Date | Description | HT) + $this->Line(165 + $additionalMargRight, $this->startingYOfArticlesTable, 165 + $additionalMargRight, $endingLine); + } } public function DrawArticlesTableHeader() @@ -307,26 +328,30 @@ class InvoiceGroupPdfHandler extends FPDF $tvaValue = $this->factureData["configuration"]->tva_default; $columnNameY = $this->startingYOfArticlesTable - 1.5; $this->SetFont('ComicSans', '', 10); + $this->SetXY(12 + $additionalMargRight, $columnNameY); $this->Cell(7, 10, "Date", 0, 0, 'C'); $this->SetXY(30 + $additionalMargRight, $columnNameY); $this->Cell(100, 10, "Description", 0, 0, 'C'); - $this->SetXY(143 + $additionalMargRight, $columnNameY); - $this->Cell(20, 10, "Prix Uni. HT", 0, 0, 'C'); - - $this->SetXY(163 + $additionalMargRight, $columnNameY); - $this->Cell(20, 10, 'TVA ' . $tvaValue . '%', 0, 0, 'C'); - - $this->SetXY(185, $columnNameY); - $this->Cell(20, 10, "Prix Uni. TTC", 0, 0, 'C'); + if ($this->hasTva) { + // Avec TVA : HT | TVA | TTC + $this->SetXY(145 + $additionalMargRight, $columnNameY); // Décalé de 145 au lieu de 143 + $this->Cell(20, 10, "Prix Uni. HT", 0, 0, 'C'); + $this->SetXY(163 + $additionalMargRight, $columnNameY); + $this->Cell(20, 10, 'TVA ' . $tvaValue . '%', 0, 0, 'C'); + $this->SetXY(185, $columnNameY); + $this->Cell(20, 10, "Prix Uni. TTC", 0, 0, 'C'); + } else { + // Sans TVA : seulement HT + $this->SetXY(167, $columnNameY); // Décalé de 167 au lieu de 165 + $this->Cell(20, 10, "Prix Uni. HT", 0, 0, 'C'); + } } public function DrawArticlesTableValue() { - // Set espacement avant de continue - $this->SetFont('ComicSans', '', 10); $devisData = $this->factureData['devis']; $tvaValue = $this->factureData["configuration"]->tva_default; @@ -334,9 +359,9 @@ class InvoiceGroupPdfHandler extends FPDF $totalTtc = 0; $totalTva = 0; $yValue = $this->startingYOfArticlesTable + 13; - // $maxDescriptionWidth = 102; $maxDescriptionWidth = 104.3; $currentIndexPosition = $this->currentIndexPosition; + for ($currentIndexPosition; $currentIndexPosition < ($this->initialIndexPosition + $this->devisCountToGet); $currentIndexPosition++) { $currentDevis = $devisData[$currentIndexPosition]; $devisDate = $currentDevis['devis_date']; @@ -344,27 +369,40 @@ class InvoiceGroupPdfHandler extends FPDF $devisDate = $devisDate->format('d-m-Y'); $products = $currentDevis["products"]; $productIncrement = 0; - foreach ($products as $product) { + foreach ($products as $product) { $valueHt = $product['produit_price'] * $product["quantite"]; - $valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt, $tvaValue); + + if ($this->hasTva) { + $valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt, $tvaValue); + $tvaAmount = $valueTtc - $valueHt; + } else { + $valueTtc = $valueHt; // Sans TVA, TTC = HT + $tvaAmount = 0; + } + $totalHt += $valueHt; $totalTtc += $valueTtc; + $totalTva += $tvaAmount; + $productDescription = $product["produit_description"] ?? ""; $dateValue = ""; if ($productIncrement == 0) { $dateValue = $devisDate; $productDescription .= " de " . $currentDevis["defunt_nom"] ?? ""; } - $tvaAmount = $valueTtc - $valueHt; + + // Date $this->SetXY(4, $yValue); $this->Cell(5, 6, $dateValue, 0, 0); + // Description (avec gestion multiligne) $this->SetXY(30, $yValue); $productDescription = FileExportHelpers::FormatTextForExport($productDescription); $productDescriptionWidth = $this->GetStringWidth($productDescription); $productDescriptionWidthIsGreaterThanMaxWidth = $productDescriptionWidth > $maxDescriptionWidth; $productDescriptionIsMultiline = false; + if ($productDescriptionWidthIsGreaterThanMaxWidth) { $yBefore = $this->GetY(); $this->MultiCell($maxDescriptionWidth, 6, $productDescription, 0, 'L'); @@ -377,29 +415,45 @@ class InvoiceGroupPdfHandler extends FPDF $this->Cell($maxDescriptionWidth, 6, $productDescription); } + if ($this->hasTva) { + // Prix HT + $this->SetXY(146, $yValue); // Décalé de 146 au lieu de 144 + $this->Cell(20, 6, number_format($valueHt, 2, '.', '') . chr(128), 0, 0, 'C'); + // TVA + $this->SetXY(165, $yValue); + $this->Cell(20, 6, number_format($tvaAmount, 2, '.', '') . chr(128), 0, 0, 'C'); + // Prix TTC + $this->SetXY(182, $yValue); + $this->Cell(25, 6, number_format($valueTtc, 2, '.', '') . chr(128), 0, 1, 'C'); + } else { + // Sans TVA : seulement Prix HT + $this->SetXY(167, $yValue); // Décalé de 167 au lieu de 165 + $this->Cell(25, 6, number_format($valueHt, 2, '.', '') . chr(128), 0, 1, 'C'); + } - $this->SetXY(144, $yValue); - $this->Cell(20, 6, number_format($valueHt, 2, '.', '') . chr(128), 0, 0, 'C'); - - $this->SetXY(165, $yValue); - $this->Cell(20, 6, number_format($tvaAmount, 2, '.', '') . chr(128), 0, 0, 'C'); - - $this->SetXY(182, $yValue); - $this->Cell(25, 6, number_format($valueTtc, 2, '.', '') . chr(128), 0, 1, 'C'); $yValue += 6; - $totalTva += $tvaAmount; if ($productDescriptionWidthIsGreaterThanMaxWidth) { $yValue += 6; } $productIncrement++; } } + $this->currentIndexPosition = $currentIndexPosition; $this->initialIndexPosition = $this->currentIndexPosition; $chargedDevisCount = $this->currentIndexPosition + 1; $devisLeftToGet = $this->devisCount - $chargedDevisCount; $this->devisCountToGet = ($devisLeftToGet < $this->maxArticlePerPage) ? $devisLeftToGet + 1 : $this->maxArticlePerPage; + // Mettre à jour les totaux selon la TVA + $this->totalPrices = []; + if ($this->hasTva) { + $this->totalPrices['TOTAL HT'] = $totalHt; + $this->totalPrices['TVA ' . $tvaValue . '%'] = $totalTva; + $this->totalPrices['TOTAL TTC'] = $totalTtc; + } else { + $this->totalPrices['TOTAL HT'] = $totalHt; + } } public function DrawBankAndTotalPriceInfo() diff --git a/gestion/lib/Service/InvoicePdfHandler.php b/gestion/lib/Service/InvoicePdfHandler.php index ebaa23f..4fd2adb 100644 --- a/gestion/lib/Service/InvoicePdfHandler.php +++ b/gestion/lib/Service/InvoicePdfHandler.php @@ -48,6 +48,9 @@ class InvoicePdfHandler extends FPDF private $articleTablesHeight = 130; public $interLigneHeader = 5; + + public $hasTva = true; + public function Header() { if ($this->logo != "nothing") { @@ -112,12 +115,18 @@ class InvoicePdfHandler extends FPDF { $this->factureData = $factureData; $this->logo = $logo; + + // Déterminer si la TVA est applicable + $this->hasTva = isset($factureData['is_tva']) ? $factureData['is_tva'] : true; } public function MutlipleInvoicePdfFactory(array $multipleInvoiceData, $logo = null) { $this->multipleFactureData = $multipleInvoiceData; $this->logo = $logo; + + // Pour les factures multiples, vérifier le premier élément ou faire une logique plus complexe + $this->hasTva = isset($multipleInvoiceData[0]['is_tva']) ? $multipleInvoiceData[0]['is_tva'] : true; } public function GetMultipleInvoiceFilename($month, $year) @@ -155,6 +164,7 @@ class InvoicePdfHandler extends FPDF $this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport('Tél : ') . FileExportHelpers::FormatTextForExport($this->factureData['configuration']->telephone), 0, 1); $this->Cell(0, $this->interLigneHeader, 'Mail : ' . $this->factureData['configuration']->mail, 0, 1); } + private function DrawInvoiceClientInfo() { $this->SetFont('ComicSans', '', 10); @@ -202,8 +212,19 @@ class InvoicePdfHandler extends FPDF $this->SetXY($clientInfoXAxis, $clientInfoYAxis); $this->Cell(0, $this->interLigneHeader, trim(FileExportHelpers::FormatTextForExport($this->factureData['client_adress_city']))); $clientInfoYAxis += $this->interLigneHeader; - $this->SetXY($clientInfoXAxis, $clientInfoYAxis); - $this->Cell(0, $this->interLigneHeader, 'Siret: ' . $this->factureData['siret']); + + // Gestion Siret ou TVA intracommunautaire selon is_tva + if ($this->hasTva) { + // Avec TVA : afficher le Siret + $this->SetXY($clientInfoXAxis, $clientInfoYAxis); + $this->Cell(0, $this->interLigneHeader, 'Siret: ' . $this->factureData['siret']); + } else { + // Sans TVA : afficher N° TVA intracommunautaire (même si vide) + $this->SetXY($clientInfoXAxis, $clientInfoYAxis); + $tvaIntracommu = isset($this->factureData['group_tva_intracommu']) ? $this->factureData['group_tva_intracommu'] : ''; + $this->Cell(0, $this->interLigneHeader, 'TVA intracom : ' . $tvaIntracommu); + } + $clientInfoYAxis += $this->interLigneHeader; $this->SetXY($clientInfoXAxis, $clientInfoYAxis); $this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport('Mail : ') . $this->factureData['client_mail']); @@ -268,25 +289,30 @@ class InvoicePdfHandler extends FPDF $gapBetweenStartingOfArticlesTableAndColumnName = 8; $tableHeight = $this->thereIsOrderOrCaseNumber ? $this->articleTablesHeight : $this->articleTablesHeight + 9; $this->Rect(3, $this->startingYOfArticlesTable, 204, $tableHeight, "D"); + // cadre titre des colonnes $this->Line(3, $this->startingYOfArticlesTable + $gapBetweenStartingOfArticlesTableAndColumnName, 207, $this->startingYOfArticlesTable + $gapBetweenStartingOfArticlesTableAndColumnName); + // les traits verticaux colonnes $additionalMargRight = 1; - $endingLine = $this->thereIsOrderOrCaseNumber ? 231 : 230; // mois +1 pour le groupe + $endingLine = $this->thereIsOrderOrCaseNumber ? 231 : 230; $this->Line(27 + $additionalMargRight, $this->startingYOfArticlesTable, 27 + $additionalMargRight, $endingLine); - $this->Line(142 + $additionalMargRight, $this->startingYOfArticlesTable, 142 + $additionalMargRight, $endingLine); - $this->Line(164 + $additionalMargRight, $this->startingYOfArticlesTable, 164 + $additionalMargRight, $endingLine); - $this->Line(182 + $additionalMargRight, $this->startingYOfArticlesTable, 182 + $additionalMargRight, $endingLine); + + if ($this->hasTva) { + // Avec TVA : 3 colonnes de prix (Date | Description | HT | TVA | TTC) + $this->Line(142 + $additionalMargRight, $this->startingYOfArticlesTable, 142 + $additionalMargRight, $endingLine); + $this->Line(164 + $additionalMargRight, $this->startingYOfArticlesTable, 164 + $additionalMargRight, $endingLine); + $this->Line(182 + $additionalMargRight, $this->startingYOfArticlesTable, 182 + $additionalMargRight, $endingLine); + } else { + // Sans TVA : 2 colonnes seulement (Date | Description | HT) + $this->Line(165 + $additionalMargRight, $this->startingYOfArticlesTable, 165 + $additionalMargRight, $endingLine); + } } private function DrawArticlesTableHeader() { $additionalMargRight = 1; $tvaDefault = $this->factureData["configuration"]->tva_default; - $clientTvaStatus = isset($this->factureData["tva"]) ? (int)$this->factureData["tva"] : 1; - - // Déterminer le libellé TVA selon le statut du client - $tvaLabel = ($clientTvaStatus === 0) ? "TVA 0%" : "TVA " . $tvaDefault . "%"; $columnNameY = $this->startingYOfArticlesTable - 1; $this->SetFont('ComicSans', '', 10); @@ -294,12 +320,20 @@ class InvoicePdfHandler extends FPDF $this->Cell(7, 10, "Date", 0, 0, 'C'); $this->SetXY(30 + $additionalMargRight, $columnNameY); $this->Cell(100, 10, "Description", 0, 0, 'C'); - $this->SetXY(143 + $additionalMargRight, $columnNameY); - $this->Cell(20, 10, "Prix Uni. HT", 0, 0, 'C'); - $this->SetXY(163 + $additionalMargRight, $columnNameY); - $this->Cell(20, 10, $tvaLabel, 0, 0, 'C'); - $this->SetXY(185, $columnNameY); - $this->Cell(20, 10, "Prix Uni. TTC", 0, 0, 'C'); + + if ($this->hasTva) { + // Avec TVA : HT | TVA | TTC + $this->SetXY(145 + $additionalMargRight, $columnNameY); // Décalé de 145 au lieu de 143 + $this->Cell(20, 10, "Prix Uni. HT", 0, 0, 'C'); + $this->SetXY(163 + $additionalMargRight, $columnNameY); + $this->Cell(20, 10, 'TVA ' . $tvaDefault . '%', 0, 0, 'C'); + $this->SetXY(185, $columnNameY); + $this->Cell(20, 10, "Prix Uni. TTC", 0, 0, 'C'); + } else { + // Sans TVA : seulement HT + $this->SetXY(167, $columnNameY); // Décalé de 167 au lieu de 165 + $this->Cell(20, 10, "Prix Uni. HT", 0, 0, 'C'); + } } public function DrawArticlesTableValueAndReturnTotalPrice() @@ -310,11 +344,6 @@ class InvoicePdfHandler extends FPDF $devisDate = $devisDate->format('d-m-Y'); $tvaDefault = $this->factureData["configuration"]->tva_default; - $clientTvaStatus = isset($this->factureData["tva"]) ? (int)$this->factureData["tva"] : 1; - - // Déterminer le taux de TVA à appliquer selon le statut du client - $tvaValue = ($clientTvaStatus === 0) ? 0 : $tvaDefault; - $tvaLabel = ($clientTvaStatus === 0) ? "0%" : $tvaDefault . "%"; $totalHt = 0; $totalTtc = 0; @@ -326,15 +355,14 @@ class InvoicePdfHandler extends FPDF foreach ($products as $product) { $valueHt = $product['produit_price'] * $product['quantite']; - // Calculer la TVA selon le statut du client - if ($clientTvaStatus === 0) { + if ($this->hasTva) { + // Client soumis à la TVA + $valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt, $tvaDefault); + $tvaAmount = $valueTtc - $valueHt; + } else { // Client exonéré - pas de TVA $valueTtc = $valueHt; $tvaAmount = 0; - } else { - // Client soumis à la TVA - utiliser le calcul normal - $valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt, $tvaValue); - $tvaAmount = $valueTtc - $valueHt; } $totalHt += $valueHt; @@ -352,20 +380,40 @@ class InvoicePdfHandler extends FPDF $this->Cell(5, 6, $dateValue, 0, 0); $this->SetXY(30, $yValue); $this->MultiAlignCell($maxDescriptionWidth, 6, utf8_decode(html_entity_decode($productDescription)), 0, '0', ); - $this->SetXY(144, $yValue); - $this->Cell(20, 6, number_format($valueHt, 2, '.', '') . chr(128), 0, 0, 'C'); - $this->SetXY(165, $yValue); - $this->Cell(20, 6, number_format($tvaAmount, 2, '.', '') . chr(128), 0, 0, 'C'); - $this->SetXY(182, $yValue); - $this->Cell(25, 6, number_format($valueTtc, 2, '.', '') . chr(128), 0, 1, 'C'); + + if ($this->hasTva) { + // Prix HT + $this->SetXY(146, $yValue); // Décalé de 146 au lieu de 144 + $this->Cell(20, 6, number_format($valueHt, 2, '.', '') . chr(128), 0, 0, 'C'); + // TVA + $this->SetXY(165, $yValue); + $this->Cell(20, 6, number_format($tvaAmount, 2, '.', '') . chr(128), 0, 0, 'C'); + // Prix TTC + $this->SetXY(182, $yValue); + $this->Cell(25, 6, number_format($valueTtc, 2, '.', '') . chr(128), 0, 1, 'C'); + } else { + // Sans TVA : seulement Prix HT + $this->SetXY(167, $yValue); // Décalé de 167 au lieu de 165 + $this->Cell(25, 6, number_format($valueHt, 2, '.', '') . chr(128), 0, 1, 'C'); + } + $yValue += 12; } - return [ - "TOTAL HT" => $totalHt, - "TVA " . $tvaLabel => $totalTva, - "TOTAL TTC" => $totalTtc - ]; + // Construire le tableau de retour selon la TVA + if ($this->hasTva) { + $result = [ + "TOTAL HT" => $totalHt, + "TVA " . $tvaDefault . "%" => $totalTva, + "TOTAL TTC" => $totalTtc + ]; + } else { + $result = [ + "TOTAL HT" => $totalHt + ]; + } + + return $result; } private function DrawBankAndTotalPriceInfo($totalPriceArray) diff --git a/gestion/lib/Service/InvoicePdfService.php b/gestion/lib/Service/InvoicePdfService.php index 15f4729..cbbdf34 100644 --- a/gestion/lib/Service/InvoicePdfService.php +++ b/gestion/lib/Service/InvoicePdfService.php @@ -171,9 +171,9 @@ class InvoicePdfService } // NOUVELLE LOGIQUE : Vérifier si TVA exonérée - if ($this->isTvaExempt($invoicePdfData)) { + /*if ($this->isTvaExempt($invoicePdfData)) { return $this->generateWithHtmlTemplate($invoicePdfData, $storage); - } + }*/ $templateType = $invoicePdfData['template_type_key']; $clean_folder = html_entity_decode(string: $currentConfig->path).'/'; @@ -356,48 +356,7 @@ class InvoicePdfService $clean_folder = html_entity_decode(string: $invoicePdfData['configuration']->path).'/'; $factureFolders = $this->getGroupFactureFolder($invoicePdfData, $clean_folder); $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) { - echo "ERROR creating folder '$relativeFolder': " . $e->getMessage(); - exit; - } - - // --- 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) { - echo "ERROR on file '$ff_pdf': " . $e->getMessage(); - exit; - } - } - + $filenames = $this->savePdfToFolders($factureFolders, $pdfFilename, $pdfContent, $storage); $this->gestionBdd->setFactureGeneratedDate($invoicePdfData['id']); return [ @@ -424,15 +383,6 @@ class InvoicePdfService } } - // Vérification alternative dans les totaux si la première méthode ne fonctionne pas - if (isset($invoicePdfData['totalPrices'])) { - foreach ($invoicePdfData['totalPrices'] as $label => $amount) { - if (strpos($label, 'TVA') !== false && (strpos($label, 'exonéré') !== false || $amount == 0)) { - return true; - } - } - } - return false; } @@ -652,32 +602,8 @@ class InvoicePdfService $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; - } + $ff_pdf = $folder . $pdfFilename . '.pdf'; - // --- 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); @@ -688,7 +614,6 @@ class InvoicePdfService $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; } }