From 9ea8314149b227ca6070736e9669e65b7e27e9a9 Mon Sep 17 00:00:00 2001 From: Le-King-Fu Date: Mon, 9 Feb 2026 01:40:47 +0000 Subject: [PATCH] feat: seed categories and keywords from SommaireDepense.csv Add v2 migration with 6 parent categories, 36 child categories, and ~85 keywords extracted from the expense summary to enable auto-categorization. Co-Authored-By: Claude Opus 4.6 --- src-tauri/src/database/mod.rs | 1 + src-tauri/src/database/seed_categories.sql | 232 +++++++++++++++++++++ src-tauri/src/lib.rs | 20 +- 3 files changed, 247 insertions(+), 6 deletions(-) create mode 100644 src-tauri/src/database/seed_categories.sql diff --git a/src-tauri/src/database/mod.rs b/src-tauri/src/database/mod.rs index 9e37bdd..22c48e5 100644 --- a/src-tauri/src/database/mod.rs +++ b/src-tauri/src/database/mod.rs @@ -1 +1,2 @@ pub const SCHEMA: &str = include_str!("schema.sql"); +pub const SEED_CATEGORIES: &str = include_str!("seed_categories.sql"); diff --git a/src-tauri/src/database/seed_categories.sql b/src-tauri/src/database/seed_categories.sql new file mode 100644 index 0000000..aeba40c --- /dev/null +++ b/src-tauri/src/database/seed_categories.sql @@ -0,0 +1,232 @@ +-- Migration v2: Seed categories and keywords from SommaireDepense.csv + +-- Clear existing data (FK order: keywords -> categories) +DELETE FROM keywords; +UPDATE transactions SET category_id = NULL; +DELETE FROM categories; + +-- ========================================== +-- Parent categories (Regroupement level) +-- ========================================== +INSERT INTO categories (id, name, type, sort_order) VALUES (1, 'Revenus', 'income', 1); +INSERT INTO categories (id, name, type, sort_order) VALUES (2, 'Dépenses récurrentes', 'expense', 2); +INSERT INTO categories (id, name, type, sort_order) VALUES (3, 'Dépenses ponctuelles', 'expense', 3); +INSERT INTO categories (id, name, type, sort_order) VALUES (4, 'Maison', 'expense', 4); +INSERT INTO categories (id, name, type, sort_order) VALUES (5, 'Placements', 'transfer', 5); +INSERT INTO categories (id, name, type, sort_order) VALUES (6, 'Autres', 'expense', 6); + +-- ========================================== +-- Child categories +-- ========================================== + +-- Revenus children +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (10, 'Paie', 1, 'income', '#22c55e', 1); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (11, 'Autres revenus', 1, 'income', '#4ade80', 2); + +-- Dépenses récurrentes children +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (20, 'Loyer', 2, 'expense', '#ef4444', 1); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (21, 'Électricité', 2, 'expense', '#f59e0b', 2); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (22, 'Épicerie', 2, 'expense', '#10b981', 3); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (23, 'Dons', 2, 'expense', '#ec4899', 4); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (24, 'Restaurant', 2, 'expense', '#f97316', 5); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (25, 'Frais bancaires', 2, 'expense', '#6b7280', 6); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (26, 'Jeux, Films & Livres', 2, 'expense', '#8b5cf6', 7); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (27, 'Abonnements Musique', 2, 'expense', '#06b6d4', 8); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (28, 'Transport en commun', 2, 'expense', '#3b82f6', 9); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (29, 'Internet & Télécom', 2, 'expense', '#6366f1', 10); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (30, 'Animaux', 2, 'expense', '#a855f7', 11); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (31, 'Assurances', 2, 'expense', '#14b8a6', 12); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (32, 'Pharmacie', 2, 'expense', '#f43f5e', 13); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (33, 'Taxes municipales', 2, 'expense', '#78716c', 14); + +-- Dépenses ponctuelles children +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (40, 'Voiture', 3, 'expense', '#64748b', 1); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (41, 'Amazon', 3, 'expense', '#f59e0b', 2); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (42, 'Électroniques', 3, 'expense', '#3b82f6', 3); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (43, 'Alcool', 3, 'expense', '#7c3aed', 4); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (44, 'Cadeaux', 3, 'expense', '#ec4899', 5); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (45, 'Vêtements', 3, 'expense', '#d946ef', 6); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (46, 'CPA', 3, 'expense', '#0ea5e9', 7); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (47, 'Voyage', 3, 'expense', '#f97316', 8); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (48, 'Sports & Plein air', 3, 'expense', '#22c55e', 9); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (49, 'Spectacles & sorties', 3, 'expense', '#e11d48', 10); + +-- Maison children +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (50, 'Hypothèque', 4, 'expense', '#dc2626', 1); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (51, 'Achats maison', 4, 'expense', '#ea580c', 2); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (52, 'Entretien maison', 4, 'expense', '#ca8a04', 3); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (53, 'Électroménagers & Meubles', 4, 'expense', '#0d9488', 4); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (54, 'Outils', 4, 'expense', '#b45309', 5); + +-- Placements children +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (60, 'Placements', 5, 'transfer', '#2563eb', 1); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (61, 'Transferts', 5, 'transfer', '#7c3aed', 2); + +-- Autres children +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (70, 'Impôts', 6, 'expense', '#dc2626', 1); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (71, 'Paiement CC', 6, 'transfer', '#6b7280', 2); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (72, 'Retrait cash', 6, 'expense', '#57534e', 3); +INSERT INTO categories (id, name, parent_id, type, color, sort_order) VALUES (73, 'Projets', 6, 'expense', '#0ea5e9', 4); + +-- ========================================== +-- Keywords +-- ========================================== + +-- Paie (10) +INSERT INTO keywords (keyword, category_id) VALUES ('PAY/PAY', 10); + +-- Électricité (21) +INSERT INTO keywords (keyword, category_id) VALUES ('HYDRO-QUEBEC', 21); + +-- Épicerie (22) +INSERT INTO keywords (keyword, category_id) VALUES ('METRO', 22); +INSERT INTO keywords (keyword, category_id) VALUES ('IGA', 22); +INSERT INTO keywords (keyword, category_id) VALUES ('MAXI', 22); +INSERT INTO keywords (keyword, category_id) VALUES ('SUPER C', 22); +INSERT INTO keywords (keyword, category_id) VALUES ('BOUCHERIE LAFLECHE', 22); +INSERT INTO keywords (keyword, category_id) VALUES ('BOULANGERIE JARRY', 22); +INSERT INTO keywords (keyword, category_id) VALUES ('DOLLARAMA', 22); +INSERT INTO keywords (keyword, category_id) VALUES ('WALMART', 22); + +-- Dons (23) +INSERT INTO keywords (keyword, category_id) VALUES ('OXFAM', 23); +INSERT INTO keywords (keyword, category_id) VALUES ('CENTRAIDE', 23); +INSERT INTO keywords (keyword, category_id) VALUES ('FPA', 23); + +-- Restaurant (24) +INSERT INTO keywords (keyword, category_id) VALUES ('SUBWAY', 24); +INSERT INTO keywords (keyword, category_id) VALUES ('MCDONALD', 24); +INSERT INTO keywords (keyword, category_id) VALUES ('A&W', 24); +INSERT INTO keywords (keyword, category_id) VALUES ('DD/DOORDASH', 24); +INSERT INTO keywords (keyword, category_id) VALUES ('DOORDASH', 24); +INSERT INTO keywords (keyword, category_id) VALUES ('SUSHI', 24); +INSERT INTO keywords (keyword, category_id) VALUES ('DOMINOS', 24); +INSERT INTO keywords (keyword, category_id) VALUES ('BELLE PROVINCE', 24); + +-- Frais bancaires (25) +INSERT INTO keywords (keyword, category_id) VALUES ('PROGRAMME PERFORMANCE', 25); + +-- Jeux, Films & Livres (26) +INSERT INTO keywords (keyword, category_id) VALUES ('STEAMGAMES', 26); +INSERT INTO keywords (keyword, category_id) VALUES ('PLAYSTATION', 26); +INSERT INTO keywords (keyword, category_id) VALUES ('PRIMEVIDEO', 26); +INSERT INTO keywords (keyword, category_id) VALUES ('NINTENDO', 26); +INSERT INTO keywords (keyword, category_id) VALUES ('RENAUD-BRAY', 26); +INSERT INTO keywords (keyword, category_id) VALUES ('CINEMA DU PARC', 26); +INSERT INTO keywords (keyword, category_id) VALUES ('LEGO', 26); + +-- Abonnements Musique (27) +INSERT INTO keywords (keyword, category_id) VALUES ('SPOTIFY', 27); + +-- Transport en commun (28) +INSERT INTO keywords (keyword, category_id) VALUES ('STM', 28); +INSERT INTO keywords (keyword, category_id) VALUES ('GARE MONT-SAINT', 28); +INSERT INTO keywords (keyword, category_id) VALUES ('GARE SAINT-HUBERT', 28); +INSERT INTO keywords (keyword, category_id) VALUES ('GARE CENTRALE', 28); +INSERT INTO keywords (keyword, category_id) VALUES ('REM', 28); + +-- Internet & Télécom (29) +INSERT INTO keywords (keyword, category_id) VALUES ('VIDEOTRON', 29); +INSERT INTO keywords (keyword, category_id) VALUES ('ORICOM', 29); + +-- Animaux (30) +INSERT INTO keywords (keyword, category_id) VALUES ('MONDOU', 30); + +-- Assurances (31) +INSERT INTO keywords (keyword, category_id) VALUES ('BELAIR', 31); +INSERT INTO keywords (keyword, category_id) VALUES ('PRYSM', 31); +INSERT INTO keywords (keyword, category_id) VALUES ('INS/ASS', 31); + +-- Pharmacie (32) +INSERT INTO keywords (keyword, category_id) VALUES ('JEAN COUTU', 32); +INSERT INTO keywords (keyword, category_id) VALUES ('FAMILIPRIX', 32); +INSERT INTO keywords (keyword, category_id) VALUES ('PHARMAPRIX', 32); + +-- Taxes municipales (33) +INSERT INTO keywords (keyword, category_id) VALUES ('M-ST-HILAIRE TX', 33); +INSERT INTO keywords (keyword, category_id) VALUES ('CSS PATRIOT', 33); + +-- Voiture (40) +INSERT INTO keywords (keyword, category_id) VALUES ('SHELL', 40); +INSERT INTO keywords (keyword, category_id) VALUES ('ESSO', 40); +INSERT INTO keywords (keyword, category_id) VALUES ('ULTRAMAR', 40); +INSERT INTO keywords (keyword, category_id) VALUES ('PETRO-CANADA', 40); +INSERT INTO keywords (keyword, category_id) VALUES ('SAAQ', 40); +INSERT INTO keywords (keyword, category_id) VALUES ('CREVIER', 40); + +-- Amazon (41) +INSERT INTO keywords (keyword, category_id) VALUES ('AMAZON', 41); +INSERT INTO keywords (keyword, category_id) VALUES ('AMZN', 41); + +-- Électroniques (42) +INSERT INTO keywords (keyword, category_id) VALUES ('MICROSOFT', 42); +INSERT INTO keywords (keyword, category_id) VALUES ('ADDISON ELECTRONIQUE', 42); + +-- Alcool (43) +INSERT INTO keywords (keyword, category_id) VALUES ('SAQ', 43); +INSERT INTO keywords (keyword, category_id) VALUES ('SQDC', 43); + +-- Cadeaux (44) +INSERT INTO keywords (keyword, category_id) VALUES ('DANS UN JARDIN', 44); + +-- Vêtements (45) +INSERT INTO keywords (keyword, category_id) VALUES ('UNIQLO', 45); +INSERT INTO keywords (keyword, category_id) VALUES ('WINNERS', 45); +INSERT INTO keywords (keyword, category_id) VALUES ('SIMONS', 45); + +-- CPA (46) +INSERT INTO keywords (keyword, category_id) VALUES ('ORDRE DES COMPTABL', 46); + +-- Voyage (47) +INSERT INTO keywords (keyword, category_id) VALUES ('NORWEGIAN CRUISE', 47); +INSERT INTO keywords (keyword, category_id) VALUES ('AEROPORTS DE MONTREAL', 47); +INSERT INTO keywords (keyword, category_id) VALUES ('HILTON', 47); + +-- Sports & Plein air (48) +INSERT INTO keywords (keyword, category_id) VALUES ('BLOC SHOP', 48); +INSERT INTO keywords (keyword, category_id) VALUES ('SEPAQ', 48); +INSERT INTO keywords (keyword, category_id) VALUES ('LA CORDEE', 48); +INSERT INTO keywords (keyword, category_id) VALUES ('MOUNTAIN EQUIPMENT', 48); +INSERT INTO keywords (keyword, category_id) VALUES ('PHYSIOACTIF', 48); +INSERT INTO keywords (keyword, category_id) VALUES ('DECATHLON', 48); + +-- Spectacles & sorties (49) +INSERT INTO keywords (keyword, category_id) VALUES ('TICKETMASTER', 49); +INSERT INTO keywords (keyword, category_id) VALUES ('CLUB SODA', 49); +INSERT INTO keywords (keyword, category_id) VALUES ('LEPOINTDEVENTE', 49); + +-- Hypothèque (50) +INSERT INTO keywords (keyword, category_id) VALUES ('MTG/HYP', 50); + +-- Achats maison (51) +INSERT INTO keywords (keyword, category_id) VALUES ('CANADIAN TIRE', 51); +INSERT INTO keywords (keyword, category_id) VALUES ('CANAC', 51); +INSERT INTO keywords (keyword, category_id) VALUES ('RONA', 51); + +-- Entretien maison (52) +INSERT INTO keywords (keyword, category_id) VALUES ('IKEA', 52); + +-- Électroménagers & Meubles (53) +INSERT INTO keywords (keyword, category_id) VALUES ('TANGUAY', 53); +INSERT INTO keywords (keyword, category_id) VALUES ('BOUCLAIR', 53); + +-- Outils (54) +INSERT INTO keywords (keyword, category_id) VALUES ('BMR', 54); +INSERT INTO keywords (keyword, category_id) VALUES ('HOME DEPOT', 54); +INSERT INTO keywords (keyword, category_id) VALUES ('PRINCESS AUTO', 54); + +-- Placements (60) +INSERT INTO keywords (keyword, category_id) VALUES ('DYNAMIC FUND', 60); +INSERT INTO keywords (keyword, category_id) VALUES ('FIDELITY', 60); +INSERT INTO keywords (keyword, category_id) VALUES ('AGF', 60); + +-- Transferts (61) +INSERT INTO keywords (keyword, category_id) VALUES ('WS INVESTMENTS', 61); +INSERT INTO keywords (keyword, category_id) VALUES ('PEAK INVESTMENT', 61); + +-- Impôts (70) +INSERT INTO keywords (keyword, category_id) VALUES ('GOUV. QUEBEC', 70); + +-- Projets (73) +INSERT INTO keywords (keyword, category_id) VALUES ('CLAUDE.AI', 73); +INSERT INTO keywords (keyword, category_id) VALUES ('NAME-CHEAP', 73); diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index a65b9d71..18351c6 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -5,12 +5,20 @@ use tauri_plugin_sql::{Migration, MigrationKind}; #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { - let migrations = vec![Migration { - version: 1, - description: "create initial schema", - sql: database::SCHEMA, - kind: MigrationKind::Up, - }]; + let migrations = vec![ + Migration { + version: 1, + description: "create initial schema", + sql: database::SCHEMA, + kind: MigrationKind::Up, + }, + Migration { + version: 2, + description: "seed categories and keywords", + sql: database::SEED_CATEGORIES, + kind: MigrationKind::Up, + }, + ]; tauri::Builder::default() .plugin(tauri_plugin_opener::init())