Implement clickable CA-3 lines with detailed account breakdown
Features added: - New getCA3LineDetails() method in DeclarationTVA class - New declarationtva_line_details.php page for detailed view - All CA-3 line codes are now clickable in declaration view - Detailed breakdown shows: * Account codes and labels * Base amounts, VAT amounts, total amounts * Mapping types (A1, 08_BASE, 08_VAT, etc.) * Calculated totals vs account totals - Added comprehensive translations for detailed view - Navigation breadcrumbs and back buttons - Professional styling with Dolibarr UI components This provides complete transparency into which accounts contribute to each CA-3 line without touching the calculation logic.
This commit is contained in:
parent
7ca85d982d
commit
b0934c55d4
@ -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)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
183
declarationtva_line_details.php
Normal file
183
declarationtva_line_details.php
Normal file
@ -0,0 +1,183 @@
|
||||
<?php
|
||||
/**
|
||||
* DeclarationTVA Line Details Page
|
||||
* Shows detailed breakdown of accounts for a specific CA-3 line
|
||||
*/
|
||||
|
||||
// Load Dolibarr environment
|
||||
if (file_exists('../main.inc.php')) {
|
||||
$res = @include '../main.inc.php';
|
||||
} elseif (file_exists('../../main.inc.php')) {
|
||||
$res = @include '../../main.inc.php';
|
||||
} elseif (file_exists('../../../main.inc.php')) {
|
||||
$res = @include '../../../main.inc.php';
|
||||
} else {
|
||||
die("Include of main fails");
|
||||
}
|
||||
|
||||
// Load module classes
|
||||
require_once DOL_DOCUMENT_ROOT . '/custom/declarationtva/core/class/declarationtva.class.php';
|
||||
require_once DOL_DOCUMENT_ROOT . '/custom/declarationtva/core/class/declarationtva_config.class.php';
|
||||
|
||||
// Access control
|
||||
if (!$user->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 '<div class="tabsAction">';
|
||||
print '<a href="declarationtvaindex.php" class="butAction">' . $langs->trans("BackToList") . '</a>';
|
||||
print '<a href="declarationtva_view.php?id=' . $declaration_id . '" class="butAction">' . $langs->trans("BackToDeclaration") . '</a>';
|
||||
print '</div>';
|
||||
|
||||
// Declaration info
|
||||
print '<div class="fiche">';
|
||||
print '<div class="fichehalfleft">';
|
||||
print '<table class="noborder centpercent">';
|
||||
print '<tr class="liste_titre">';
|
||||
print '<th colspan="2">' . $langs->trans("DeclarationInfo") . '</th>';
|
||||
print '</tr>';
|
||||
print '<tr>';
|
||||
print '<td>' . $langs->trans("DeclarationNumber") . '</td>';
|
||||
print '<td>' . $declarationtva->declaration_number . '</td>';
|
||||
print '</tr>';
|
||||
print '<tr>';
|
||||
print '<td>' . $langs->trans("Period") . '</td>';
|
||||
print '<td>' . dol_print_date($declarationtva->start_date, 'day') . ' - ' . dol_print_date($declarationtva->end_date, 'day') . '</td>';
|
||||
print '</tr>';
|
||||
print '<tr>';
|
||||
print '<td>' . $langs->trans("CA3Line") . '</td>';
|
||||
print '<td><strong>' . $ca3_line . '</strong></td>';
|
||||
print '</tr>';
|
||||
if ($line_definition) {
|
||||
print '<tr>';
|
||||
print '<td>' . $langs->trans("Description") . '</td>';
|
||||
print '<td>' . $line_definition['label'] . '</td>';
|
||||
print '</tr>';
|
||||
}
|
||||
print '</table>';
|
||||
print '</div>';
|
||||
|
||||
print '<div class="fichehalfright">';
|
||||
print '<table class="noborder centpercent">';
|
||||
print '<tr class="liste_titre">';
|
||||
print '<th colspan="2">' . $langs->trans("LineSummary") . '</th>';
|
||||
print '</tr>';
|
||||
print '<tr>';
|
||||
print '<td>' . $langs->trans("AccountCount") . '</td>';
|
||||
print '<td><strong>' . $line_details['account_count'] . '</strong></td>';
|
||||
print '</tr>';
|
||||
if ($line_details['calculated_line']) {
|
||||
print '<tr>';
|
||||
print '<td>' . $langs->trans("CalculatedTotal") . '</td>';
|
||||
print '<td><strong>' . price($line_details['calculated_line']->total_amount) . '</strong></td>';
|
||||
print '</tr>';
|
||||
}
|
||||
print '</table>';
|
||||
print '</div>';
|
||||
print '</div>';
|
||||
|
||||
// Account details table
|
||||
print '<div class="fiche">';
|
||||
print '<table class="noborder centpercent">';
|
||||
print '<tr class="liste_titre">';
|
||||
print '<th>' . $langs->trans("AccountCode") . '</th>';
|
||||
print '<th>' . $langs->trans("AccountLabel") . '</th>';
|
||||
print '<th class="right">' . $langs->trans("BaseAmount") . '</th>';
|
||||
print '<th class="right">' . $langs->trans("VATAmount") . '</th>';
|
||||
print '<th class="right">' . $langs->trans("TotalAmount") . '</th>';
|
||||
print '<th>' . $langs->trans("MappingType") . '</th>';
|
||||
print '</tr>';
|
||||
|
||||
$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 '<tr class="oddeven">';
|
||||
print '<td><strong>' . $account['account_code'] . '</strong></td>';
|
||||
print '<td>' . $account['account_label'] . '</td>';
|
||||
print '<td class="right">' . price($account['base_amount']) . '</td>';
|
||||
print '<td class="right">' . price($account['vat_amount']) . '</td>';
|
||||
print '<td class="right">' . price($account['total_amount']) . '</td>';
|
||||
print '<td>' . $account['mapping_type'] . '</td>';
|
||||
print '</tr>';
|
||||
}
|
||||
|
||||
// Totals row
|
||||
print '<tr class="liste_titre">';
|
||||
print '<td colspan="2"><strong>' . $langs->trans("Total") . '</strong></td>';
|
||||
print '<td class="right"><strong>' . price($total_base) . '</strong></td>';
|
||||
print '<td class="right"><strong>' . price($total_vat) . '</strong></td>';
|
||||
print '<td class="right"><strong>' . price($total_amount) . '</strong></td>';
|
||||
print '<td></td>';
|
||||
print '</tr>';
|
||||
|
||||
print '</table>';
|
||||
print '</div>';
|
||||
|
||||
// Additional info if calculated line exists
|
||||
if ($line_details['calculated_line']) {
|
||||
print '<div class="info">';
|
||||
print '<strong>' . $langs->trans("Note") . ':</strong> ';
|
||||
print $langs->trans("CalculatedLineNote");
|
||||
if (!empty($line_details['calculated_line']->line_label)) {
|
||||
print '<br><em>' . $line_details['calculated_line']->line_label . '</em>';
|
||||
}
|
||||
print '</div>';
|
||||
}
|
||||
|
||||
// Close page
|
||||
llxFooter();
|
||||
?>
|
||||
@ -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 '<tr>';
|
||||
print '<td>' . $line . '</td>';
|
||||
print '<td><a href="declarationtva_line_details.php?declaration_id=' . $declarationtva->rowid . '&ca3_line=' . $line . '" class="butAction">' . $line . '</a></td>';
|
||||
print '<td colspan="2">' . $description . '</td>';
|
||||
print '<td class="right">' . formatAmountWithOriginal($data['vat_amount'], $data['line_label']) . '</td>';
|
||||
print '</tr>';
|
||||
@ -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 '<tr>';
|
||||
print '<td>' . $line . '</td>';
|
||||
print '<td><a href="declarationtva_line_details.php?declaration_id=' . $declarationtva->rowid . '&ca3_line=' . $line . '" class="butAction">' . $line . '</a></td>';
|
||||
print '<td>' . $description . '</td>';
|
||||
print '<td class="right">' . formatAmountWithOriginal($data['base_amount'], $data['line_label'], 'base') . '</td>';
|
||||
print '<td class="right">' . formatAmountWithOriginal($data['vat_amount'], $data['line_label']) . '</td>';
|
||||
@ -226,7 +226,7 @@ print '</tr>';
|
||||
$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 '<tr>';
|
||||
print '<td>17</td>';
|
||||
print '<td><a href="declarationtva_line_details.php?declaration_id=' . $declarationtva->rowid . '&ca3_line=17" class="butAction">17</a></td>';
|
||||
print '<td colspan="2">' . $description . '</td>';
|
||||
print '<td class="right">' . formatAmountWithOriginal($data['vat_amount'], $data['line_label']) . '</td>';
|
||||
print '</tr>';
|
||||
@ -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 '<tr>';
|
||||
print '<td>' . $line . '</td>';
|
||||
print '<td><a href="declarationtva_line_details.php?declaration_id=' . $declarationtva->rowid . '&ca3_line=' . $line . '" class="butAction">' . $line . '</a></td>';
|
||||
print '<td colspan="2">' . $description . '</td>';
|
||||
print '<td class="right">' . formatAmountWithOriginal($data['vat_amount'], $data['line_label']) . '</td>';
|
||||
print '</tr>';
|
||||
@ -284,7 +284,7 @@ foreach ($section_d_lines as $line) {
|
||||
}
|
||||
|
||||
print '<tr>';
|
||||
print '<td>' . $line . '</td>';
|
||||
print '<td><a href="declarationtva_line_details.php?declaration_id=' . $declarationtva->rowid . '&ca3_line=' . $line . '" class="butAction">' . $line . '</a></td>';
|
||||
print '<td colspan="2">' . $description . '</td>';
|
||||
print '<td class="right">' . formatAmount($data['vat_amount']) . '</td>';
|
||||
print '</tr>';
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user