diff --git a/core/class/declarationtva.class.php b/core/class/declarationtva.class.php
index ac9f361..c1c95c8 100644
--- a/core/class/declarationtva.class.php
+++ b/core/class/declarationtva.class.php
@@ -855,4 +855,95 @@ class DeclarationTVA
return $this->calculateCA3Amounts($declaration_id, $period);
}
+
+ /**
+ * Get detailed account breakdown for a specific CA-3 line
+ *
+ * @param int $declaration_id Declaration ID
+ * @param string $ca3_line CA-3 line code (e.g., 'A1', '08', '09', etc.)
+ * @return array Detailed breakdown with accounts and amounts
+ */
+ public function getCA3LineDetails($declaration_id, $ca3_line)
+ {
+ // Get declaration dates
+ $sql = "SELECT start_date, end_date FROM " . MAIN_DB_PREFIX . "declarationtva_declarations
+ WHERE rowid = " . (int)$declaration_id . " AND entity = " . $this->entity;
+
+ $result = $this->db->query($sql);
+ if (!$result || $this->db->num_rows($result) == 0) {
+ return array();
+ }
+
+ $obj = $this->db->fetch_object($result);
+ $start_date = $obj->start_date;
+ $end_date = $obj->end_date;
+
+ // Get account mappings for this CA-3 line
+ $mappings = $this->getAccountMappings();
+ $line_mappings = array();
+
+ // Find mappings for this specific line
+ foreach ($mappings as $mapping) {
+ if ($mapping['ca3_line'] == $ca3_line) {
+ $line_mappings[] = $mapping;
+ }
+ }
+
+ $details = array();
+ $total_base = 0;
+ $total_vat = 0;
+ $total_amount = 0;
+
+ // Process each mapped account
+ foreach ($line_mappings as $mapping) {
+ $account_code = $mapping['account_code'];
+ $account_label = $mapping['account_label'];
+
+ // Get account amounts for this period
+ $amounts = $this->getAccountAmounts($account_code, $start_date, $end_date);
+
+ $account_detail = array(
+ 'account_code' => $account_code,
+ 'account_label' => $account_label,
+ 'base_amount' => $amounts['base_amount'],
+ 'vat_amount' => $amounts['vat_amount'],
+ 'total_amount' => $amounts['total_amount'],
+ 'mapping_type' => $mapping['ca3_line'] // Will be 'A1', '08_BASE', '08_VAT', etc.
+ );
+
+ $details[] = $account_detail;
+
+ // Accumulate totals
+ $total_base += $amounts['base_amount'];
+ $total_vat += $amounts['vat_amount'];
+ $total_amount += $amounts['total_amount'];
+ }
+
+ // Get the calculated line total from CA-3 lines table
+ $sql_line = "SELECT base_amount, vat_amount, total_amount, line_label
+ FROM " . MAIN_DB_PREFIX . "declarationtva_ca3_lines
+ WHERE declaration_id = " . (int)$declaration_id . "
+ AND ca3_line = '" . $this->db->escape($ca3_line) . "'";
+
+ $result_line = $this->db->query($sql_line);
+ $calculated_line = null;
+ if ($result_line && $this->db->num_rows($result_line) > 0) {
+ $calculated_line = $this->db->fetch_object($result_line);
+ }
+
+ return array(
+ 'ca3_line' => $ca3_line,
+ 'declaration_id' => $declaration_id,
+ 'start_date' => $start_date,
+ 'end_date' => $end_date,
+ 'account_details' => $details,
+ 'calculated_line' => $calculated_line,
+ 'totals' => array(
+ 'base_amount' => $total_base,
+ 'vat_amount' => $total_vat,
+ 'total_amount' => $total_amount
+ ),
+ 'account_count' => count($details)
+ );
+ }
}
diff --git a/declarationtva_line_details.php b/declarationtva_line_details.php
new file mode 100644
index 0000000..96118c2
--- /dev/null
+++ b/declarationtva_line_details.php
@@ -0,0 +1,183 @@
+hasRight("declarationtva", "declarationtva", "read")) {
+ accessforbidden();
+}
+
+// Get parameters
+$declaration_id = GETPOST('declaration_id', 'int');
+$ca3_line = GETPOST('ca3_line', 'alpha');
+
+// Validate parameters
+if (empty($declaration_id) || empty($ca3_line)) {
+ setEventMessages($langs->trans("ErrorMissingParameters"), null, 'errors');
+ header("Location: declarationtvaindex.php");
+ exit;
+}
+
+// Initialize objects
+$declarationtva = new DeclarationTVA($db);
+$config = new DeclarationTVA_Config($db);
+
+// Get declaration info
+if (!$declarationtva->fetch($declaration_id)) {
+ setEventMessages($langs->trans("DeclarationNotFound"), null, 'errors');
+ header("Location: declarationtvaindex.php");
+ exit;
+}
+
+// Get detailed breakdown
+$line_details = $declarationtva->getCA3LineDetails($declaration_id, $ca3_line);
+
+if (empty($line_details)) {
+ setEventMessages($langs->trans("NoDataFoundForLine"), null, 'errors');
+ header("Location: declarationtva_view.php?id=" . $declaration_id);
+ exit;
+}
+
+// Get CA-3 line definition
+$ca3_definitions = $config->getCA3LineDefinitions();
+$line_definition = isset($ca3_definitions[$ca3_line]) ? $ca3_definitions[$ca3_line] : null;
+
+// Page title
+$title = $langs->trans("CA3LineDetails") . " - " . $ca3_line;
+if ($line_definition) {
+ $title .= " - " . $line_definition['label'];
+}
+
+// Load page header
+llxHeader('', $title);
+
+// Page header
+print load_fiche_titre($title, '', 'fa-list-alt');
+
+// Breadcrumb
+print '
';
+
+// Declaration info
+print '';
+print '
';
+print '
';
+print '';
+print '| ' . $langs->trans("DeclarationInfo") . ' | ';
+print '
';
+print '';
+print '| ' . $langs->trans("DeclarationNumber") . ' | ';
+print '' . $declarationtva->declaration_number . ' | ';
+print '
';
+print '';
+print '| ' . $langs->trans("Period") . ' | ';
+print '' . dol_print_date($declarationtva->start_date, 'day') . ' - ' . dol_print_date($declarationtva->end_date, 'day') . ' | ';
+print '
';
+print '';
+print '| ' . $langs->trans("CA3Line") . ' | ';
+print '' . $ca3_line . ' | ';
+print '
';
+if ($line_definition) {
+ print '';
+ print '| ' . $langs->trans("Description") . ' | ';
+ print '' . $line_definition['label'] . ' | ';
+ print '
';
+}
+print '
';
+print '
';
+
+print '
';
+print '
';
+print '';
+print '| ' . $langs->trans("LineSummary") . ' | ';
+print '
';
+print '';
+print '| ' . $langs->trans("AccountCount") . ' | ';
+print '' . $line_details['account_count'] . ' | ';
+print '
';
+if ($line_details['calculated_line']) {
+ print '';
+ print '| ' . $langs->trans("CalculatedTotal") . ' | ';
+ print '' . price($line_details['calculated_line']->total_amount) . ' | ';
+ print '
';
+}
+print '
';
+print '
';
+print '
';
+
+// Account details table
+print '';
+print '
';
+print '';
+print '| ' . $langs->trans("AccountCode") . ' | ';
+print '' . $langs->trans("AccountLabel") . ' | ';
+print '' . $langs->trans("BaseAmount") . ' | ';
+print '' . $langs->trans("VATAmount") . ' | ';
+print '' . $langs->trans("TotalAmount") . ' | ';
+print '' . $langs->trans("MappingType") . ' | ';
+print '
';
+
+$total_base = 0;
+$total_vat = 0;
+$total_amount = 0;
+
+foreach ($line_details['account_details'] as $account) {
+ $total_base += $account['base_amount'];
+ $total_vat += $account['vat_amount'];
+ $total_amount += $account['total_amount'];
+
+ print '';
+ print '| ' . $account['account_code'] . ' | ';
+ print '' . $account['account_label'] . ' | ';
+ print '' . price($account['base_amount']) . ' | ';
+ print '' . price($account['vat_amount']) . ' | ';
+ print '' . price($account['total_amount']) . ' | ';
+ print '' . $account['mapping_type'] . ' | ';
+ print '
';
+}
+
+// Totals row
+print '';
+print '| ' . $langs->trans("Total") . ' | ';
+print '' . price($total_base) . ' | ';
+print '' . price($total_vat) . ' | ';
+print '' . price($total_amount) . ' | ';
+print ' | ';
+print '
';
+
+print '
';
+print '
';
+
+// Additional info if calculated line exists
+if ($line_details['calculated_line']) {
+ print '';
+ print '' . $langs->trans("Note") . ': ';
+ print $langs->trans("CalculatedLineNote");
+ if (!empty($line_details['calculated_line']->line_label)) {
+ print '
' . $line_details['calculated_line']->line_label . '';
+ }
+ print '
';
+}
+
+// Close page
+llxFooter();
+?>
diff --git a/declarationtva_view.php b/declarationtva_view.php
index 19c6340..b930447 100644
--- a/declarationtva_view.php
+++ b/declarationtva_view.php
@@ -173,7 +173,7 @@ foreach ($section_a_lines as $line) {
$data = isset($ca3_data[$line]) ? $ca3_data[$line] : array('line_label' => '', 'vat_amount' => 0);
$description = isset($ca3_definitions[$line]) ? $ca3_definitions[$line]['label'] : $data['line_label'];
print '';
- print '| ' . $line . ' | ';
+ print '' . $line . ' | ';
print '' . $description . ' | ';
print '' . formatAmountWithOriginal($data['vat_amount'], $data['line_label']) . ' | ';
print '
';
@@ -201,7 +201,7 @@ foreach ($base_vat_lines as $line) {
$data = isset($ca3_data[$line]) ? $ca3_data[$line] : array('line_label' => '', 'base_amount' => 0, 'vat_amount' => 0);
$description = isset($ca3_definitions[$line]) ? $ca3_definitions[$line]['label'] : $data['line_label'];
print '';
- print '| ' . $line . ' | ';
+ print '' . $line . ' | ';
print '' . $description . ' | ';
print '' . formatAmountWithOriginal($data['base_amount'], $data['line_label'], 'base') . ' | ';
print '' . formatAmountWithOriginal($data['vat_amount'], $data['line_label']) . ' | ';
@@ -226,7 +226,7 @@ print '
';
$data = isset($ca3_data['17']) ? $ca3_data['17'] : array('line_label' => '', 'vat_amount' => 0);
$description = isset($ca3_definitions['17']) ? $ca3_definitions['17']['label'] : $data['line_label'];
print '';
-print '| 17 | ';
+print '17 | ';
print '' . $description . ' | ';
print '' . formatAmountWithOriginal($data['vat_amount'], $data['line_label']) . ' | ';
print '
';
@@ -247,7 +247,7 @@ foreach ($section_c_lines as $line) {
$data = isset($ca3_data[$line]) ? $ca3_data[$line] : array('line_label' => '', 'vat_amount' => 0);
$description = isset($ca3_definitions[$line]) ? $ca3_definitions[$line]['label'] : $data['line_label'];
print '';
- print '| ' . $line . ' | ';
+ print '' . $line . ' | ';
print '' . $description . ' | ';
print '' . formatAmountWithOriginal($data['vat_amount'], $data['line_label']) . ' | ';
print '
';
@@ -284,7 +284,7 @@ foreach ($section_d_lines as $line) {
}
print '';
- print '| ' . $line . ' | ';
+ print '' . $line . ' | ';
print '' . $description . ' | ';
print '' . formatAmount($data['vat_amount']) . ' | ';
print '
';
diff --git a/langs/en_US/declarationtva.lang b/langs/en_US/declarationtva.lang
index ef7beda..6485d2c 100644
--- a/langs/en_US/declarationtva.lang
+++ b/langs/en_US/declarationtva.lang
@@ -441,3 +441,19 @@ BaseAmount = Base Amount
VATAmount = VAT Amount
TotalAmount = Total Amount
BaseHTAndVATByRate = Base HT and VAT by Rate
+
+# Detailed view translations
+CA3LineDetails = CA-3 Line Details
+BackToDeclaration = Back to Declaration
+DeclarationInfo = Declaration Information
+LineSummary = Line Summary
+AccountCount = Account Count
+CalculatedTotal = Calculated Total
+AccountCode = Account Code
+AccountLabel = Account Label
+MappingType = Mapping Type
+Total = Total
+Note = Note
+CalculatedLineNote = This line shows the detail of accounts used to calculate the CA-3 line. Amounts may differ slightly from the calculated total due to rounding.
+ErrorMissingParameters = Missing parameters
+NoDataFoundForLine = No data found for this line
diff --git a/langs/fr_FR/declarationtva.lang b/langs/fr_FR/declarationtva.lang
index 621fae1..070d83b 100644
--- a/langs/fr_FR/declarationtva.lang
+++ b/langs/fr_FR/declarationtva.lang
@@ -430,3 +430,19 @@ BaseAmount = Base hors taxe
VATAmount = Taxe due
TotalAmount = Montant Total
BaseHTAndVATByRate = Base HT et TVA par taux
+
+# Detailed view translations
+CA3LineDetails = Détails de la ligne CA-3
+BackToDeclaration = Retour à la déclaration
+DeclarationInfo = Informations de la déclaration
+LineSummary = Résumé de la ligne
+AccountCount = Nombre de comptes
+CalculatedTotal = Total calculé
+AccountCode = Code compte
+AccountLabel = Libellé compte
+MappingType = Type de mapping
+Total = Total
+Note = Note
+CalculatedLineNote = Cette ligne montre le détail des comptes utilisés pour calculer la ligne CA-3. Les montants peuvent différer légèrement du total calculé en raison des arrondis.
+ErrorMissingParameters = Paramètres manquants
+NoDataFoundForLine = Aucune donnée trouvée pour cette ligne