feat: score de confiance et detection lancee d'office #328

Closed
opened 2026-08-12 20:14:33 +00:00 by maximus · 0 comments
Owner

Refs: spec-decisions-import-csv-format.md + spec-plan-import-csv-format.md (racine du repo).

Contexte

Deux defauts qui laissent l'utilisateur sans information :

  1. La detection n'est jamais lancee d'office — elle est derriere le bouton baguette magique (src/components/import/SourceConfigPanel.tsx:69-77). Une source neuve demarre sur defaultConfig (;, DD/MM/YYYY, colonnes 0/1/2), assez plausible pour produire un import faux plutot qu'une erreur franche.
  2. autoDetectConfig ne teste jamais sa propre configuration sur les donnees. Elle retourne un resultat sans indiquer s'il tient.

Troisieme point, cosmetique mais trompeur : le selecteur de convention de signe est affiche en permanence (SourceConfigPanel.tsx:273-306) alors que le parsing ne l'applique qu'en mode montant unique (useImportWizard.ts:514). En mode debit/credit, l'utilisateur regle un bouton sans effet.

Taches

  • autoDetectConfig rejoue la configuration detectee sur les lignes de l'echantillon et retourne le taux de lignes parsees sans erreur
  • Detection declenchee seule a l'ouverture d'une source non configuree ; le bouton reste pour la rejouer
  • La detection d'office ne touche jamais une source deja configuree — la config memorisee prime, c'est tout l'objet du chantier
  • Bandeau de resultat dans SourceConfigPanel : score (« Format reconnu — 147 des 150 lignes lues ») ou avertissement sous le seuil
  • Convention de signe masquee en mode debit/credit
  • Cles i18n FR et EN

Criteres d'acceptation

  • Une source jamais configuree declenche la detection sans action de l'utilisateur
  • Une source deja configuree n'est jamais re-detectee a l'ouverture
  • Le score est affiche et reflete le taux reel de lignes lues

Depends on #327


Revision /review-spec — 2026-08-13

Corrections a appliquer, issues de la revue 3 experts :

  • Le score doit consommer mapRow(raw, format), la fonction pure extraite en #325 — ne pas reimplementer la regle de parsing. La regle de mapping (date + montant + signe) vit aujourd'hui dans parseFilesInternal, un useCallback de useImportWizard.ts:461-557, alors qu'autoDetectConfig est un util pur qui ne recoit que rawContent.
  • Deux mappers = la classe de divergence exacte que ce chantier combat : le score pourrait afficher 100 % pendant que l'import ecrit de mauvais signes.

Fichiers concernes

  • src/utils/csvAutoDetect.ts — score via mapRow
  • src/hooks/useImportWizard.ts — detection lancee d'office sur source non configuree
  • src/components/import/SourceConfigPanel.tsx — bandeau de resultat, convention masquee en debit/credit
  • src/i18n/locales/fr.json + en.json

Decisions prises en planification

  • Emplacement du code partage : le codec formatToRow/formatFromRow et mapRow vivent dans src/utils/importFormat.ts — meme dossier que amountParser, dateParser et csvAutoDetect, qui portent deja la logique pure du domaine. Les types restent dans src/shared/types/.

  • Aucune correction retroactive des transactions deja importees a l'envers : la voie de reparation est deleteImportWithTransactions puis 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.md et spec-plan-import-csv-format.md sont committees a la racine (force-add, precedent PR #295) : elles sont lisibles depuis un worktree.

  • Seuil de confiance : 90 % (tranche en planification). Sous 90 % de lignes lues, bandeau d'avertissement avec le score detaille (« 132/150 lignes lues »). Au-dessus, bandeau neutre. L'apercu obligatoire de #329 reste le filet reel quel que soit le score — le seuil ne fait que colorer l'information, il ne bloque rien.

Spec source

spec-plan-import-csv-format.md + spec-decisions-import-csv-format.md (racine du repo, committees).

