Skip to content

Corrige le bilan pour les numéros de comptes complétés (455100, 281000…) - #66

Open
jcnoir wants to merge 2 commits into
romainsimon:masterfrom
jcnoir:fix/bilan-comptes-subdivises
Open

Corrige le bilan pour les numéros de comptes complétés (455100, 281000…)#66
jcnoir wants to merge 2 commits into
romainsimon:masterfrom
jcnoir:fix/bilan-comptes-subdivises

Conversation

@jcnoir

@jcnoir jcnoir commented Aug 3, 2026

Copy link
Copy Markdown

Closes #65

Problème

Avec un plan de comptes aux numéros complétés à 6 chiffres ou plus — la forme
standard des exports FEC des logiciels comptables (455100, 281000/210000…) —
le gabarit bilan de generate-statements.js affiche un bilan faussement
déséquilibré alors que la balance est équilibrée. Détail et reproduction minimale
dans l'issue liée.

Correctif (volontairement minimal — 22+/4−, un seul fichier)

  • Dettes : a === '455'a.startsWith('455') (compte courant d'associé et
    ses subdivisions PCG, ex. 4551 « Principal ») ; même correction pour 487x (PCA).
  • Amortissements/dépréciations : la règle historique d'appariement
    '28' + suffixe est conservée telle quelle ; les comptes 28x/29x qu'elle
    ne rattache à aucune ligne d'immobilisation sont désormais ajoutés sur leur
    propre ligne dans la colonne Amort./Déprec. — le total actif reste donc exact
    quel que soit le plan de comptes.
  • Dépréciations 29x : incluses dans ce même traitement (elles étaient
    exclues de l'actif immobilisé sans jamais être réintégrées).

Tests effectués

  1. Non-régression sur le journal d'exemple du repobilan.md généré
    avant/après le patch est byte-identique (diff vide) :

    $ node scripts/generate-statements.js   # avant puis après
    Actif  : 12 914,77 EUR / Passif : 12 914,77 EUR   (identiques)
    $ diff bilan-avant.md bilan-apres.md              (vide)
    
  2. Reproduction minimale de l'issue (journal 5 lignes) :

    avant : Actif 1 300,00 / Passif 100,00 — ATTENTION : bilan desequilibre de 1 200,00 EUR
    après : Actif 1 200,00 / Passif 1 200,00 — Le bilan est equilibre.
    
  3. Comptabilité réelle (SASU au régime réel, plan de comptes à 6 chiffres,
    33 écritures, 20 comptes) :

    avant : Actif 3 181,39 / Passif -1 047,98 — Ecart de 4 229,37 EUR
    après : Actif 3 039,91 / Passif 3 039,91 — Le bilan est equilibre.
    

    avec 455100 au passif (4 087,89) et l'amortissement 281000 (141,48)
    déduit de l'actif ; la balance générée concorde compte par compte avec celle
    du logiciel comptable d'origine.

  4. Suite de tests du repo :

    $ npm run test:calc
    Deterministic calculation tests passed.
    

Le PCG prévoit les subdivisions (4551 « Principal », 281 « même
ventilation que celle du compte 21 »…) et les logiciels comptables
complètent les numéros à 6 chiffres ou plus dans leurs exports — c'est
la forme standard des FEC : 455100, 281000, 210000… Avec un tel plan de
comptes, le gabarit bilan de generate-statements.js affichait un bilan
faussement déséquilibré alors que la balance était équilibrée :

- dettes : le test « a === '455' » (match exact) excluait 455100
  (compte courant d'associé) du passif ; même motif pour « a === '487' »
- amortissements : l'appariement « '28' + suffixe » cherchait 2810000
  pour l'immobilisation 210000 — 281000 jamais trouvé, et son montant
  compté nulle part → actif surestimé
- les dépréciations 29x étaient exclues de l'actif immobilisé sans
  jamais être réintégrées

Correctif minimal : startsWith pour 455x/487x ; les comptes 28x/29x non
appariés par la règle historique « 28 + suffixe » (conservée) sont
ajoutés sur leur propre ligne, si bien que le total actif reste exact
quel que soit le plan de comptes.

Vérifié : bilan.md du journal d'exemple byte-identique avant/après ;
repro minimal (5 lignes, numéros complétés) passe d'un écart de
1 200,00 à un bilan équilibré ; comptabilité réelle (SASU, plan de
comptes à 6 chiffres) passe d'un écart de 4 229,37 à un bilan équilibré
3 039,91 = 3 039,91 ; npm run test:calc OK.

@romainsimon romainsimon left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Merci, le problème de l’issue #65 est réel, mais cette implémentation ne le corrige pas complètement.

Le calcul actuel construit le compte d’amortissement avec :

'28' + acct.substring(1)

Pour l’immobilisation 210000, cela produit 2810000, et non 281000. Le compte n’est donc pas apparié : il est affiché sur une ligne séparée avec un brut vide et un net négatif. Le total peut rester arithmétiquement équilibré tout en produisant un bilan trompeur.

Deux autres cas restent incorrects :

  • les comptes 29x ne sont jamais appariés à l’immobilisation correspondante ;
  • si la balance contient un 28x/29x sans compte brut détecté, la condition if (immoAccounts.length > 0) fait disparaître entièrement cette dépréciation du bilan.

La suite npm run test:calc passe, mais elle ne couvre aucun de ces scénarios. Merci d’ajouter des fixtures automatisées pour 210000/281000, une subdivision du type 218300/281830, un compte 29x et le cas d’un 28x orphelin. L’issue #65 doit rester ouverte jusque-là.

jcnoir added a commit to jcnoir/paperasse that referenced this pull request Aug 10, 2026
…omainsimon#66)

L'appariement « 28 + suffixe » échouait sur les numéros complétés
(2810000 cherché pour 210000) : l'amortissement partait sur une ligne
orpheline — total exact mais présentation trompeuse — et les 29x
n'étaient jamais appariés. Un 28x/29x sans immobilisation brute
détectée disparaissait en outre entièrement du bilan, tout le bloc
étant sous « if (immoAccounts.length > 0) ».

Appariement par racine : zéros finaux retirés puis 8/9 en 2e position
(281000→210000, 281830→218300, 28183→2183, 291000→210000). Les comptes
réellement orphelins gardent leur ligne propre et restent affichés
même sans immobilisation brute.

Tests de non-régression ajoutés à test:calc — 210000/281000,
218300/281830, dépréciation 29x, 28x orphelin — chacun vu échouer
avant le correctif. Bilan du journal d'exemple byte-identique
avant/après ; npm run test:calc OK.
@jcnoir
jcnoir force-pushed the fix/bilan-comptes-subdivises branch from 5df34e5 to de329d0 Compare August 10, 2026 13:36
…omainsimon#66)

L'appariement « 28 + suffixe » échouait sur les numéros complétés
(2810000 cherché pour 210000) : l'amortissement partait sur une ligne
orpheline — total exact mais présentation trompeuse — et les 29x
n'étaient jamais appariés. Un 28x/29x sans immobilisation brute
détectée disparaissait en outre entièrement du bilan, tout le bloc
étant sous « if (immoAccounts.length > 0) ».

Appariement par racine : zéros finaux retirés puis 8/9 en 2e position
(281000→210000, 281830→218300, 28183→2183, 291000→210000). Pas
d'affectation arbitraire pour les cas indécidables : un 28/29 nu (non
ventilé dans le PCG) et une racine ambiguë (21 et 210000 dans la même
balance) restent sur leur propre ligne, comme les comptes réellement
orphelins — qui demeurent affichés même sans immobilisation brute.

Tests de non-régression ajoutés à test:calc — 210000/281000,
218300/281830, dépréciation 29x, 28x orphelin, 28 nu, collision de
racines — chacun vu échouer avant le correctif. Bilan du journal
d'exemple byte-identique avant/après ; npm run test:calc OK.
@jcnoir

jcnoir commented Aug 10, 2026

Copy link
Copy Markdown
Author

Corrigé — les trois points :

  • Appariement : par racine de compte (zéros finaux retirés, puis le 8/9 en 2e position) — 281000 est apparié à 210000, 281830 à 218300, 280000 à 200000, et 28183 à 2183 (comportement historique conservé : bilan du journal d'exemple byte-identique vs master). Plus de ligne séparée à brut vide pour un amortissement appariable.
  • 29x : appariés par la même règle (291000210000), cumulés avec les 28x dans la colonne Amort./Déprec. de l'immobilisation.
  • Orphelins : le traitement des 28x/29x sans immobilisation brute est sorti du if (immoAccounts.length > 0) — la dépréciation reste visible sur sa propre ligne et comptée dans le total actif (avant : elle disparaissait et l'actif était surévalué d'autant).

L'appariement refuse les cas indécidables plutôt que de trancher arbitrairement : un 28/29 nu (non ventilé — impossible à répartir entre 20, 21…) et une racine ambiguë (21 et 210000 coexistant dans la même balance) restent sur leur propre ligne, total inchangé.

Six fixtures ajoutées à npm run test:calc : 210000/281000, 218300/281830, dépréciation 29x, 28x orphelin, 28 nu, collision de racines — chacune vérifiée en échec avant le correctif.

@jcnoir

jcnoir commented Aug 10, 2026

Copy link
Copy Markdown
Author

Et merci beaucoup pour ce projet, c'est très utile !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Skill comptable : bilan faussement déséquilibré avec des numéros de comptes complétés (455100, 281000…)

2 participants