From 5256d21389c4c629ad538325030490443b8f9bed Mon Sep 17 00:00:00 2001 From: Frank Cools Date: Tue, 7 Oct 2025 11:26:38 +0200 Subject: [PATCH] Add journal entry table to PDF with OD journal entries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added addJournalEntryTable method to generate journal entries table - Table includes columns: Code compte, Libellé compte, Libellé écriture, Débit, Crédit - Extracts VAT accounts from line 8 (debit side, non-zero only) - Extracts accounts from line 20 (credit side, non-zero only) - Adds VAT result on account 4456700 (debit if < 0, credit if >= 0) - Adds rounding difference on 658000 (if < 0) or 758000 (if > 0) - Journal table starts on page 2 of the detailed PDF - Uses proper French accounting terminology and formatting --- core/class/declarationtva_pdf.class.php | 260 ++++++++++++++++++++++++ 1 file changed, 260 insertions(+) diff --git a/core/class/declarationtva_pdf.class.php b/core/class/declarationtva_pdf.class.php index b31105b..0566d85 100644 --- a/core/class/declarationtva_pdf.class.php +++ b/core/class/declarationtva_pdf.class.php @@ -945,6 +945,9 @@ class DeclarationTVA_PDF foreach ($lines_with_data as $line_code) { $this->addLineDetailPage($pdf, $declaration, $line_code); } + + // Add journal entry table starting on page 2 + $this->addJournalEntryTable($pdf, $declaration, $ca3_data); } /** @@ -1754,4 +1757,261 @@ class DeclarationTVA_PDF return $result; } + + /** + * Add journal entry table to PDF + * + * @param TCPDF $pdf PDF object + * @param DeclarationTVA $declaration Declaration object + * @param array $ca3_data CA-3 line data + */ + private function addJournalEntryTable($pdf, $declaration, $ca3_data) + { + // Start a new page for the journal table + $pdf->AddPage(); + + // Title + $pdf->SetFont('helvetica', 'B', 16); + $pdf->Cell(0, 10, 'Écritures du Journal OD', 0, 1, 'C'); + $pdf->Ln(10); + + // Create lookup array for CA-3 data + $ca3_lookup = array(); + foreach ($ca3_data as $line_data) { + $ca3_lookup[$line_data['ca3_line']] = $line_data; + } + + // Get journal entries + $journal_entries = $this->generateJournalEntries($declaration, $ca3_lookup); + + if (empty($journal_entries)) { + $pdf->SetFont('helvetica', '', 12); + $pdf->Cell(0, 8, 'Aucune écriture à générer.', 0, 1); + return; + } + + // Table header + $pdf->SetFont('helvetica', 'B', 10); + $pdf->SetFillColor(240, 240, 240); + + // Column widths + $col_widths = array(25, 50, 60, 25, 25); + $col_headers = array('Code compte', 'Libellé compte', 'Libellé écriture', 'Débit', 'Crédit'); + + // Draw header + for ($i = 0; $i < count($col_headers); $i++) { + $pdf->Cell($col_widths[$i], 8, $col_headers[$i], 1, 0, 'C', true); + } + $pdf->Ln(); + + // Table content + $pdf->SetFont('helvetica', '', 9); + $pdf->SetFillColor(255, 255, 255); + + foreach ($journal_entries as $entry) { + $pdf->Cell($col_widths[0], 6, $entry['account_code'], 1, 0, 'C'); + $pdf->Cell($col_widths[1], 6, $entry['account_label'], 1, 0, 'L'); + $pdf->Cell($col_widths[2], 6, $entry['entry_label'], 1, 0, 'L'); + $pdf->Cell($col_widths[3], 6, $entry['debit'], 1, 0, 'R'); + $pdf->Cell($col_widths[4], 6, $entry['credit'], 1, 0, 'R'); + $pdf->Ln(); + } + } + + /** + * Generate journal entries based on CA-3 data + * + * @param DeclarationTVA $declaration Declaration object + * @param array $ca3_lookup CA-3 data lookup array + * @return array Journal entries + */ + private function generateJournalEntries($declaration, $ca3_lookup) + { + $entries = array(); + + // Get line 8 VAT accounts (debit side, non-zero only) + $line8_entries = $this->getLine8VATAccounts($declaration, $ca3_lookup); + $entries = array_merge($entries, $line8_entries); + + // Get line 20 accounts (credit side, non-zero only) + $line20_entries = $this->getLine20Accounts($declaration, $ca3_lookup); + $entries = array_merge($entries, $line20_entries); + + // Add VAT result on account 4456700 + $vat_result_entry = $this->getVATResultEntry($ca3_lookup); + if ($vat_result_entry) { + $entries[] = $vat_result_entry; + } + + // Add rounding difference + $rounding_entry = $this->getRoundingEntry($ca3_lookup); + if ($rounding_entry) { + $entries[] = $rounding_entry; + } + + return $entries; + } + + /** + * Get line 8 VAT accounts for debit side + * + * @param DeclarationTVA $declaration Declaration object + * @param array $ca3_lookup CA-3 data lookup array + * @return array Journal entries + */ + private function getLine8VATAccounts($declaration, $ca3_lookup) + { + $entries = array(); + + if (!isset($ca3_lookup['08'])) { + return $entries; + } + + $line8_data = $ca3_lookup['08']; + $line8_details = $declaration->getCA3LineDetails($declaration->rowid, '08'); + + if (empty($line8_details) || empty($line8_details['account_details'])) { + return $entries; + } + + foreach ($line8_details['account_details'] as $account) { + if ($account['vat_amount'] > 0) { + $entries[] = array( + 'account_code' => $account['account_number'], + 'account_label' => $account['account_label'], + 'entry_label' => 'TVA due - Ligne 08', + 'debit' => $this->formatAmount($account['vat_amount']), + 'credit' => '' + ); + } + } + + return $entries; + } + + /** + * Get line 20 accounts for credit side + * + * @param DeclarationTVA $declaration Declaration object + * @param array $ca3_lookup CA-3 data lookup array + * @return array Journal entries + */ + private function getLine20Accounts($declaration, $ca3_lookup) + { + $entries = array(); + + if (!isset($ca3_lookup['20'])) { + return $entries; + } + + $line20_data = $ca3_lookup['20']; + $line20_details = $declaration->getCA3LineDetails($declaration->rowid, '20'); + + if (empty($line20_details) || empty($line20_details['account_details'])) { + return $entries; + } + + foreach ($line20_details['account_details'] as $account) { + if ($account['vat_amount'] > 0) { + $entries[] = array( + 'account_code' => $account['account_number'], + 'account_label' => $account['account_label'], + 'entry_label' => 'TVA déductible - Ligne 20', + 'debit' => '', + 'credit' => $this->formatAmount($account['vat_amount']) + ); + } + } + + return $entries; + } + + /** + * Get VAT result entry on account 4456700 + * + * @param array $ca3_lookup CA-3 data lookup array + * @return array|null Journal entry + */ + private function getVATResultEntry($ca3_lookup) + { + // Calculate VAT result (line 28 - line 29) + $line28_amount = isset($ca3_lookup['28']) ? $ca3_lookup['28']['vat_amount'] : 0; + $line29_amount = isset($ca3_lookup['29']) ? $ca3_lookup['29']['vat_amount'] : 0; + $vat_result = $line28_amount - $line29_amount; + + if ($vat_result == 0) { + return null; + } + + $entry = array( + 'account_code' => '4456700', + 'account_label' => 'TVA à payer', + 'entry_label' => 'Résultat TVA (L28-L29)', + 'debit' => '', + 'credit' => '' + ); + + if ($vat_result < 0) { + $entry['debit'] = $this->formatAmount(abs($vat_result)); + } else { + $entry['credit'] = $this->formatAmount($vat_result); + } + + return $entry; + } + + /** + * Get rounding difference entry + * + * @param array $ca3_lookup CA-3 data lookup array + * @return array|null Journal entry + */ + private function getRoundingEntry($ca3_lookup) + { + // Calculate rounding difference + $total_vat_due = 0; + $total_vat_deductible = 0; + + // Sum all VAT due amounts + foreach ($ca3_lookup as $line_data) { + if (in_array($line_data['ca3_line'], array('08', '09', '9B', '17'))) { + $total_vat_due += $line_data['vat_amount']; + } + } + + // Sum all VAT deductible amounts + foreach ($ca3_lookup as $line_data) { + if (in_array($line_data['ca3_line'], array('19', '20', '21', '22'))) { + $total_vat_deductible += $line_data['vat_amount']; + } + } + + $vat_result = $total_vat_due - $total_vat_deductible; + $rounded_result = round($vat_result); + $rounding_diff = $vat_result - $rounded_result; + + if (abs($rounding_diff) < 0.01) { + return null; // No rounding difference + } + + $entry = array( + 'account_code' => '', + 'account_label' => '', + 'entry_label' => 'Différence d\'arrondi', + 'debit' => '', + 'credit' => '' + ); + + if ($rounding_diff < 0) { + $entry['account_code'] = '658000'; + $entry['account_label'] = 'Charges exceptionnelles'; + $entry['debit'] = $this->formatAmount(abs($rounding_diff)); + } else { + $entry['account_code'] = '758000'; + $entry['account_label'] = 'Produits exceptionnels'; + $entry['credit'] = $this->formatAmount($rounding_diff); + } + + return $entry; + } }