Refs: `spec-decisions-import-csv-format.md` + `spec-plan-import-csv-format.md` (racine du repo). ## Contexte Deux defauts qui laissent l'utilisateur sans information : 1. La detection n'est **jamais lancee d'office** — elle est derriere le bouton baguette magique (`src/components/import/SourceConfigPanel.tsx:69-77`). Une source neuve demarre sur `defaultConfig` (`;`, `DD/MM/YYYY`, colonnes 0/1/2), assez plausible pour produire un import faux plutot qu'une erreur franche. 2. `autoDetectConfig` **ne teste jamais sa propre configuration** sur les donnees. Elle retourne un resultat sans indiquer s'il tient. Troisieme point, cosmetique mais trompeur : le selecteur de convention de signe est affiche en permanence (`SourceConfigPanel.tsx:273-306`) alors que le parsing ne l'applique qu'en mode montant unique (`useImportWizard.ts:514`). En mode debit/credit, l'utilisateur regle un bouton sans effet. ## Taches - [ ] `autoDetectConfig` rejoue la configuration detectee sur les lignes de l'echantillon et retourne le taux de lignes parsees sans erreur - [ ] Detection declenchee seule a l'ouverture d'une source non configuree ; le bouton reste pour la rejouer - [ ] La detection d'office ne touche jamais une source deja configuree — la config memorisee prime, c'est tout l'objet du chantier - [ ] Bandeau de resultat dans `SourceConfigPanel` : score (« Format reconnu — 147 des 150 lignes lues ») ou avertissement sous le seuil - [ ] Convention de signe masquee en mode debit/credit - [ ] Cles i18n FR et EN ## Criteres d'acceptation - [ ] Une source jamais configuree declenche la detection sans action de l'utilisateur - [ ] Une source deja configuree n'est jamais re-detectee a l'ouverture - [ ] Le score est affiche et reflete le taux reel de lignes lues Depends on #327 --- ## Revision /review-spec — 2026-08-13 Corrections a appliquer, issues de la revue 3 experts : - **Le score doit consommer `mapRow(raw, format)`**, la fonction pure extraite en #325 — ne pas reimplementer la regle de parsing. La regle de mapping (date + montant + signe) vit aujourd'hui dans `parseFilesInternal`, un `useCallback` de `useImportWizard.ts:461-557`, alors qu'`autoDetectConfig` est un util pur qui ne recoit que `rawContent`. - Deux mappers = la classe de divergence exacte que ce chantier combat : le score pourrait afficher 100 % pendant que l'import ecrit de mauvais signes. --- ## Fichiers concernes - `src/utils/csvAutoDetect.ts` — score via `mapRow` - `src/hooks/useImportWizard.ts` — detection lancee d'office sur source non configuree - `src/components/import/SourceConfigPanel.tsx` — bandeau de resultat, convention masquee en debit/credit - `src/i18n/locales/fr.json` + `en.json` ## Decisions prises en planification - **Emplacement du code partage** : le codec `formatToRow`/`formatFromRow` et `mapRow` vivent dans `src/utils/importFormat.ts` — meme dossier que `amountParser`, `dateParser` et `csvAutoDetect`, qui portent deja la logique pure du domaine. Les types restent dans `src/shared/types/`. - **Aucune correction retroactive** des transactions deja importees a l'envers : la voie de reparation est `deleteImportWithTransactions` puis 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.md` et `spec-plan-import-csv-format.md` sont **committees a la racine** (force-add, precedent PR #295) : elles sont lisibles depuis un worktree. - **Seuil de confiance : 90 %** (tranche en planification). Sous 90 % de lignes lues, bandeau d'avertissement avec le score detaille (« 132/150 lignes lues »). Au-dessus, bandeau neutre. L'apercu obligatoire de #329 reste le filet reel quel que soit le score — le seuil ne fait que colorer l'information, il ne bloque rien. ## Spec source `spec-plan-import-csv-format.md` + `spec-decisions-import-csv-format.md` (racine du repo, committees).
maximus added this to the planned-2026-08-12-import-csv-format milestone 2026-08-12 20:14:33 +00:00
maximus added the
status:ready
type:feature
source:human
labels 2026-08-12 20:14:33 +00:00
maximus added
status:in-progress
and removed
status:ready
labels 2026-08-13 18:01:37 +00:00
maximus added
status:approved
and removed
status:in-progress
labels 2026-08-14 15:29:45 +00:00
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/Simpl-Resultat#328
No description provided.