OdinFinanceOdinFinance
Le logiciel de trésorerie que j'ai créé pour le BDE ODIN : chaque opération est enregistrée compte par compte, et le bilan financier de l'assemblée générale sort en un clic, au format Excel déjà utilisé par l'association. The treasury software I built for the ODIN student union: every transaction is recorded account by account, and the General Assembly's financial report is exported in one click, in the Excel layout the union already uses.
ContexteContext
Trésorier du BDE ODIN, le bureau des élèves de mon département, je tenais les comptes dans des tableurs. Il était difficile de retrouver qui avait payé quoi, et quand. L'association a plusieurs comptes (compte courant, Livret A, caisses, SumUp), son exercice ne suit pas l'année civile (d'avril à mars), et son bilan financier est présenté puis signé en assemblée générale par les présidents et trésoriers sortants et entrants. J'ai donc décidé de créer notre propre outil.
As treasurer of ODIN, my department's student union, I kept the accounts in spreadsheets. It was hard to trace who had paid what, and when. The union has several accounts (current account, savings account, cash boxes, SumUp), its financial year does not follow the calendar year (April to March), and its financial report is presented and then signed at the General Assembly by the outgoing and incoming presidents and treasurers. So I decided to build our own tool.
ObjectifObjective
Réunir toute la trésorerie au même endroit, garder l'historique de chaque opération et produire, sans retouche manuelle, le bilan financier de l'AG dans la mise en page exacte du classeur Excel de l'association. Un trésorier qui me succède doit pouvoir reprendre les données sans effort.
Keep the whole treasury in one place, keep a history of every transaction and produce the General Assembly's financial report, with no manual spreadsheet work, in the exact layout of the union's Excel workbook. A treasurer who takes over from me must be able to pick up the data easily.
Mon rôleMy role
- Concevoir et développer toute l'application, du besoin de départ à la version 2, avec une architecture MVC : un contrôleur par écran, et les calculs (soldes, compte de résultat, journaux mensuels) isolés dans des services sans dépendance à Qt, couverts par des tests unitaires.
- Créer la base SQLite avec clés étrangères, contraintes de cohérence et migration automatique du schéma. Les montants sont stockés en centimes (entiers) pour éviter les erreurs d'arrondi.
- Mettre en place un pipeline GitHub Actions : à chaque envoi, l'application est compilée avec PyInstaller sous Windows, macOS et Linux, les tests sont lancés, puis chaque version publiée produit une Release avec les trois archives.
- Reprendre automatiquement les données de la version 1 : la base est convertie (montants en centimes, opérations rattachées à un compte) et l'ancienne est sauvegardée.
- Designed and developed the whole application, from the initial need to version 2, with an MVC architecture: one controller per screen, and the calculations (balances, income statement, monthly ledgers) isolated in services that do not depend on Qt, covered by unit tests.
- Created the SQLite database with foreign keys, integrity constraints and automatic schema migration. Amounts are stored in cents (integers) to avoid rounding errors.
- Set up a GitHub Actions pipeline: on every push, the application is built with PyInstaller on Windows, macOS and Linux and the tests are run, then each tagged version produces a Release with the three archives.
- Migrated version 1 data automatically: the database is converted (amounts in cents, transactions linked to an account) and the old one is backed up.
J'ai développé l'application avec l'aide d'assistants IA : Gemini pour la version 1, puis Claude pour la version 2.
I built the application with the help of AI assistants: Gemini for version 1, then Claude for version 2.
FonctionnalitésFeatures
- Synthèse : solde de chaque compte et total, compte de résultat avec produits et charges (et lignes « dont … » pour les sous-catégories), filtres par mois, compte, catégorie et tiers.
- Journal : recettes, dépenses et virements entre deux comptes (qui ne comptent ni en produit ni en charge). Saisie enchaînée, modification par double-clic, recherche, tri par colonne, montants signés et colorés.
- Paramètres : nom de l'association, dates de l'exercice, comptes avec numéro et solde initial, catégories, sous-catégories et tiers. Un compte ou une catégorie utilisés ne peuvent pas être supprimés, et le message explique quoi faire.
- Erreurs en ligne : chaque champ invalide est signalé sous le champ, avec la correction attendue, sans fenêtre bloquante.
- Export Excel du bilan : un journal par compte (Débit / Crédit) avec sous-totaux, solde et variation de chaque mois, puis un résumé avec soldes de clôture, compte de résultat et cadres de signature. Les totaux restent des formules Excel.
- Deux thèmes au choix, mémorisés : Cyberpunk (l'identité de ce portfolio) et Classique (clair et sobre).
- Raccourcis clavier pour changer d'écran, chercher, exporter ou changer de thème.
- Summary: balance of each account and total, income statement with income and expenses (and “of which…” lines for sub-categories), filters by month, account, category and third party.
- Journal: income, expenses and transfers between two accounts (which count as neither income nor expense). Chained entry, edit by double-click, search, sorting by column, signed and coloured amounts.
- Settings: union name, financial year dates, accounts with number and opening balance, categories, sub-categories and third parties. An account or category in use cannot be deleted, and the message explains what to do.
- Inline errors: each invalid field is flagged right under it, with the expected fix, instead of a blocking pop-up.
- Excel export of the report: one ledger per account (Debit / Credit) with each month's subtotal, balance and change, then a summary with closing balances, income statement and signature boxes. Totals stay as Excel formulas.
- Two themes to choose from, remembered: Cyberpunk (this portfolio's identity) and Classique (light and sober).
- Keyboard shortcuts to switch screens, search, export or change theme.
ImagesScreenshots
Gestion de projetProject management
- Projet versionné avec Git et GitHub, messages de commit conventionnels et versions étiquetées (1.0 puis 2.0).
- Notes de version de la 2.0 rédigées pour les utilisateurs, avec la marche à suivre pour reprendre les données de la version 1.
- Documentation du produit et de son design (thèmes, couleurs, composants) dans le dépôt.
- Versioned with Git and GitHub, with conventional commit messages and tagged releases (1.0, then 2.0).
- Version 2.0 release notes written for users, including how to bring over version 1 data.
- Product and design documentation (themes, colours, components) kept in the repository.
Compétences acquisesSkills gained
- Partir d'un vrai besoin, le mien et celui de l'association, et livrer un outil utilisable par quelqu'un d'autre.
- Séparer l'interface, la logique et les données pour pouvoir tester les calculs seuls.
- Automatiser la compilation et la publication d'une application de bureau sur trois systèmes.
- Starting from a real need, mine and the union's, and delivering a tool someone else can use.
- Separating the interface, the logic and the data so the calculations can be tested on their own.
- Automating the build and release of a desktop application on three operating systems.