fix: regle debit/credit et parsing des montants #325
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#325
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Refs:
spec-decisions-import-csv-format.md+spec-plan-import-csv-format.md(racine du repo).Contexte
src/hooks/useImportWizard.ts:509:Le credit gagne toujours. Beaucoup de banques ecrivent
0,00dans la colonne inutilisee plutot que de la laisser vide : tous les debits deviennent alors 0 $, et la ligne passe la validation puisqueisNaN(0)est faux. La convention documentee est que dans un format a deux colonnes, debit et credit sont tous deux positifs — la regle correcte est donccredit - debitsur des magnitudes.Les fallbacks
?? 0(:504-512) lisent la colonne 0 — souvent la date — quand le mapping est incomplet, au lieu d'echouer.src/utils/amountParser.tsne gere ni les parentheses comptables(50,00)ni le signe suffixe50,00-.Taches
amount = credit - debitsur magnitudes, en remplacement de la comparaison de nullite0,00traitee comme absente?? 0au profit d'une erreur de ligne explicite « colonne de montant non mappee »parseFrenchAmount: parentheses comptables(50,00)et signe suffixe50,00-1.234est ambigu isolement ; si la colonne porte des virgules decimales ailleurs, le point est un separateur de milliers)Criteres d'acceptation
0,00produit les bons montants, aucun n'est nulDepends on #324
Revision /review-spec — 2026-08-13
Corrections a appliquer, issues de la revue 3 experts :
parseFrenchAmountest plus grave que decrit (verifie en executant la fonction) : elle termine surparseFloat, qui s'arrete au premier caractere invalide au lieu de rejeter."50,00-"rend 5000 —"1 234,56 CR"rend 123456 —"100,00 CAD"rend 10000.Erreur de facteur 100, pas un signe perdu, et chacune passe
isNaN: ces lignes seront comptees valides dans le recapitulatif signe de #329, ce qui neutralise le filet de securite principal du chantier.NaNsur tout caractere residuel. Ajouter ces trois chaines aux tests.csvAutoDetect.ts(:224detectHeader,:289,:323,:489,:517detectSingleAmount,:543-544isSparseComplementary,:712holdings) et 3 dansuseSnapshotEditor.ts:191-202(import CSV de titres, #245)."100,00 CAD"a 10000 est un bug partout, y compris cote titres. Passe de regression obligatoire sur les tests holdings existants.useSnapshotEditor.tsau perimetre et creersrc/utils/amountParser.test.ts(n'existe pas aujourd'hui).mapRow(raw, format): ParsedRow— fonction pure exportee tiree deparseFilesInternal, consommee par le wizard, par le score de #328 et par l'apercu de #329. Sans elle, #328 reimplemente la regle de parsing et le score peut afficher 100 % pendant que l'import ecrit de mauvais signes.Fichiers concernes
src/utils/amountParser.ts— validation ancreesrc/utils/amountParser.test.ts— creersrc/utils/importFormat.ts—mapRow(raw, format): ParsedRowextrait deparseFilesInternalsrc/hooks/useImportWizard.ts— reglecredit - debit, suppression des fallbacks?? 0, consommation demapRowsrc/utils/csvAutoDetect.ts— 8 sites d'appel deparseFrenchAmounta verifiersrc/hooks/useSnapshotEditor.ts— 3 sites d'appel (:191-202), flux holdings #245Decisions prises en planification
Emplacement du code partage : le codec
formatToRow/formatFromRowetmapRowvivent danssrc/utils/importFormat.ts— meme dossier queamountParser,dateParseretcsvAutoDetect, qui portent deja la logique pure du domaine. Les types restent danssrc/shared/types/.Aucune correction retroactive des transactions deja importees a l'envers : la voie de reparation est
deleteImportWithTransactionspuis re-import. Ne jamais muter des montants deja ecrits.L'import reste entierement en edition Free — aucun gating a ajouter.
Les specs
spec-decisions-import-csv-format.mdetspec-plan-import-csv-format.mdsont committees a la racine (force-add, precedent PR #295) : elles sont lisibles depuis un worktree.Le durcissement s'applique globalement, y compris au flux holdings. Une valeur qui devient
NaNalimente le chemin d'erreur de ligne deja existant — verifier que le flux holdings degrade proprement plutot que d'ecrire une quantite nulle.Spec source
spec-plan-import-csv-format.md+spec-decisions-import-csv-format.md(racine du repo, committees).