DeclarationTVA/declarationtva_view.php
Frank Cools 56ed838601 Implement CA-3 calculation system and recalculate functionality
Calculation System:
- Added getAccountMappings() to retrieve PCG account mappings
- Added createCA3Line() to create CA-3 line records
- Added updateDeclarationTotals() to update declaration totals
- Added recalculateCA3Amounts() for recalculation functionality
- Enhanced getAccountAmounts() to query Dolibarr accounting entries

Recalculate Button:
- Added recalculate button to declaration view page
- Added action handling for recalculate functionality
- Added success/error messages for recalculation
- Added translations for recalculate functionality

The calculation system now:
- Queries actual accounting data from Dolibarr
- Creates detailed CA-3 line records
- Updates declaration totals automatically
- Allows manual recalculation of amounts
2025-10-02 20:42:29 +02:00

187 lines
6.1 KiB
PHP

<?php
/**
* DeclarationTVA View Declaration
* French CA-3 VAT Declaration Module for Dolibarr
* MVP Version - Phase 1
*/
// 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';
} else {
$res = 0;
}
if (!$res) {
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';
require_once DOL_DOCUMENT_ROOT . '/custom/declarationtva/core/class/declarationtva_period.class.php';
// Access control
if (!$user->hasRight("declarationtva", "declarationtva", "read")) {
accessforbidden();
}
// Load language files
$langs->load("declarationtva@declarationtva");
// Get declaration ID
$id = GETPOST('id', 'int');
if (empty($id)) {
accessforbidden();
}
// Handle actions
$action = GETPOST('action', 'alpha');
$token = GETPOST('token', 'alpha');
if ($action == 'recalculate' && $token) {
if ($declarationtva->recalculateCA3Amounts($id)) {
setEventMessages($langs->trans("DeclarationRecalculated"), null, 'mesgs');
} else {
setEventMessages($langs->trans("ErrorRecalculatingDeclaration"), null, 'errors');
}
}
// Initialize objects
$declarationtva = new DeclarationTVA($db, $conf->entity);
$config = new DeclarationTVA_Config($db, $conf->entity);
$period = new DeclarationTVA_Period($db, $conf->entity);
// Fetch declaration
if ($declarationtva->fetch($id) < 0) {
setEventMessages($langs->trans("DeclarationNotFound"), null, 'errors');
header("Location: declarationtvaindex.php");
exit;
}
// Get period information
$period_info = array();
if ($declarationtva->period_id > 0) {
$period->fetch($declarationtva->period_id);
$period_info = array(
'name' => $period->period_name,
'start_date' => $period->start_date,
'end_date' => $period->end_date
);
}
// Page title
$title = $langs->trans("ViewDeclaration") . ' - ' . $declarationtva->declaration_number;
llxHeader('', $title);
// Print page header
print load_fiche_titre($title, '', 'title_accountancy');
// Print declaration details
print '<div class="fiche">';
print '<div class="titre">' . $langs->trans("DeclarationDetails") . '</div>';
print '<table class="noborder centpercent">';
print '<tr>';
print '<td class="fieldrequired">' . $langs->trans("DeclarationNumber") . '</td>';
print '<td>' . $declarationtva->declaration_number . '</td>';
print '</tr>';
print '<tr>';
print '<td>' . $langs->trans("DeclarationName") . '</td>';
print '<td>' . $declarationtva->declaration_name . '</td>';
print '</tr>';
print '<tr>';
print '<td>' . $langs->trans("Period") . '</td>';
print '<td>' . $period_info['name'] . '</td>';
print '</tr>';
print '<tr>';
print '<td>' . $langs->trans("DateRange") . '</td>';
print '<td>' . dol_print_date($period_info['start_date'], 'day') . ' - ' . dol_print_date($period_info['end_date'], 'day') . '</td>';
print '</tr>';
print '<tr>';
print '<td>' . $langs->trans("Status") . '</td>';
print '<td>' . $langs->trans("Status" . ucfirst($declarationtva->status)) . '</td>';
print '</tr>';
print '<tr>';
print '<td>' . $langs->trans("CreatedDate") . '</td>';
print '<td>' . dol_print_date($declarationtva->created_date, 'dayhour') . '</td>';
print '</tr>';
print '</table>';
print '</div>';
// Print CA-3 amounts (placeholder for now)
print '<div class="fiche">';
print '<div class="titre">' . $langs->trans("CA3Amounts") . '</div>';
print '<table class="noborder centpercent">';
print '<tr class="liste_titre">';
print '<th>' . $langs->trans("CA3Line") . '</th>';
print '<th>' . $langs->trans("Description") . '</th>';
print '<th>' . $langs->trans("Amount") . '</th>';
print '</tr>';
// Placeholder CA-3 lines
$ca3_lines = array(
'A1' => array('desc' => 'Opérations imposables (ventes/prestations)', 'amount' => 0),
'A2' => array('desc' => 'Opérations imposables spéciales', 'amount' => 0),
'A3' => array('desc' => 'Services achetés non établis', 'amount' => 0),
'A4' => array('desc' => 'Importations', 'amount' => 0),
'A5' => array('desc' => 'Sorties de régimes suspensifs', 'amount' => 0),
'08' => array('desc' => 'Autres opérations imposables', 'amount' => 0),
'09' => array('desc' => 'Opérations exonérées', 'amount' => 0),
'9B' => array('desc' => 'Opérations non imposables', 'amount' => 0),
'17' => array('desc' => 'TVA due acquisitions intracommunautaires', 'amount' => 0),
'20' => array('desc' => 'TVA déductible immobilisations', 'amount' => 0),
'21' => array('desc' => 'TVA déductible autres biens/services', 'amount' => 0),
'22' => array('desc' => 'Crédit de TVA reportable', 'amount' => 0),
'25' => array('desc' => 'TVA brute due', 'amount' => 0),
'26' => array('desc' => 'TVA déductible totale', 'amount' => 0),
'28' => array('desc' => 'TVA nette à payer', 'amount' => 0),
'29' => array('desc' => 'Crédit de TVA', 'amount' => 0)
);
foreach ($ca3_lines as $line => $data) {
print '<tr>';
print '<td>' . $line . '</td>';
print '<td>' . $data['desc'] . '</td>';
print '<td class="right">' . price($data['amount']) . '</td>';
print '</tr>';
}
print '</table>';
print '</div>';
// Print actions
print '<div class="fiche">';
print '<div class="titre">' . $langs->trans("Actions") . '</div>';
print '<div class="center">';
// Recalculate button (always available)
print '<a href="' . $_SERVER['PHP_SELF'] . '?id=' . $id . '&action=recalculate&token=' . newToken() . '" class="butAction">' . $langs->trans("Recalculate") . '</a> ';
if ($declarationtva->status == 'draft') {
print '<a href="' . $_SERVER['PHP_SELF'] . '?id=' . $id . '&action=validate" class="butAction">' . $langs->trans("Validate") . '</a> ';
} elseif ($declarationtva->status == 'validated') {
print '<a href="' . $_SERVER['PHP_SELF'] . '?id=' . $id . '&action=submit" class="butAction">' . $langs->trans("Submit") . '</a> ';
}
print '<a href="declarationtvaindex.php" class="butAction">' . $langs->trans("BackToList") . '</a>';
print '</div>';
print '</div>';
// Print footer
llxFooter();
?>