|
All checks were successful
PR Check — Frontend / frontend (pull_request) Successful in 1m41s
Two failure modes, both anchored on the header row.
A KNOWN BANK IS NOW READ BY NAME. `bankSignatures.ts` declares the
documented export layout of Desjardins, RBC, Banque Nationale and
Tangerine as a set of normalized header labels plus a delimiter and a
preamble quirk. The table is evaluated BEFORE the generic dictionary and
an unknown file falls straight through to it, unchanged.
The signatures are not decorative. The generic dictionary matches
keywords as substrings, one role at a time, which reads two of these
four layouts wrong — both frozen as counterfactual test pairs, same
rows, header renamed:
- Tangerine writes `Date,Transaction,Name,Memo,Amount`. `Transaction`
is a description keyword, so every row of the file was labelled with
its direction word instead of the merchant.
- RBC writes its amount column `CAD$`, which no amount keyword
matches, next to a nearly empty `Cheque Number`. Those two are
sparse-complementary, so the shape scan paired them as debit/credit
and the one row carrying a cheque number imported as -247.95 instead
of -6.95.
A signature stays a set of PREFERENCES all the same: they are written
from documented layouts, without real statements, so every hint is
dropped the moment the data contradicts it. The single exception is the
amount mode, which outranks the sparse-complementary scan — nothing
inside an RBC file can tell that pair from a genuine one — and even that
is refused unless the declared columns are candidates the shape scan
proposed. Failing degrades to the generic path; it never breaks.
FORMAT DRIFT IS NOW REPORTED INSTEAD OF IMPORTED. Every successful
import records the normalized labels of its header row in
`import_sources.header_signature`, as a JSON array and not a hash: the
panel has to be able to name the columns that moved. On the next import,
a header that normalizes differently opens a `FormatDriftPanel` above
the preview — column by column, `Montant : 3 -> 4` — with the two
outcomes that exist: adopt the re-detected format, or keep the stored
one. A cosmetic rename (`Montant` -> `MONTANT ($)`) normalizes
identically and says nothing.
A source whose file has no header row keeps `header_signature` NULL and
drift detection is inoperative on it. Documented, not worked around:
a signature invented from the data would fire on every import.
THE REPAIR PATH IS NOW IN THE INTERFACE, in the drift panel and beside
the preview's sign flip. `findDuplicates` matches on date AND
description AND amount, so re-importing a file "now that it reads right"
does not correct the rows already written — it doubles them, and a
flipped sign produces mirror pairs that net to zero in every report. The
only safe path is deleting the faulty import from the history first.
The drift re-detection reuses `detectFormatForFile`, so there is still
exactly one detector; the static guard on its caller count moves from
two to three deliberately. Its score and bank badge are dropped straight
after: they measure the format the panel offers, not the one in use.
Resolves #330
|
||
|---|---|---|
| .cargo | ||
| .claude | ||
| .forgejo/workflows | ||
| .github/workflows | ||
| config | ||
| docs | ||
| public | ||
| src | ||
| src-tauri | ||
| tasks | ||
| tests/smoke | ||
| .gitignore | ||
| CHANGELOG.fr.md | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| index.html | ||
| LICENSE | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| spec-decisions-collapse-multi-niveaux.md | ||
| spec-decisions-feature-gating.md | ||
| spec-decisions-import-csv-format.md | ||
| spec-decisions-refonte-seed-categories-ipc.md | ||
| spec-issue-66-oauth-keychain.md | ||
| spec-monetisation.md | ||
| spec-plan-collapse-multi-niveaux.md | ||
| spec-plan-feature-gating.md | ||
| spec-plan-import-csv-format.md | ||
| spec-plan-refonte-seed-categories-ipc.md | ||
| spec-refonte-rapports.md | ||
| spec-simpl-resultat-web.md | ||
| STATE.md | ||
| tsconfig.json | ||
| tsconfig.node.json | ||
| vite.config.ts | ||
Simpl'Résultat
Application de bureau 100 % locale pour importer, catégoriser et analyser vos transactions financières personnelles ou d'entreprise. Aucune donnée ne quitte votre ordinateur.
Fonctionnalités
- Import CSV — Importez vos relevés bancaires depuis plusieurs sources avec auto-détection des colonnes et modèles d'import réutilisables
- Tableau de bord — Vue d'ensemble avec KPIs, répartition par catégorie et dernières transactions
- Transactions — Parcourez, recherchez et filtrez avec sélection rapide de période
- Catégorisation automatique — Attribution automatique par mots-clés, avec ajustement manuel
- Split de transactions — Répartissez une transaction sur plusieurs catégories
- Budgets — Grille budgétaire 12 mois par catégorie avec modèles et rapport Budget vs Réel
- Ajustements — Ajustements ponctuels ou récurrents par catégorie
- Rapports — Tendances mensuelles, répartition par catégorie, évolution dans le temps, budget vs réel
- Graphiques interactifs — Motifs SVG, menu contextuel (clic droit), détail des transactions par catégorie
- Profils multiples — Bases de données séparées avec protection PIN optionnelle
- Export / Import de données — Sauvegarde complète avec chiffrement AES-256-GCM optionnel
- Mode sombre — Thème sombre avec palette gris chaud
- Bilingue — Interface disponible en français et en anglais
- Guide utilisateur intégré — Documentation complète accessible depuis les paramètres, imprimable en PDF
- Mise à jour automatique — Notifications et installation des nouvelles versions depuis l'application
Installation
Windows
- Rendez-vous sur la page Releases
- Téléchargez le fichier
.exe(installateur NSIS) - Lancez le fichier téléchargé
Note : Windows SmartScreen peut afficher un avertissement car l'application n'est pas signée numériquement. Cliquez sur « Informations complémentaires » puis « Exécuter quand même » pour continuer.
Linux
- Rendez-vous sur la page Releases
- Téléchargez le format adapté à votre distribution :
.debpour Debian / Ubuntu.rpmpour Fedora / openSUSE.AppImagepour toute distribution (exécutable universel)
- Installez le paquet ou lancez l'AppImage directement
Démarrage rapide
1. Choisir ou créer un profil
Au premier lancement, un profil par défaut est créé. Vous pouvez ajouter d'autres profils (chacun avec sa propre base de données) et les protéger par un PIN.
2. Configurer le dossier d'import
Organisez vos fichiers CSV dans un dossier avec un sous-dossier par source :
Documents/
Comptabilité/
Desjardins/
releve-2024-01.csv
releve-2024-02.csv
Autre banque/
export.csv
3. Importer des transactions
- Allez dans Import
- Sélectionnez le dossier source et les fichiers CSV
- Configurez le mappage des colonnes (ou utilisez un modèle d'import sauvegardé)
- Vérifiez les doublons puis lancez l'import
4. Consulter le tableau de bord
Le tableau de bord affiche automatiquement :
- Les KPIs du mois (revenus, dépenses, solde)
- La répartition des dépenses par catégorie
- Les dernières transactions
5. Parcourir et catégoriser les transactions
- Utilisez la recherche et les filtres (date, catégorie, source, période rapide)
- Modifiez la catégorie d'une transaction en cliquant dessus
- Ajoutez des mots-clés pour automatiser les futures catégorisations
- Scindez une transaction sur plusieurs catégories si nécessaire
6. Gérer les budgets
- Définissez un budget mensuel par catégorie sur une grille 12 mois
- Créez des modèles budgétaires réutilisables
- Consultez le rapport Budget vs Réel pour suivre vos écarts
7. Analyser les rapports
- Tendances — Évolution mensuelle des revenus et dépenses
- Catégories — Répartition détaillée par catégorie (clic droit pour masquer ou voir le détail)
- Évolution — Suivi dans le temps par catégorie
- Budget vs Réel — Comparaison mensuelle et cumul annuel
8. Guide utilisateur
Un guide complet est accessible via Paramètres → Guide utilisateur. Il couvre toutes les fonctionnalités et peut être imprimé ou exporté en PDF.
Développement
Prérequis
Lancer en mode développement
npm install
npm run tauri dev
Compiler l'application
npm run tauri build
Les installateurs sont générés dans src-tauri/target/release/bundle/.
Publier une nouvelle version
- Mettez à jour la version dans
src-tauri/tauri.conf.jsonetpackage.json - Committez les changements
- Créez et poussez un tag :
git tag v0.3.7
git push origin v0.3.7
Le workflow GitHub Actions compile automatiquement l'application pour Windows et Linux, puis publie les installateurs dans une nouvelle Release.
Technologies
| Technologie | Rôle |
|---|---|
| Tauri v2 | Framework desktop (Rust backend) |
| React 19 | Interface utilisateur |
| SQLite | Base de données locale |
| Tailwind CSS v4 | Styles |
| Recharts | Graphiques |
| react-i18next | Internationalisation |
| PapaParse | Parsing CSV |