feat: detection des colonnes par libelle d'en-tete #327
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#327
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
La detection actuelle est aveugle aux libelles et ne raisonne que sur la forme des donnees :
src/utils/csvAutoDetect.ts:461-470assigne le debit et le credit par ordre de colonne (colAest toujours le debit, la boucle imposea < b). Un fichierDate;Description;Credit;Debitest inverse integralement.detectHeader(:214-238) retourne!hasDate && !hasNumber: un en-tete contenant « Solde 2024 » passe pour une ligne de donnees.detectDescriptionColumn(:404-434) prend la colonne la plus longue en moyenne.Le savoir-faire manquant est dans le meme fichier : le flux d'import de titres (#245) fait du matching par libelle via
normalizeHeaderCelletmatchHeaderColumn(:633-666). Il s'agit de le generaliser, pas de le reecrire.Taches
normalizeHeaderCelletmatchHeaderColumnen helpers partages du module, sans changer leur comportementdetectHeader: signal lexical en complement de la formePoints d'attention
Les tests holdings existants doivent rester verts — les helpers sont partages, leur comportement ne change pas.
Criteres d'acceptation
Date;Description;Credit;Debitest mappe dans le bon ordre sans interventionRevision /review-spec — 2026-08-13
Corrections a appliquer, issues de la revue 3 experts :
normalizeHeaderCell(:633) etmatchHeaderColumn(:646) sont deja au niveau module du meme fichier. La mitigation du plan couvrait un risque inexistant.montantest un token d'exclusion pour les titres (VALUE_HEADER_KEYWORDS,:630) et le mot-cle de montant principal pour les transactions. Mettre le dictionnaire transactions dans son propre module, a cote debankSignatures.ts, en important les deux helpers et en laissant les tables holdings intactes.csvAutoDetect.tsfait deja 856 lignes pour deux flux sans rapport.D/C» sera refuse explicitement, et aucune issue ne le livrait. Sans la regle, un tel fichier presente une colonne tous-positifs,detectSingleAmountrendpositive_expense, et chaque debit est importe comme un revenu. Detecter (montants tous positifs + colonne voisine a une seule lettre D/C) et refuser avec un message dedie.Depends on #325
Fichiers concernes
src/utils/headerDictionary.ts— creer : dictionnaire FR/EN des libelles transactionssrc/utils/csvAutoDetect.ts— couche lexicale en amont de l'heuristique ; ne PAS toucher les tables holdingssrc/utils/csvAutoDetect.test.ts— tests sur fixturesDecisions prises en planification
formatToRow/formatFromRowetmapRowvivent danssrc/utils/importFormat.ts— meme dossier queamountParser,dateParseretcsvAutoDetect, qui portent deja la logique pure du domaine. Les types restent danssrc/shared/types/.deleteImportWithTransactionspuis re-import. Ne jamais muter des montants deja ecrits.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.Spec source
spec-plan-import-csv-format.md+spec-decisions-import-csv-format.md(racine du repo, committees).