Fix double-entry accounting - create separate debit and credit entries

- Create separate Bookkeeping instances for debit and credit
- Follow Dolibarr pattern: one entry per debit, one per credit
- Each entry has single montant with proper sens (D/C)
- Separate debug logging for debit vs credit entries
- Ensures proper double-entry bookkeeping structure
This commit is contained in:
Frank Cools 2025-10-08 22:09:15 +02:00
parent f2b8cbfef0
commit 097765bbf5

View File

@ -1228,45 +1228,64 @@ class DeclarationTVA
foreach ($entries as $entry) {
error_log("DEBUG: Creating accounting entry for account: " . $entry['account_code'] . ", debit: " . $entry['debit'] . ", credit: " . $entry['credit']);
// Create new instance for each entry
$bookkeeping = new Bookkeeping($this->db);
// Prepare amounts and determine debit/credit
// Prepare amounts
$debit_amount = !empty($entry['debit']) ? (float)$entry['debit'] : 0;
$credit_amount = !empty($entry['credit']) ? (float)$entry['credit'] : 0;
// Determine the amount and direction
// Create debit entry if amount > 0
if ($debit_amount > 0) {
$amount = $debit_amount;
$sens = 'D'; // Debit
} else {
$amount = $credit_amount;
$sens = 'C'; // Credit
$debit = new Bookkeeping($this->db);
$debit->doc_date = $declaration->end_date;
$debit->doc_ref = $declaration->declaration_name;
$debit->code_journal = 'OD';
$debit->numero_compte = $entry['account_code'];
$debit->label_compte = $entry['account_label'];
$debit->montant = $debit_amount;
$debit->sens = 'D';
$debit->fk_doc = $declaration->rowid;
$debit->fk_docdet = 0;
$debit->societe_type = 1;
$debit->fk_user_author = $user->id;
$debit->code_tiers = '';
$debit->piece_num = '';
$debit->import_key = '';
$debit->entity = $this->entity;
$result = $debit->create($user);
error_log("DEBUG: Debit entry create result: " . ($result ? "SUCCESS" : "FAILED - " . $debit->error));
if (!$result) {
$this->error = 'Failed to create debit entry: ' . $debit->error;
return false;
}
}
// Set all required fields for Bookkeeping class
$bookkeeping->doc_date = $declaration->end_date;
$bookkeeping->doc_ref = $declaration->declaration_name;
$bookkeeping->code_journal = 'OD'; // OD journal for VAT declarations
$bookkeeping->numero_compte = $entry['account_code'];
$bookkeeping->label_compte = $entry['account_label'];
$bookkeeping->montant = $amount;
$bookkeeping->sens = $sens;
$bookkeeping->fk_doc = $declaration->rowid;
$bookkeeping->fk_docdet = 0;
$bookkeeping->societe_type = 1;
$bookkeeping->fk_user_author = $user->id;
$bookkeeping->code_tiers = '';
$bookkeeping->piece_num = '';
$bookkeeping->import_key = '';
$bookkeeping->entity = $this->entity;
$result = $bookkeeping->create($user);
error_log("DEBUG: Bookkeeping create result: " . ($result ? "SUCCESS" : "FAILED - " . $bookkeeping->error));
if (!$result) {
$this->error = 'Failed to create accounting entry: ' . $bookkeeping->error;
return false;
// Create credit entry if amount > 0
if ($credit_amount > 0) {
$credit = new Bookkeeping($this->db);
$credit->doc_date = $declaration->end_date;
$credit->doc_ref = $declaration->declaration_name;
$credit->code_journal = 'OD';
$credit->numero_compte = $entry['account_code'];
$credit->label_compte = $entry['account_label'];
$credit->montant = $credit_amount;
$credit->sens = 'C';
$credit->fk_doc = $declaration->rowid;
$credit->fk_docdet = 0;
$credit->societe_type = 1;
$credit->fk_user_author = $user->id;
$credit->code_tiers = '';
$credit->piece_num = '';
$credit->import_key = '';
$credit->entity = $this->entity;
$result = $credit->create($user);
error_log("DEBUG: Credit entry create result: " . ($result ? "SUCCESS" : "FAILED - " . $credit->error));
if (!$result) {
$this->error = 'Failed to create credit entry: ' . $credit->error;
return false;
}
}
}