Import : dossier parent, un sous-dossier par compte, signes à l'aperçu, guillemets dans les cartes #422
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#422
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?
La page Import n'explique pas qu'il faut choisir le dossier parent (un sous-dossier par compte), les cartes parlent d'un sous-dossier « par banque », et rien ne dit qu'une dépense doit apparaître en négatif à l'aperçu. Retours de Max sur la v0.17.1 ; textes validés par Max le 2026-10-12. Les autres retours de cette issue ont leur propre issue dans le jalon : #424 (Budget), #430 (cartes Transactions et Budget), #431 (aide périmée), #425 et #432 (étapes de visite).
Contexte
.csvet.txtposés directement dans un sous-dossier sont lus ; les fichiers posés à la racine et les niveaux plus profonds sont ignorés (scan_import_folder,src-tauri/src/commands/fs_commands.rs:25-110).src/components/import/FilePreviewTable.tsx:63-122), mais aucun texte ne dit qu'une dépense doit être une sortie.Travail à faire
src/components/import/ImportFolderStructure.tsx: encadré « Structure attendue », liste imbriquée<ul>(icônes lucideFolderetFileText,aria-hidden), textesimport.empty.structure.*. Rendu dansImportEmptyState(src/components/import/ImportEmptyState.tsx), dans ses deux variantes (« aucun dossier », « aucune source »).WIZARD_ROWS(src/utils/onboardingPath.ts:266-271) porte plusieurs libellés par ligne : la lignefile-previewreçoitflip: "import.preview.flipSigns"en plus debutton: "import.wizard.checkDuplicates";importCardModel(:334-339) passe tous les libellés de la ligne.Textes (FR | EN)
onboarding.card.import.noFolderonboarding.card.import.noSourcesonboarding.card.import.sourceListonboarding.card.import.filePreviewonboarding.card.import.duplicateCheckonboarding.card.import.confirmimport.empty.noSources.descriptionimport.empty.structure.titleimport.empty.structure.parentimport.empty.structure.account1import.empty.structure.file1import.empty.structure.file2import.empty.structure.account2import.empty.structure.rootNoteimport.help.tips[0]import.help.tips(nouvelle, insérée en position 3, après « Prévisualisez vos données… »)docs.import.steps[1]docs.import.steps[5]docs.import.steps[6]Guide Markdown (
docs/guide-utilisateur.md, section Import) : la ligne qui reprenddocs.import.steps[1](aujourd'hui « 2. Créez un sous-dossier pour chaque banque/source… ») reçoit le texte FR dedocs.import.steps[1]; les lignes qui reprennent[5]et[6]reçoivent les leurs. La puce « Formats reconnus par banque — Desjardins, RBC… » est juste et ne change pas.Fichiers concernés
src/components/import/ImportFolderStructure.tsx(nouveau) et son testsrc/components/import/ImportEmptyState.tsx,src/components/import/ImportEmptyState.test.tsxsrc/utils/onboardingPath.ts,src/utils/onboardingPath.test.tssrc/pages/ImportPage.render.test.tsxsrc/i18n/locales/fr.json,src/i18n/locales/en.jsondocs/guide-utilisateur.md,docs/qa-onboarding.htmlCHANGELOG.md,CHANGELOG.fr.mdDepends on
Tests
importCardModelà l'étapefile-previewrendlabels={ button: "import.wizard.checkDuplicates", flip: "import.preview.flipSigns" }; les autres lignes inchangées.ImportPage.render.test.tsx: la phrase attendue de la lignefile-preview(cas paramétré des étapes de l'assistant) porte les deux libellés.ImportFolderStructurerend ses sept clés dans une liste imbriquée ;ImportEmptyStatele rend dans ses deux variantes.Critères d'acceptation
grep -n -P 'sous-dossier par banque|banque/source|sub-?folder per bank(?! account)|bank/source' src/i18n/locales/*.json docs/guide-utilisateur.mdne rend rien.npm run buildetnpm testverts.Review caveats
grepd'origine attrapait des phrases justes (« Formats reconnus par banque », « one subfolder per bank account ») ; il est ciblé, et la puce des formats par banque est conservée.ImportPage.render.test.tsxaffirme la phrase exacte de chaque étape ; il est dans les fichiers.Décisions prises en planification
Conventions
src/i18n/locales/fr.json,en.json) ; les textes de ce corps s'écrivent mot pour mot (FR validé par Max le 2026-10-12, EN rédigé sur le même contenu).StepCardText.labels(src/utils/onboardingPath.ts), traduit parStepCard; jamais recopié dans la phrase. Guillemets « » en FR et “ ” en EN autour de chaque libellé de contrôle interpolé ;{{filter, lowercase}}sans guillemets.## [Unreleased]dansCHANGELOG.mdetCHANGELOG.fr.md.renderToStaticMarkup(pas de jsdom) et le fauxtpartagé livré par #389.useImportWizard.ts:423-425: le Journal part avec un rapport de feedback).npm run build(il vérifie aussi les types des fichiers de test) etnpm testverts.docs/guide-utilisateur.md) : repérer une ligne par son texte cité, pas par son numéro.CHANGELOG
Changed / Modifié : FR « Import : l'état vide montre la structure attendue (un dossier parent, un sous-dossier par compte), et les cartes du parcours demandent de choisir le dossier parent et de vérifier qu'une dépense compte parmi les sorties. » EN "Import: the empty state shows the expected structure (a parent folder, one subfolder per account), and the getting-started cards ask you to choose the parent folder and to check that an expense counts among the outflows."
Texte d'origine (Max, 2026-10-12)
Spec source
spec-plan-retours-onboarding-v0171.md(local, ignoré par git) ; décisions dansspec-decisions-retours-onboarding-v0171.md.Analyse du 2026-10-12 (
/analyze,mainà1954502). Sur décision de Max, les retours sont répartis en trois issues :Constats annexes ouverts en
status:triage: #426 (source renommée introuvable) et #427 (CSV posés à la racine du dossier d'import). Le point « Utiliser "confirmer" plutôt que "passer" » est retiré : mauvaise lecture selon Max.Corps d'origine (2026-10-12)
Retours de Max après un passage du parcours de démarrage sur la v0.17.1 (consignés le 2026-10-12). Le texte d'origine est cité en fin d'issue ; les notes en retrait sont du contexte relevé dans le code à l'ouverture, pas des décisions.
Import
Structure du dossier d'import : expliquer, au moment du choix du dossier, qu'il faut choisir le dossier parent, avec un sous-dossier par source et les CSV dedans :
Vérifier les signes avant l'import : une dépense doit apparaître en négatif.
« Confirmer » plutôt que « Passer », à préciser à l'analyse.
Classement des transactions
Expliquer les mots-clés et leur utilisation.
Budget
Nouvelles étapes du parcours
Texte d'origine
Parcours de démarrage v0.17.1 : retours de test (explications import, signes, mots-clés et budget, étapes Catégories et Rapports, ordre au dépli du Budget)to Parcours de démarrage v0.17.1 : textes des cartes (dossier d'import, signes, mots-clés, budget) et aide périméePlanification du 2026-10-12 (
/plan-run, jalonplanned-2026-10-12-retours-onboarding-v0171) : le corps est réécrit pour être autosuffisant (décisions de Max, constats de/review-specintégrés). Corps précédent ci-dessous.Corps précédent (titre : Parcours de démarrage v0.17.1 : textes des cartes (dossier d'import, signes, mots-clés, budget) et aide périmée)
Contexte
Retours de Max sur le parcours de démarrage de la v0.17.1, consignés le 2026-10-12 et analysés le même jour sur
mainà1954502. Sur décision de Max, les retours sont répartis en trois issues :Deux constats annexes ont leur issue : #426 (source renommée introuvable) et #427 (CSV posés à la racine du dossier d'import). Le corps d'origine est archivé en commentaire.
Retiré : « Utiliser "confirmer" plutôt que "passer" », une mauvaise lecture selon Max (2026-10-12).
Convention des cartes. Une phrase de carte nomme un contrôle par sa propre clé i18n, jamais en recopiant son libellé :
StepCardText.labels(src/utils/onboardingPath.ts:228-238), traduit parStepCard(src/components/onboarding/StepCard.tsx:68-76). Chaque bouton cité dans une nouvelle phrase passe par là. Une carte dit quoi faire en 2 ou 3 phrases (décision D2 de la phase 2).Travail à faire
1. Dossier d'import : choisir le dossier parent
Le modèle réel :
chaque sous-dossier direct et non caché du dossier choisi devient une source, nommée d'après lui ;
seuls les
.csvet.txtposés directement dans un sous-dossier sont lus ; les fichiers posés à la racine et les niveaux plus profonds sont ignorés (scan_import_folder,src-tauri/src/commands/fs_commands.rs:25-110) ;une source garde un seul format et une seule signature d'en-tête (ADR 0019) : une carte de crédit et un compte chèques de la même banque font deux sources.
Montrer la structure attendue dans l'état vide de la page Import (
src/components/import/ImportEmptyState.tsx, variantes « aucun dossier » et « aucune source »). Il est visible avec ou sans parcours, et la carte du parcours l'accompagne. Liste imbriquée accessible, pas une image ; libellés i18n FR et EN :Remplacer « un sous-dossier par banque » par « un sous-dossier par compte » :
onboarding.card.import.noFolder,onboarding.card.import.noSources,import.empty.noSources.description,import.help.tips[0]etdocs.import.steps[1](ces deux derniers disent « banque/source »). Le guide etdocs.gettingStarteddisent déjà « par compte ».Dire que les fichiers posés à la racine du dossier parent sont ignorés. L'avertissement à l'écran est #427.
2. Signes à l'aperçu
L'aperçu affiche déjà un récapitulatif signé : « N sortie(s) » en rouge, « N entrée(s) » en vert, et « Inverser les signes », qui corrige la configuration de la source pour les imports suivants (
src/components/import/FilePreviewTable.tsx:63-122). Aucun texte ne dit qu'une dépense doit être une sortie.onboarding.card.import.filePreview: une dépense doit apparaître dans les sorties, avec un montant négatif ; sinon, cliquer « Inverser les signes ». Le libelléimport.preview.flipSignss'ajoute auxlabelsde la lignefile-previewdeWIZARD_ROWS(onboardingPath.ts:266-271), à côté deimport.wizard.checkDuplicates.import.help.tips) et dans le guide, section Import.3. Mots-clés à l'étape « Classer une transaction à la main »
Décision de Max (2026-10-12) : le critère de l'étape ne change pas (une transaction classée à la main,
is_manually_categorized = 1) ; la carte guide vers l'ajout d'un mot-clé. La carte de l'étape Catégories et mots-clés, juste avant (#425), annonce cet ajout.Faits :
un mot-clé classe d'office, à l'import et par « Auto-catégoriser », les transactions dont la description le contient ; le plus prioritaire l'emporte (
src/services/categorizationService.ts) ;le clic droit sur une transaction, classée ou non, puis « Ajouter comme mot-clé » (
reports.keyword.addFromTransaction) ouvreAddKeywordDialog(src/pages/TransactionsPage.tsx:175-198) : mot-clé prérempli avec le premier mot de la description, choix de la catégorie, aperçu des transactions qui correspondent, puis « Appliquer et recatégoriser ». Le mot-clé est créé (priorité 100) et les transactions cochées sont classées avecis_manually_categorized = 1(categorizationService.ts:240-290) : l'étape se coche ;l'icône « Ajouter un mot-clé » de la table n'apparaît que sur une transaction déjà classée (
src/components/transactions/TransactionTable.tsx:225), donc pas dans l'entrée guidée, filtrée sur les non classées ;#423 remplace le menu de catégorie de cette boîte par un menu avec saisie : la phrase de la carte reste vraie.
onboarding.card.transactions.uncategorizedet.all: ce qu'est un mot-clé, puis le clic droit et « Ajouter comme mot-clé » comme façon recommandée de classer (libellé enlabels, danstransactionsCardModel,onboardingPath.ts:360-375). Le choix direct de la catégorie reste possible, et la mise en évidence reste sur la catégorie de la première ligne.Le guide, section Transactions, au même niveau.
4. Budget : feuilles seulement, et colonne Annuel
Faits :
seules les feuilles acceptent un montant ; une ligne à chevron est un sous-total en lecture seule (
src/components/budget/BudgetTable.tsx:249-297) ;un montant saisi dans « Annuel » est réparti également sur les 12 mois et remplace les montants mensuels (
handleSaveAnnualpuissplitEvenly,src/hooks/useBudget.ts:470-480; arrondi au cent, le reste réparti sur les premiers mois).onboarding.card.budget.collapsedet.flat: seules les catégories du dernier niveau, sans chevron, acceptent un montant ; un montant saisi dans « Annuel » (budget.annualenlabels, dansbudgetCardModel,onboardingPath.ts:394-414) est réparti sur les 12 mois et remplace les montants mensuels.budget.help.tips: les deux mêmes règles.5. Aide et guide périmés (constat annexe, inclus sur décision de Max)
budget.help.tips[3],docs.budget.steps[3]et le guide décrivent un « bouton de répartition », retiré en v0.2.5 (ccdab1f) ; la répartition passe par la cellule Annuel.docs.budget.tips[0]annonce un avertissement quand les mois ne correspondent pas à l'annuel. Il ne peut plus apparaître : l'annuel est toujours la somme des mois (useBudget.ts:126-137), ce qui rend morte la vérification deBudgetTable.tsx:342-349. Retirer la phrase ; le code mort est sans effet et reste hors de cette issue.reports.help.tips[0]parle d'onglets « Tendances, Par catégorie et Dans le temps », alors que le hub a des cartes depuis l'ADR 0007.docs.reports.overviewannonce quatre sous-rapports,docs.reports.features« 4 cartes de navigation », et le guide « quatre cartes » (docs/guide-utilisateur.md:357). Le hub en a cinq : Faits saillants, Tendances, Comparables, Zoom catégorie, Cartes (src/pages/ReportsPage.tsx).6. Docs et suivi
docs/guide-utilisateur.md) et clésdocs.*FR et EN pour chaque texte ci-dessus.CHANGELOG.md,CHANGELOG.fr.md) : « Changed » / « Modifié » pour les cartes, « Fixed » / « Corrigé » pour l'aide périmée.docs/qa-onboarding.html: les phrases des cartes Import (aucun dossier, aucune source, aperçu), Transactions et Budget.Fichiers concernés
src/i18n/locales/fr.json,src/i18n/locales/en.json: textes des cartes, aide, clésdocs.*.src/utils/onboardingPath.ts:labelsdes phrases (aperçu, transactions, budget).src/components/import/ImportEmptyState.tsx: arborescence du dossier.docs/guide-utilisateur.md,docs/qa-onboarding.html,CHANGELOG.md,CHANGELOG.fr.md.Surface de test
src/utils/onboardingPath.test.ts(modèles des cartes : clés etlabels),src/components/onboarding/StepCard.render.test.tsx,src/components/onboarding/OnboardingStepCard.test.tsx,src/components/import/ImportEmptyState.test.tsx.tdes tests de rendu rend la clé brute, untoublié passe inaperçu.Critères d'acceptation
npm testetnpm run buildverts.Complexité estimée
Moyenne : surtout des textes, plus un petit composant (l'arborescence) et les
labelsde trois cartes.Ordre
fr.json,en.json,onboardingPath.ts, guide, CHANGELOG, liste QA) : enchaîner, pas en parallèle.Questions ouvertes
Aucune.
Texte d'origine
Parcours de démarrage v0.17.1 : textes des cartes (dossier d'import, signes, mots-clés, budget) et aide périméeto Import : dossier parent, un sous-dossier par compte, signes à l'aperçu, guillemets dans les cartes