feat: signatures de banques et detection de derive de format #330
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#330
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
Deux besoins lies, tous deux fondes sur la ligne d'en-tete.
Signatures de banques. Reconnaitre un format connu sans demander a l'utilisateur de choisir sa banque. Desjardins exporte Date, Description, Montant, Solde en point-virgule avec virgule decimale, en-tetes FR ou EN, et certains exports de cartes de credit n'ont pas de ligne d'en-tete.
preprocessQuotedCSV(csvAutoDetect.ts:32-51) traite deja le cas Desjardins de la ligne entiere entre guillemets — le besoin est demontre.Derive de format. Quand la banque change son export, le mapping memorise devient faux et l'import passe sans bruit. C'est le mode d'echec le plus couteux sur plusieurs annees, parce qu'il se decouvre longtemps apres.
Taches
src/utils/bankSignatures.ts: signatures declaratives (libelles normalises, delimiteur, particularites de preambule) pour Desjardins, RBC, BNC, Tangerineheader_signaturememorisee sur la source a chaque import reussiFormatDriftPanel, avec deux issues — adopter la config re-detectee ou conserver l'anciennePoints d'attention
header_signaturereste nulle et la derive est inoperante sur ces sources. Comportement documente, pas contourne — inventer une signature sur les donnees produirait un faux positif a chaque changement de contenu.Criteres d'acceptation
Depends on #329
Revision /review-spec — 2026-08-13
Corrections a appliquer, issues de la revue 3 experts :
findDuplicates(transactionService.ts:164) apparie surdate AND description AND amount: les corrections de #324 et #325 changent les montants qu'une source produit, donc un re-import « corrige » ne reconnaitra pas les lignes fautives deja ecrites et les ajoutera en double — une inversion de signe produisant en prime des paires miroir qui se compensent a ~0 au lieu de sauter aux yeux.deleteImportWithTransactionssur l'import fautif avant de le rejouer. Cela doit apparaitre dans l'interface, pas seulement dans le tableau des risques du plan.Fichiers concernes
src/utils/bankSignatures.ts— creer : signatures declarativessrc/components/import/FormatDriftPanel.tsx— creer : panneau d'ecartsrc/utils/csvAutoDetect.ts— evaluation des signatures avant le dictionnaire generiquesrc/hooks/useImportWizard.ts— memorisation et comparaison deheader_signaturesrc/services/importSourceService.tssrc/i18n/locales/fr.json+en.jsonDecisions 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.header_signaturestocke un tableau JSON des libelles normalises parnormalizeHeaderCell, ex.["date","description","montant","solde"]. Pas un hash : le panneau d'ecart doit pouvoir nommer les colonnes qui ont bouge (« Montant : 3 -> 4 »), ce qu'un hash interdit.Une source dont le fichier n'a pas de ligne d'en-tete garde
header_signatureNULL : la derive est inoperante sur ces sources, comportement documente et assume (inventer une signature sur les donnees produirait un faux positif a chaque changement de contenu).Spec source
spec-plan-import-csv-format.md+spec-decisions-import-csv-format.md(racine du repo, committees).