Onboarding : commande Tauri create_sample_import_folders, gabarits CSV d'exemple et test de détection #354

Closed
opened 2026-09-26 12:24:30 +00:00 by maximus · 0 comments
Owner

Vague planned-2026-10-03-onboarding-phase1 (séance /plan-run du 2026-10-03, spec + /review-spec du 2026-09-25, verdict APPROUVÉ après intégration). Les fichiers spec-decisions-onboarding-phase1.md / spec-plan-onboarding-phase1.md sont ignorés par git : ce corps est auto-suffisant, ne pas chercher le spec. Analyse d'origine : docs/analyse-onboarding-2026-09.md.

Règles de la vague : pile linéaire (chaque PR part de la précédente) ; ne pas toucher CHANGELOG.md / CHANGELOG.fr.md avant #357 qui les centralise ; FR + EN pour toute clé i18n (.claude/rules/i18n.md) ; aucune migration DB ; aucune chaîne en dur dans les composants.

Objectif

Nouvelle commande Rust qui écrit deux sous-dossiers de CSV réalistes (Desjardins compte chèques, Tangerine carte de crédit) dans le dossier d'import, dates recalculées sur les deux derniers mois complets, jamais d'écrasement. Les mêmes gabarits sont validés par vitest.

Tâches

  • Créer src/__fixtures__/samples/exemple-desjardins.csv et exemple-tangerine.csv avec le contenu exact ci-dessous (jetons {{M1}} = mois complet précédent, {{M2}} = celui d'avant, rendus MM/YYYY)
  • src-tauri/src/commands/fs_commands.rs : #[tauri::command] pub fn create_sample_import_folders(import_folder: String, today: String) -> Result<Vec<String>, String> avec doc-comment ; NaiveDate::parse_from_str(&today, "%Y-%m-%d") (chrono 0.4.43 compilé avec std/serde seulement : Local::now() et Utc::now() indisponibles, d'où l'argument) ; M1 = 1er du mois de today moins 1 mois, M2 = moins 2 (checked_sub_months) ; Err si import_folder n'est pas un dossier ; Err nommant le dossier si « Exemple Desjardins » ou « Exemple Tangerine » existe déjà, avant toute écriture ; gabarits via include_str!("../../../src/__fixtures__/samples/exemple-desjardins.csv") (chemin relatif à src-tauri/src/commands/) ; remplacement des jetons ; fs::create_dir + fs::write de releve-YYYY-MM.csv (YYYY-MM de M1) dans chaque dossier ; retour = les deux noms de dossiers (pas les chemins)
  • Enregistrer la commande dans tauri::generate_handler![...] de src-tauri/src/lib.rs:435-478
  • Tests Rust #[cfg(test)] dans fs_commands.rs avec un helper fn sandbox(name: &str) -> PathBuf = std::env::temp_dir().join(format!("simpl-resultat-samples-{}-{}", std::process::id(), name)), create_dir_all au début, remove_dir_all à la fin y compris sur les chemins Err (les cas d'un même binaire tournent en parallèle dans un seul processus ; token_store.rs:382 à process::id() seul ne suffit pas). Cas : dossier absent → Err ; « Exemple Desjardins » déjà présent → Err et « Exemple Tangerine » non créé ; succès avec today = "2026-09-25" → deux fichiers releve-2026-08.csv, aucun {{ résiduel, toutes les dates DD/MM/YYYY en 08/2026 ou 07/2026 ; today = "pas-une-date" → Err ; today = "2027-01-15" → 12/2026 et 11/2026, fichiers releve-2026-12.csv
  • src/__fixtures__/samples/index.ts (nouveau) : readSampleTemplate(name: "desjardins" | "tangerine"): string (readFileSync(resolve(import.meta.dirname, ...))) et renderSampleTemplate(raw, m1: "MM/YYYY", m2: "MM/YYYY"). Ne pas toucher à src/__fixtures__/csv/index.ts ni à CsvFixtureName : le corpus est gelé à 15 par csvAutoDetect.test.ts:264 et six boucles (csvAutoDetect.test.ts:265, 274, 281, 957, 1074, bankSignatures.test.ts:315) passent chaque nom brut à la détection
  • src/__integration__/onboarding-samples.test.ts (nouveau) : pour chaque gabarit rendu avec m1="08/2026", m2="07/2026" : detectImportFormat → status: "ok", bank = "desjardins" / "tangerine", config.signConvention === "negative_expense", config.amountMode === "single", score 40/40 ; parsing complet avec la config → 0 ligne en erreur, somme des montants +740,00 (Desjardins) et −368,46 (Tangerine) ; puis vi.mock("../services/db") avec select renvoyant les 180 lignes INSERT INTO keywords extraites de src-tauri/src/database/consolidated_schema.sql par readFileSync + regex (pattern categorizationService.test.ts:9), appel de categorizeBatch(descriptions) → exactement 33 (Desjardins) et 36 (Tangerine) lignes avec category_id non nul, chacune ≥ 80 %, et les lignes hors seed listées ci-dessous non catégorisées
  • Vérifier sur la PR que check-frontend a tourné (les gabarits sont sous src/, la denylist src-tauri/** de check-frontend.yml:15 reste intacte)

Gabarits

Lignes hors seed, à classer à la main (case 5 de la liste) : Desjardins → GARDERIE LES PETITS PAS ×2, PAIEMENT VISA TANGERINE ×2, VIREMENT INTERAC RECU, CLINIQUE DENTAIRE ST-LAMBERT, RETRAITE QUEBEC ALLOC FAM (7) ; Tangerine → DOLLARAMA ×2, PAIEMENT - MERCI ×2 (4).

exemple-desjardins.csv :

Date;Description;Montant;Solde
01/{{M2}};DEPOT PAIE EMPLOYEUR;1842,50;4258,30
01/{{M2}};MTG/HYP PRET HYPOTHECAIRE;-1236,00;3022,30
02/{{M2}};HYDRO QUEBEC PREAUTORISE;-118,42;2903,88
03/{{M2}};METRO PLUS ST-LAMBERT;-96,18;2807,70
05/{{M2}};VIDEOTRON;-89,95;2717,75
06/{{M2}};STM OPUS EN LIGNE;-97,00;2620,75
08/{{M2}};IGA EXTRA;-132,47;2488,28
09/{{M2}};SHELL BOUL TASCHEREAU;-62,30;2425,98
10/{{M2}};FIZZ MOBILE;-34,49;2391,49
12/{{M2}};JEAN COUTU;-27,85;2363,64
13/{{M2}};GARDERIE LES PETITS PAS;-410,00;1953,64
15/{{M2}};DEPOT PAIE EMPLOYEUR;1842,50;3796,14
16/{{M2}};BELAIR DIRECT ASSURANCE;-94,60;3701,54
17/{{M2}};COSTCO WHOLESALE;-218,73;3482,81
19/{{M2}};VIREMENT INTERAC RECU;120,00;3602,81
20/{{M2}};PAIEMENT VISA TANGERINE;-650,00;2952,81
22/{{M2}};CLINIQUE DENTAIRE ST-LAMBERT;-185,00;2767,81
24/{{M2}};METRO PLUS ST-LAMBERT;-74,62;2693,19
27/{{M2}};RESTAURANT LA BANQUISE;-48,90;2644,29
28/{{M2}};FRAIS MENSUELS;-6,95;2637,34
01/{{M1}};DEPOT PAIE EMPLOYEUR;1842,50;4479,84
01/{{M1}};MTG/HYP PRET HYPOTHECAIRE;-1236,00;3243,84
02/{{M1}};HYDRO QUEBEC PREAUTORISE;-104,17;3139,67
04/{{M1}};METRO PLUS ST-LAMBERT;-112,36;3027,31
05/{{M1}};VIDEOTRON;-89,95;2937,36
06/{{M1}};STM OPUS EN LIGNE;-97,00;2840,36
07/{{M1}};MAXI ET CIE;-88,41;2751,95
09/{{M1}};ULTRAMAR;-58,75;2693,20
10/{{M1}};FIZZ MOBILE;-34,49;2658,71
11/{{M1}};FAMILIPRIX;-41,20;2617,51
13/{{M1}};GARDERIE LES PETITS PAS;-410,00;2207,51
15/{{M1}};DEPOT PAIE EMPLOYEUR;1842,50;4050,01
16/{{M1}};BELAIR DIRECT ASSURANCE;-94,60;3955,41
18/{{M1}};IGA EXTRA;-147,09;3808,32
19/{{M1}};RETRAITE QUEBEC ALLOC FAM;232,00;4040,32
20/{{M1}};PAIEMENT VISA TANGERINE;-712,00;3328,32
21/{{M1}};CANAC;-63,28;3265,04
23/{{M1}};METRO PLUS ST-LAMBERT;-69,84;3195,20
26/{{M1}};SUSHI SHOP;-32,45;3162,75
28/{{M1}};FRAIS MENSUELS;-6,95;3155,80

exemple-tangerine.csv :

Date,Transaction,Name,Memo,Amount
02/{{M2}},DEBIT,COSTCO WHOLESALE,,-164.32
03/{{M2}},DEBIT,TIM HORTONS,,-6.45
04/{{M2}},DEBIT,NETFLIX.COM,,-20.99
05/{{M2}},DEBIT,AMAZON.CA,,-47.88
06/{{M2}},DEBIT,DOLLARAMA,,-18.35
08/{{M2}},DEBIT,STARBUCKS,,-7.90
09/{{M2}},DEBIT,DOORDASH,,-38.64
10/{{M2}},DEBIT,SPOTIFY,,-11.99
11/{{M2}},DEBIT,UNIQLO,,-89.95
12/{{M2}},DEBIT,SAQ,,-43.50
14/{{M2}},DEBIT,MCDONALD'S,,-14.27
15/{{M2}},DEBIT,PHARMAPRIX,,-31.18
16/{{M2}},DEBIT,CANADIAN TIRE,,-76.42
18/{{M2}},DEBIT,RESTAURANT LE PETIT ITALIEN,,-72.30
19/{{M2}},DEBIT,ESSO,,-61.05
20/{{M2}},CREDIT,PAIEMENT - MERCI,,650.00
21/{{M2}},DEBIT,SEPAQ,,-38.00
23/{{M2}},DEBIT,RENAUD-BRAY,,-29.95
25/{{M2}},DEBIT,UBER TRIP,,-17.60
27/{{M2}},DEBIT,CINEPLEX,,-28.50
01/{{M1}},DEBIT,COSTCO WHOLESALE,,-201.17
03/{{M1}},DEBIT,TIM HORTONS,,-5.85
04/{{M1}},DEBIT,NETFLIX.COM,,-20.99
05/{{M1}},DEBIT,AMAZON.CA,,-32.49
07/{{M1}},DEBIT,DOLLARAMA,,-12.40
08/{{M1}},DEBIT,STARBUCKS,,-8.35
09/{{M1}},DEBIT,DOORDASH,,-42.11
10/{{M1}},DEBIT,SPOTIFY,,-11.99
11/{{M1}},DEBIT,SIMONS,,-124.60
12/{{M1}},DEBIT,SAQ,,-38.75
13/{{M1}},DEBIT,A&W,,-16.90
15/{{M1}},DEBIT,PHARMAPRIX,,-24.66
16/{{M1}},DEBIT,RONA,,-58.12
17/{{M1}},DEBIT,BRASSERIE LES FRERES,,-64.80
19/{{M1}},DEBIT,PETRO-CANADA,,-57.40
20/{{M1}},CREDIT,PAIEMENT - MERCI,,712.00
22/{{M1}},DEBIT,LA CORDEE,,-89.99
24/{{M1}},DEBIT,INDIGO,,-34.50
26/{{M1}},DEBIT,UBER TRIP,,-21.15
27/{{M1}},DEBIT,MOUNTAIN EQUIPMENT CO,,-45.00

Fichiers concernés

  • src/__fixtures__/samples/exemple-desjardins.csv, exemple-tangerine.csv, index.ts (nouveaux)
  • src/__integration__/onboarding-samples.test.ts (nouveau)
  • src-tauri/src/commands/fs_commands.rs
  • src-tauri/src/lib.rs

Depends on

(aucune)

Critères d'acceptation

  • cargo test : les cinq cas Rust passent, y compris lancés en parallèle (cargo test -- --test-threads=4)
  • onboarding-samples.test.ts vert avec les valeurs figées (banque, 40/40, 0 erreur, +740,00 / −368,46, 33 / 36 catégorisées, hors seed non catégorisées)
  • csvAutoDetect.test.ts et bankSignatures.test.ts inchangés et verts (CSV_FIXTURE_NAMES toujours 15)
  • check-rust et check-frontend ont tous deux tourné sur la PR
  • La commande ne reçoit jamais un chemin de fichier à écrire : seulement le dossier d'import et la date

Review caveats

  • (ARCHITECTURE, résolu) Module de fixtures séparé, CsvFixtureName intact.
  • (SECURITE + TECHNIQUE, résolu) Sandbox par cas de test ; gabarits sous src/ pour la CI frontend.
  • (SECURITE, hors périmètre, décidé le 2026-10-03) Pas de rollback remove_dir_all sur échec partiel : la vérification des deux dossiers avant toute écriture suffit ; un échec d'écriture après création reste possible sur disque plein et laisse un dossier vide, accepté.

Décisions prises en planification

  • Case 5 de la liste = « une transaction classée à la main » (is_manually_categorized = 1) et non « règle créée » ni « transactions catégorisées » : le seed IPC met 180 mots-clés dans tout profil neuf et le wizard catégorise pendant l'import (useImportWizard.ts:1016).
  • Ordre des vagues : planned-2026-09-24-paiements s'exécute avant celle-ci (fichiers partagés : fr.json, en.json, CHANGELOG, architecture.md, guide-utilisateur.md) ; partir d'un main qui contient déjà ses clés.
  • today vient du webview (date locale YYYY-MM-DD), jamais de l'horloge Rust : commande déterministe et testable.
  • Noms de dossiers fixes en FR et EN (« Exemple Desjardins », « Exemple Tangerine »).

Spec source

spec-plan-onboarding-phase1.md (local, ignoré par git)

Vague `planned-2026-10-03-onboarding-phase1` (séance `/plan-run` du 2026-10-03, spec + `/review-spec` du 2026-09-25, verdict APPROUVÉ après intégration). Les fichiers `spec-decisions-onboarding-phase1.md` / `spec-plan-onboarding-phase1.md` sont **ignorés par git** : ce corps est auto-suffisant, ne pas chercher le spec. Analyse d'origine : `docs/analyse-onboarding-2026-09.md`. Règles de la vague : pile linéaire (chaque PR part de la précédente) ; **ne pas toucher `CHANGELOG.md` / `CHANGELOG.fr.md`** avant #357 qui les centralise ; FR + EN pour toute clé i18n (`.claude/rules/i18n.md`) ; aucune migration DB ; aucune chaîne en dur dans les composants. ## Objectif Nouvelle commande Rust qui écrit deux sous-dossiers de CSV réalistes (Desjardins compte chèques, Tangerine carte de crédit) dans le dossier d'import, dates recalculées sur les deux derniers mois complets, jamais d'écrasement. Les mêmes gabarits sont validés par vitest. ## Tâches - [ ] Créer `src/__fixtures__/samples/exemple-desjardins.csv` et `exemple-tangerine.csv` avec le contenu **exact** ci-dessous (jetons `{{M1}}` = mois complet précédent, `{{M2}}` = celui d'avant, rendus `MM/YYYY`) - [ ] `src-tauri/src/commands/fs_commands.rs` : `#[tauri::command] pub fn create_sample_import_folders(import_folder: String, today: String) -> Result<Vec<String>, String>` avec doc-comment ; `NaiveDate::parse_from_str(&today, "%Y-%m-%d")` (chrono 0.4.43 compilé avec `std`/`serde` seulement : `Local::now()` et `Utc::now()` **indisponibles**, d'où l'argument) ; M1 = 1er du mois de `today` moins 1 mois, M2 = moins 2 (`checked_sub_months`) ; `Err` si `import_folder` n'est pas un dossier ; `Err` nommant le dossier si « Exemple Desjardins » ou « Exemple Tangerine » existe déjà, **avant** toute écriture ; gabarits via `include_str!("../../../src/__fixtures__/samples/exemple-desjardins.csv")` (chemin relatif à `src-tauri/src/commands/`) ; remplacement des jetons ; `fs::create_dir` + `fs::write` de `releve-YYYY-MM.csv` (YYYY-MM de M1) dans chaque dossier ; retour = les deux **noms** de dossiers (pas les chemins) - [ ] Enregistrer la commande dans `tauri::generate_handler![...]` de `src-tauri/src/lib.rs:435-478` - [ ] Tests Rust `#[cfg(test)]` dans `fs_commands.rs` avec un helper `fn sandbox(name: &str) -> PathBuf` = `std::env::temp_dir().join(format!("simpl-resultat-samples-{}-{}", std::process::id(), name))`, `create_dir_all` au début, `remove_dir_all` à la fin **y compris sur les chemins `Err`** (les cas d'un même binaire tournent en parallèle dans un seul processus ; `token_store.rs:382` à `process::id()` seul ne suffit pas). Cas : dossier absent → `Err` ; « Exemple Desjardins » déjà présent → `Err` et « Exemple Tangerine » non créé ; succès avec `today = "2026-09-25"` → deux fichiers `releve-2026-08.csv`, aucun `{{` résiduel, toutes les dates `DD/MM/YYYY` en `08/2026` ou `07/2026` ; `today = "pas-une-date"` → `Err` ; `today = "2027-01-15"` → `12/2026` et `11/2026`, fichiers `releve-2026-12.csv` - [ ] `src/__fixtures__/samples/index.ts` (nouveau) : `readSampleTemplate(name: "desjardins" | "tangerine"): string` (`readFileSync(resolve(import.meta.dirname, ...))`) et `renderSampleTemplate(raw, m1: "MM/YYYY", m2: "MM/YYYY")`. **Ne pas toucher** à `src/__fixtures__/csv/index.ts` ni à `CsvFixtureName` : le corpus est gelé à 15 par `csvAutoDetect.test.ts:264` et six boucles (`csvAutoDetect.test.ts:265, 274, 281, 957, 1074`, `bankSignatures.test.ts:315`) passent chaque nom brut à la détection - [ ] `src/__integration__/onboarding-samples.test.ts` (nouveau) : pour chaque gabarit rendu avec `m1="08/2026"`, `m2="07/2026"` : `detectImportFormat` → `status: "ok"`, `bank` = `"desjardins"` / `"tangerine"`, `config.signConvention === "negative_expense"`, `config.amountMode === "single"`, score 40/40 ; parsing complet avec la config → 0 ligne en erreur, somme des montants **+740,00** (Desjardins) et **−368,46** (Tangerine) ; puis `vi.mock("../services/db")` avec `select` renvoyant les 180 lignes `INSERT INTO keywords` extraites de `src-tauri/src/database/consolidated_schema.sql` par `readFileSync` + regex (pattern `categorizationService.test.ts:9`), appel de `categorizeBatch(descriptions)` → **exactement 33** (Desjardins) et **36** (Tangerine) lignes avec `category_id` non nul, chacune ≥ 80 %, et les lignes hors seed listées ci-dessous **non** catégorisées - [ ] Vérifier sur la PR que `check-frontend` a tourné (les gabarits sont sous `src/`, la denylist `src-tauri/**` de `check-frontend.yml:15` reste intacte) ## Gabarits Lignes hors seed, à classer à la main (case 5 de la liste) : Desjardins → GARDERIE LES PETITS PAS ×2, PAIEMENT VISA TANGERINE ×2, VIREMENT INTERAC RECU, CLINIQUE DENTAIRE ST-LAMBERT, RETRAITE QUEBEC ALLOC FAM (7) ; Tangerine → DOLLARAMA ×2, PAIEMENT - MERCI ×2 (4). `exemple-desjardins.csv` : ``` Date;Description;Montant;Solde 01/{{M2}};DEPOT PAIE EMPLOYEUR;1842,50;4258,30 01/{{M2}};MTG/HYP PRET HYPOTHECAIRE;-1236,00;3022,30 02/{{M2}};HYDRO QUEBEC PREAUTORISE;-118,42;2903,88 03/{{M2}};METRO PLUS ST-LAMBERT;-96,18;2807,70 05/{{M2}};VIDEOTRON;-89,95;2717,75 06/{{M2}};STM OPUS EN LIGNE;-97,00;2620,75 08/{{M2}};IGA EXTRA;-132,47;2488,28 09/{{M2}};SHELL BOUL TASCHEREAU;-62,30;2425,98 10/{{M2}};FIZZ MOBILE;-34,49;2391,49 12/{{M2}};JEAN COUTU;-27,85;2363,64 13/{{M2}};GARDERIE LES PETITS PAS;-410,00;1953,64 15/{{M2}};DEPOT PAIE EMPLOYEUR;1842,50;3796,14 16/{{M2}};BELAIR DIRECT ASSURANCE;-94,60;3701,54 17/{{M2}};COSTCO WHOLESALE;-218,73;3482,81 19/{{M2}};VIREMENT INTERAC RECU;120,00;3602,81 20/{{M2}};PAIEMENT VISA TANGERINE;-650,00;2952,81 22/{{M2}};CLINIQUE DENTAIRE ST-LAMBERT;-185,00;2767,81 24/{{M2}};METRO PLUS ST-LAMBERT;-74,62;2693,19 27/{{M2}};RESTAURANT LA BANQUISE;-48,90;2644,29 28/{{M2}};FRAIS MENSUELS;-6,95;2637,34 01/{{M1}};DEPOT PAIE EMPLOYEUR;1842,50;4479,84 01/{{M1}};MTG/HYP PRET HYPOTHECAIRE;-1236,00;3243,84 02/{{M1}};HYDRO QUEBEC PREAUTORISE;-104,17;3139,67 04/{{M1}};METRO PLUS ST-LAMBERT;-112,36;3027,31 05/{{M1}};VIDEOTRON;-89,95;2937,36 06/{{M1}};STM OPUS EN LIGNE;-97,00;2840,36 07/{{M1}};MAXI ET CIE;-88,41;2751,95 09/{{M1}};ULTRAMAR;-58,75;2693,20 10/{{M1}};FIZZ MOBILE;-34,49;2658,71 11/{{M1}};FAMILIPRIX;-41,20;2617,51 13/{{M1}};GARDERIE LES PETITS PAS;-410,00;2207,51 15/{{M1}};DEPOT PAIE EMPLOYEUR;1842,50;4050,01 16/{{M1}};BELAIR DIRECT ASSURANCE;-94,60;3955,41 18/{{M1}};IGA EXTRA;-147,09;3808,32 19/{{M1}};RETRAITE QUEBEC ALLOC FAM;232,00;4040,32 20/{{M1}};PAIEMENT VISA TANGERINE;-712,00;3328,32 21/{{M1}};CANAC;-63,28;3265,04 23/{{M1}};METRO PLUS ST-LAMBERT;-69,84;3195,20 26/{{M1}};SUSHI SHOP;-32,45;3162,75 28/{{M1}};FRAIS MENSUELS;-6,95;3155,80 ``` `exemple-tangerine.csv` : ``` Date,Transaction,Name,Memo,Amount 02/{{M2}},DEBIT,COSTCO WHOLESALE,,-164.32 03/{{M2}},DEBIT,TIM HORTONS,,-6.45 04/{{M2}},DEBIT,NETFLIX.COM,,-20.99 05/{{M2}},DEBIT,AMAZON.CA,,-47.88 06/{{M2}},DEBIT,DOLLARAMA,,-18.35 08/{{M2}},DEBIT,STARBUCKS,,-7.90 09/{{M2}},DEBIT,DOORDASH,,-38.64 10/{{M2}},DEBIT,SPOTIFY,,-11.99 11/{{M2}},DEBIT,UNIQLO,,-89.95 12/{{M2}},DEBIT,SAQ,,-43.50 14/{{M2}},DEBIT,MCDONALD'S,,-14.27 15/{{M2}},DEBIT,PHARMAPRIX,,-31.18 16/{{M2}},DEBIT,CANADIAN TIRE,,-76.42 18/{{M2}},DEBIT,RESTAURANT LE PETIT ITALIEN,,-72.30 19/{{M2}},DEBIT,ESSO,,-61.05 20/{{M2}},CREDIT,PAIEMENT - MERCI,,650.00 21/{{M2}},DEBIT,SEPAQ,,-38.00 23/{{M2}},DEBIT,RENAUD-BRAY,,-29.95 25/{{M2}},DEBIT,UBER TRIP,,-17.60 27/{{M2}},DEBIT,CINEPLEX,,-28.50 01/{{M1}},DEBIT,COSTCO WHOLESALE,,-201.17 03/{{M1}},DEBIT,TIM HORTONS,,-5.85 04/{{M1}},DEBIT,NETFLIX.COM,,-20.99 05/{{M1}},DEBIT,AMAZON.CA,,-32.49 07/{{M1}},DEBIT,DOLLARAMA,,-12.40 08/{{M1}},DEBIT,STARBUCKS,,-8.35 09/{{M1}},DEBIT,DOORDASH,,-42.11 10/{{M1}},DEBIT,SPOTIFY,,-11.99 11/{{M1}},DEBIT,SIMONS,,-124.60 12/{{M1}},DEBIT,SAQ,,-38.75 13/{{M1}},DEBIT,A&W,,-16.90 15/{{M1}},DEBIT,PHARMAPRIX,,-24.66 16/{{M1}},DEBIT,RONA,,-58.12 17/{{M1}},DEBIT,BRASSERIE LES FRERES,,-64.80 19/{{M1}},DEBIT,PETRO-CANADA,,-57.40 20/{{M1}},CREDIT,PAIEMENT - MERCI,,712.00 22/{{M1}},DEBIT,LA CORDEE,,-89.99 24/{{M1}},DEBIT,INDIGO,,-34.50 26/{{M1}},DEBIT,UBER TRIP,,-21.15 27/{{M1}},DEBIT,MOUNTAIN EQUIPMENT CO,,-45.00 ``` ## Fichiers concernés - `src/__fixtures__/samples/exemple-desjardins.csv`, `exemple-tangerine.csv`, `index.ts` (nouveaux) - `src/__integration__/onboarding-samples.test.ts` (nouveau) - `src-tauri/src/commands/fs_commands.rs` - `src-tauri/src/lib.rs` ## Depends on (aucune) ## Critères d'acceptation - [ ] `cargo test` : les cinq cas Rust passent, y compris lancés en parallèle (`cargo test -- --test-threads=4`) - [ ] `onboarding-samples.test.ts` vert avec les valeurs figées (banque, 40/40, 0 erreur, +740,00 / −368,46, 33 / 36 catégorisées, hors seed non catégorisées) - [ ] `csvAutoDetect.test.ts` et `bankSignatures.test.ts` inchangés et verts (`CSV_FIXTURE_NAMES` toujours 15) - [ ] `check-rust` et `check-frontend` ont tous deux tourné sur la PR - [ ] La commande ne reçoit jamais un chemin de fichier à écrire : seulement le dossier d'import et la date ## Review caveats - (ARCHITECTURE, résolu) Module de fixtures séparé, `CsvFixtureName` intact. - (SECURITE + TECHNIQUE, résolu) Sandbox par cas de test ; gabarits sous `src/` pour la CI frontend. - (SECURITE, hors périmètre, décidé le 2026-10-03) Pas de rollback `remove_dir_all` sur échec partiel : la vérification des deux dossiers avant toute écriture suffit ; un échec d'écriture après création reste possible sur disque plein et laisse un dossier vide, accepté. ## Décisions prises en planification - Case 5 de la liste = « une transaction classée à la main » (`is_manually_categorized = 1`) et non « règle créée » ni « transactions catégorisées » : le seed IPC met 180 mots-clés dans tout profil neuf et le wizard catégorise pendant l'import (`useImportWizard.ts:1016`). - Ordre des vagues : `planned-2026-09-24-paiements` s'exécute **avant** celle-ci (fichiers partagés : `fr.json`, `en.json`, CHANGELOG, `architecture.md`, `guide-utilisateur.md`) ; partir d'un `main` qui contient déjà ses clés. - `today` vient du webview (date locale `YYYY-MM-DD`), jamais de l'horloge Rust : commande déterministe et testable. - Noms de dossiers fixes en FR et EN (« Exemple Desjardins », « Exemple Tangerine »). ## Spec source spec-plan-onboarding-phase1.md (local, ignoré par git)
maximus added this to the planned-2026-10-03-onboarding-phase1 milestone 2026-09-26 12:24:30 +00:00
maximus added the
status:ready
type:feature
source:human
labels 2026-09-26 12:24:30 +00:00
maximus changed title from Onboarding: create_sample_import_folders Tauri command, sample CSV templates and detection test to Onboarding : commande Tauri create_sample_import_folders, gabarits CSV d'exemple et test de détection 2026-10-03 14:09:45 +00:00
maximus added
status:in-progress
and removed
status:ready
labels 2026-10-03 23:43:43 +00:00
maximus added
status:review
and removed
status:in-progress
labels 2026-10-03 23:51:29 +00:00
maximus added
status:approved
and removed
status:review
labels 2026-10-03 23:52:27 +00:00
maximus removed the
status:approved
label 2026-10-04 12:52:52 +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#354
No description provided.