drawTableStructure($pdf, $numPage, $nbPage, $sansMontant); $this->addTableHeaders($pdf, $sansMontant); $this->populateTableData($pdf, $dataDevis, $pagination['current_index'], $itemsToProcess, $totals, $sansMontant); // Afficher les totaux seulement sur la dernière page ET si les montants sont affichés if ($numPage == $nbPage && !$sansMontant) { $this->addTableTotals($pdf, $totals); } } private function drawTableStructure($pdf, $numPage, $nbPage, $sansMontant) { $pdf->SetLineWidth(0.2); $pdf->Rect(5, 105, 200, 130, "D"); $pdf->Line(5, 115, 205, 115); // Si c'est la dernière page ET qu'on affiche les montants, ligne de total à 225 $endY = ($numPage == $nbPage && !$sansMontant) ? 225 : 235; if (!$sansMontant) { // AVEC montants : toutes les colonnes $verticalLines = [25, 45, 70, 90, 125, 155, 175, 190]; } else { // SANS montants : seulement jusqu'à Défunt $verticalLines = [35, 70, 105, 125, 155]; } foreach ($verticalLines as $x) { $pdf->Line($x, 105, $x, $endY); } } private function addTableHeaders($pdf, $sansMontant) { $pdf->SetFont('Arial', 'B', 8); if (!$sansMontant) { // AVEC montants $headers = [ [5, 20, mb_convert_encoding(html_entity_decode("N° Devis"), 'ISO-8859-1', 'UTF-8')], [25, 20, mb_convert_encoding(html_entity_decode("N° Dossier"), 'ISO-8859-1', 'UTF-8')], [45, 25, mb_convert_encoding(html_entity_decode("N° Commande"), 'ISO-8859-1', 'UTF-8')], [70, 20, "Date"], [90, 35, "Lieu du soin"], [125, 30, \OCA\Gestion\Helpers\FileExportHelpers::FormatTextForExport("Défunt")], [155, 20, "H.T."], [175, 15, "TVA 20%"], [190, 15, "T.T.C"] ]; } else { // SANS montants - colonnes plus larges $headers = [ [5, 30, mb_convert_encoding(html_entity_decode("N° Devis"), 'ISO-8859-1', 'UTF-8')], [35, 35, mb_convert_encoding(html_entity_decode("N° Dossier"), 'ISO-8859-1', 'UTF-8')], [70, 35, mb_convert_encoding(html_entity_decode("N° Commande"), 'ISO-8859-1', 'UTF-8')], [105, 20, "Date"], [125, 30, "Lieu du soin"], [155, 50, \OCA\Gestion\Helpers\FileExportHelpers::FormatTextForExport("Défunt")] ]; } foreach ($headers as $header) { $pdf->SetXY($header[0], 106); $pdf->Cell($header[1], 8, $header[2], 0, 0, 'C'); } } private function populateTableData($pdf, $dataDevis, $startIndex, $itemsToProcess, &$totals, $sansMontant) { $formatterDate = new \IntlDateFormatter('fr_FR', \IntlDateFormatter::SHORT, \IntlDateFormatter::NONE); $formatterDate->setPattern('dd-MMM'); $yDevis = 115; for ($i = $startIndex; $i < $startIndex + $itemsToProcess && $i < count($dataDevis); $i++) { $devis = $dataDevis[$i]; $dateSoin = new \DateTime($devis['devis_date']); $this->addTableRow($pdf, $devis, $formatterDate, $dateSoin, $yDevis, $sansMontant); // Calculer les totaux seulement si on affiche les montants if (!$sansMontant) { $totals['ht'] += $devis['montant_htc']; $totals['tva'] += $devis['montant_tva']; $totals['ttc'] += $devis['montant_ttc']; } $yDevis += 5; } } private function addTableRow($pdf, $devis, $formatterDate, $dateSoin, $yDevis, $sansMontant) { $pdf->SetFont('Arial', '', 7); if (!$sansMontant) { // AVEC montants $rowData = [ [6, 18, $devis['devis_full_number']], [26, 18, $devis['calendar_uuid']], [46, 23, $devis['num_commande']], [71, 18, mb_convert_encoding($formatterDate->format($dateSoin), 'ISO-8859-1', 'UTF-8')], [91, 33, \OCA\Gestion\Helpers\FileExportHelpers::FormatTextForExport($devis['lieu_nom'] ?? '')], // ← CORRECTION [126, 28, \OCA\Gestion\Helpers\FileExportHelpers::FormatTextForExport($devis['defunt_nom'] ?? '')], // ← CORRECTION [156, 18, number_format($devis['montant_htc'], 2, '.', '') . chr(128), 'C'], [176, 13, number_format($devis['montant_tva'], 2, '.', '') . chr(128), 'C'], [191, 13, number_format($devis['montant_ttc'], 2, '.', '') . chr(128), 'C'] ]; } else { // SANS montants - colonnes plus larges $rowData = [ [6, 28, $devis['devis_full_number']], [36, 33, $devis['calendar_uuid']], [71, 33, $devis['num_commande']], [106, 18, mb_convert_encoding($formatterDate->format($dateSoin), 'ISO-8859-1', 'UTF-8')], [126, 28, \OCA\Gestion\Helpers\FileExportHelpers::FormatTextForExport($devis['lieu_nom'] ?? '')], // ← CORRECTION [156, 48, \OCA\Gestion\Helpers\FileExportHelpers::FormatTextForExport($devis['defunt_nom'] ?? '')] // ← CORRECTION ]; } foreach ($rowData as $data) { $pdf->SetXY($data[0], $yDevis); $align = isset($data[3]) ? $data[3] : ''; $pdf->Cell($data[1], 5, $data[2], 0, 0, $align); } } private function addTableTotals($pdf, $totals) { // Cette méthode n'est appelée que si on affiche les montants (!$sansMontant) $pdf->Line(5, 225, 205, 225); $pdf->SetFont('Arial', 'B', 8); $pdf->SetXY(5, 225); $pdf->Cell(150, 8, 'TOTAL', 0, 0, 'C'); $pdf->SetXY(156, 225); $pdf->Cell(18, 8, number_format($totals['ht'], 2, '.', '') . chr(128), 0, 0, 'C'); $pdf->SetXY(176, 225); $pdf->Cell(13, 8, number_format($totals['tva'], 2, '.', '') . chr(128), 0, 0, 'C'); $pdf->SetXY(191, 225); $pdf->Cell(13, 8, number_format($totals['ttc'], 2, '.', '') . chr(128), 0, 0, 'C'); $pdf->SetXY(170, 240); $pdf->Cell(20, 8, 'TOTAL TTC', 0, 0, 'C'); $pdf->SetXY(190, 240); $pdf->Cell(15, 8, number_format($totals['ttc'], 2, '.', '') . chr(128), 0, 0, 'C'); $lines = [ [170, 240, 170, 248], [190, 240, 190, 248], [205, 240, 205, 248], [170, 240, 205, 240], [170, 248, 205, 248] ]; foreach ($lines as $line) { $pdf->Line($line[0], $line[1], $line[2], $line[3]); } } }