Passer au contenu principal

Workflows Scriptables avec Beancount et Fava

Beancount (un outil de comptabilité en texte brut à double entrée) et Fava (son interface web) sont hautement extensibles et scriptables. Leur conception vous permet d'automatiser les tâches financières, de générer des rapports personnalisés et de configurer des alertes en écrivant des scripts Python. Selon les mots d'un utilisateur, "J'aime vraiment avoir mes données dans un format si pratique, et j'aime pouvoir automatiser les choses à ma guise. Il n'y a pas d'API comme un fichier sur votre disque ; c'est facile à intégrer." Ce guide vous expliquera comment créer des workflows scriptables, de l'automatisation conviviale pour débutants aux plugins Fava avancés.

Pour Commencer : Exécuter Beancount en tant que Script Python

workflows-scriptables

Avant de plonger dans des tâches spécifiques, assurez-vous que Beancount est installé (par exemple, via pip install beancount). Étant donné que Beancount est écrit en Python, vous pouvez l'utiliser comme une bibliothèque dans vos propres scripts. L'approche générale est la suivante :

  • Charger votre ledger Beancount : Utilisez le loader de Beancount pour analyser le fichier .beancount en objets Python. Par exemple :

    from beancount import loader
    entries, errors, options_map = loader.load_file("myledger.beancount")
    if errors:
    print("Erreurs :", errors)

    Cela vous donne une liste d'entries (transactions, soldes, etc.) et une options_map avec des métadonnées. Tous vos comptes, transactions et soldes sont désormais accessibles dans le code.

  • Tirer parti du Beancount Query Language (BQL) : Au lieu d'itérer manuellement, vous pouvez exécuter des requêtes de type SQL sur les données. Par exemple, pour obtenir le total des dépenses par mois, vous pouvez utiliser l'API de requête :

    from beancount.query import query
    q = query.Query(entries, options_map)
    result = q.query("SELECT month, sum(position) WHERE account ~ 'Expenses' GROUP BY month")
    print(result)

    Cela utilise le système de requête de Beancount pour agréger les données. (En coulisses, c'est similaire à ce que fait la commande bean-query, mais ici, vous l'utilisez dans un script.) En fait, l'auteur de Beancount note que vous pouvez charger le fichier et appeler run_query() directement via l'API Python, évitant ainsi d'avoir à appeler des commandes externes dans une boucle.

  • Mettre en place une structure de projet : Organisez vos scripts à côté de votre ledger. Une disposition courante consiste à avoir des répertoires pour les importers (pour récupérer/analyser des données externes), les reports ou les queries (pour les scripts d'analyse) et les documents (pour stocker les relevés téléchargés). Par exemple, un utilisateur conserve :

    • importers/ - scripts d'importation Python personnalisés (avec des tests),
    • queries/ - scripts pour générer des rapports (exécutables via python3 queries/...),
    • documents/ - CSV/PDF bancaires téléchargés organisés par compte.

Avec cette configuration, vous pouvez exécuter des scripts manuellement (par exemple, python3 queries/cash_flow.py) ou les planifier (via cron ou un task runner) pour automatiser votre workflow.

Automatisation des Tâches de Rapprochement

Le rapprochement consiste à s'assurer que votre ledger correspond aux enregistrements externes (relevés bancaires, rapports de carte de crédit, etc.). Le ledger en texte brut de Beancount et l'API Python permettent d'automatiser une grande partie de ce processus.

Importation et Correspondance des Transactions (Débutant)

Pour les débutants, l'approche recommandée est d'utiliser les importer plugins de Beancount. Vous écrivez une petite classe Python suivant le protocole d'importation de Beancount pour analyser un format donné (CSV, OFX, PDF, etc.) et produire des transactions. Ensuite, utilisez la commande bean-extract ou un script pour appliquer ces importers :

  • Écrivez un importer (une classe Python avec des méthodes comme identify(), extract()) pour le format CSV de votre banque. La documentation de Beancount fournit un guide et des exemples.
  • Utilisez bean-extract dans un script ou un Makefile (comme l'exemple justfile) pour analyser les nouveaux relevés. Par exemple, un workflow exécute bean-extract sur tous les fichiers dans ~/Downloads et génère des transactions dans un fichier temporaire.
  • Examinez et copiez manuellement les transactions du fichier temporaire dans votre ledger principal, puis exécutez bean-check pour vous assurer que les soldes sont rapprochés.

Bien que ce processus implique toujours une étape de revue, une grande partie du travail fastidieux d'analyse et de formatage des entrées est automatisée. Les scripts d'importation peuvent également attribuer automatiquement des catégories et même définir des assertions de solde (déclarations des soldes attendus) pour détecter les écarts. Par exemple, après l'importation, vous pourriez avoir une ligne comme 2025-04-30 balance Assets:Bank:Checking 1234.56 USD qui affirme le solde de clôture. Lorsque vous exécutez bean-check, Beancount vérifiera que toutes ces assertions de solde sont correctes, et signalera toute erreur si des transactions sont manquantes ou dupliquées. C'est une meilleure pratique : générer automatiquement des assertions de solde pour chaque période de relevé afin de laisser l'ordinateur repérer les différences non rapprochées pour vous.

Scripts de Rapprochement Personnalisés (Intermédiaire)

Pour plus de contrôle, vous pouvez écrire un script Python personnalisé pour comparer la liste des transactions d'une banque (CSV ou via API) avec vos entrées de ledger :

  1. Lire les données externes : Analysez le fichier CSV de la banque à l'aide du module csv de Python (ou Pandas). Normalisez les données en une liste de transactions, par exemple, chacune avec une date, un montant et une description.
  2. Charger les transactions du ledger : Utilisez loader.load_file comme indiqué précédemment pour obtenir toutes les entrées du ledger. Filtrez cette liste sur le compte d'intérêt (par exemple, votre compte courant) et peut-être la plage de dates du relevé.
  3. Comparer et trouver les discordances :
  • Pour chaque transaction externe, vérifiez si une entrée identique existe dans le ledger (correspondance par date et montant, peut-être description). Si elle n'est pas trouvée, marquez-la comme "nouvelle" et éventuellement sortez-la comme une transaction formatée Beancount pour que vous puissiez l'examiner.
  • Inversement, identifiez toutes les entrées de ledger dans ce compte qui n'apparaissent pas dans la source externe - il pourrait s'agir d'erreurs de saisie de données ou de transactions qui n'ont pas été compensées par la banque.
  1. Sortir les résultats : Imprimez un rapport ou créez un nouvel extrait .beancount avec les transactions manquantes.

Par exemple, un script communautaire appelé reconcile.py fait exactement cela : étant donné un fichier Beancount et un CSV d'entrée, il imprime une liste des nouvelles transactions qui devraient être importées, ainsi que tous les enregistrements de ledger existants qui ne sont pas dans l'entrée (potentiellement un signe de mauvaise classification). Avec un tel script, le rapprochement mensuel peut être aussi simple que de l'exécuter et ensuite d'ajouter les transactions suggérées à votre ledger. Un utilisateur de Beancount note qu'il "fait un processus de rapprochement sur tous les comptes chaque mois" et utilise une collection croissante de code Python pour éliminer une grande partie du travail manuel dans l'importation et le rapprochement des données.

Conseil : Pendant le rapprochement, tirez parti des outils de Beancount pour la précision :

  • Utilisez les assertions de solde comme mentionné, pour avoir des contrôles automatisés sur les soldes des comptes.
  • Utilisez la directive pad si vous le souhaitez, qui peut insérer automatiquement des entrées d'équilibrage pour les différences d'arrondissement mineures (à utiliser avec prudence).
  • Écrivez des tests unitaires pour votre importer ou votre logique de rapprochement (Beancount fournit des helpers de test). Par exemple, un workflow consistait à prendre un exemple de CSV, à écrire des tests en échec avec les transactions attendues, puis à implémenter l'importer jusqu'à ce que tous les tests passent. Cela garantit que votre script d'importation fonctionne correctement pour divers cas.

Génération de Rapports et de Résumés Personnalisés

Bien que Fava fournisse de nombreux rapports standard (Compte de Résultat, Bilan, etc.), vous pouvez créer des rapports personnalisés en utilisant des scripts. Ceux-ci peuvent aller de simples sorties de console à des fichiers ou des graphiques richement formatés.

Interrogation des Données pour les Rapports (Débutant)

À un niveau de base, vous pouvez utiliser le Beancount Query Language (BQL) pour obtenir des données récapitulatives et les imprimer ou les enregistrer. Par exemple :

  • Résumé des Flux de Trésorerie : Utilisez une requête pour calculer le flux de trésorerie net. Le "flux de trésorerie" pourrait être défini comme la variation du solde de certains comptes sur une période. En utilisant BQL, vous pourriez faire :

    SELECT year, month, sum(amount)
    WHERE account LIKE 'Income:%' OR account LIKE 'Expenses:%'
    GROUP BY year, month

    Cela permettrait de compenser tous les enregistrements de revenus et de dépenses par mois. Vous pouvez exécuter ceci via l'interface de ligne de commande bean-query ou via l'API Python (query.Query comme indiqué précédemment) et ensuite formater le résultat.

  • Rapport des Dépenses par Catégorie : Interrogez le total des dépenses par catégorie :

    SELECT account, round(sum(position), 2)
    WHERE account ~ 'Expenses'
    GROUP BY account
    ORDER BY sum(position) ASC

    Cela donne un tableau des dépenses par catégorie. Vous pouvez exécuter plusieurs requêtes dans un script et sortir les résultats sous forme de texte, de CSV ou même de JSON pour un traitement ultérieur.

Un utilisateur a trouvé qu'il était "trivial" d'analyser les données financières avec Fava ou avec des scripts, citant qu'il utilise un script Python pour extraire les données de Beancount via le Query Language et ensuite les mettre dans un DataFrame Pandas pour préparer un rapport personnalisé. Par exemple, vous pourriez récupérer les totaux mensuels avec une requête et ensuite utiliser Pandas/Matplotlib pour tracer un graphique des flux de trésorerie au fil du temps. La combinaison de BQL et des bibliothèques de science des données vous permet de construire des rapports au-delà de ce que Fava offre par défaut.

Reporting Avancé (Graphiques, Performance, etc.)

Pour des besoins plus avancés, vos scripts peuvent calculer des métriques comme la performance des investissements ou créer des sorties visuelles :

  • Performance des Investissements (TRI/Taux de Rendement Interne Pondéré dans le Temps) : Puisque votre ledger contient tous les flux de trésorerie (achats, ventes, dividendes), vous pouvez calculer les taux de rendement du portefeuille. Par exemple, vous pourriez écrire un script qui filtre les transactions de vos comptes d'investissement et ensuite calcule le Taux de Rendement Interne. Il existe des bibliothèques (ou des formules) pour calculer le TRI étant donné les données de flux de trésorerie. Certaines extensions Fava développées par la communauté (comme PortfolioSummary ou fava_investor) font exactement cela, en calculant le TRI et d'autres métriques pour les portefeuilles d'investissement. En tant que script, vous pourriez utiliser une fonction TRI (de NumPy ou la vôtre) sur la série de contributions/retraits plus la valeur finale.

  • Métriques Multi-périodes ou Personnalisées : Vous voulez un rapport de votre taux d'épargne (ratio de l'épargne sur le revenu) chaque mois ? Un script Python peut charger le ledger, additionner tous les comptes de Revenus et tous les comptes de Dépenses, ensuite calculer l'épargne = revenus - dépenses et le pourcentage. Cela pourrait sortir un joli tableau ou même générer un rapport HTML/Markdown pour vos enregistrements.

  • Visualisation : Vous pouvez générer des graphiques en dehors de Fava. Par exemple, utilisez matplotlib ou altair dans un script pour créer un graphique de la valeur nette au fil du temps, en utilisant les données du ledger. Parce que le ledger a tous les soldes historiques (ou vous pouvez les accumuler en itérant les entrées), vous pouvez produire des tracés de séries chronologiques. Enregistrez ces graphiques sous forme d'images ou de HTML interactif. (Si vous préférez les visuels intégrés à l'application, consultez la section sur les extensions Fava ci-dessous pour ajouter des graphiques dans Fava.)

Options de Sortie : Décidez comment livrer le rapport :

  • Pour une analyse ponctuelle, l'impression à l'écran ou l'enregistrement dans un fichier CSV/Excel pourrait suffire.
  • Pour les tableaux de bord, envisagez de générer un fichier HTML avec les données (éventuellement en utilisant une bibliothèque de templating comme Jinja2 ou même simplement en écrivant du Markdown) que vous pouvez ouvrir dans un navigateur.
  • Vous pouvez également vous intégrer aux Jupyter Notebooks pour un environnement de reporting interactif, bien que ce soit plus pour l'exploration que pour l'automatisation.

Déclenchement d'Alertes à partir de Votre Ledger

Une autre utilisation puissante des workflows scriptables est la mise en place d'alertes basées sur des conditions dans vos données financières. Parce que votre ledger est mis à jour régulièrement (et peut inclure des éléments datés dans le futur comme les factures ou les budgets à venir), vous pouvez le scanner avec un script et être notifié des événements importants.

Avertissements de Solde de Compte Faible

Pour éviter les découverts ou pour maintenir un solde minimum, vous pourriez vouloir une alerte si un compte (par exemple, courant ou épargne) tombe en dessous d'un seuil. Voici comment vous pouvez implémenter cela :

  1. Déterminer les soldes actuels : Après avoir chargé les entries via le loader, calculez le dernier solde des comptes d'intérêt. Vous pouvez le faire en agrégeant les enregistrements ou en utilisant une requête. Par exemple, utilisez une requête BQL pour le solde d'un compte spécifique :

    SELECT sum(position) WHERE account = 'Assets:Bank:Checking'

    Cela renvoie le solde actuel de ce compte (somme de tous ses enregistrements). Alternativement, utilisez les fonctions internes de Beancount pour construire un bilan. Par exemple :

    from beancount.core import realization
    tree = realization.realize(entries, options_map)
    acct = realization.get_or_create(tree, "Assets:Bank:Checking")
    balance = acct.balance # un Inventaire de commodities

    Ensuite, extrayez la valeur numérique (par exemple, balance.get_currency_units('USD') pourrait donner le Decimal). Cependant, l'utilisation de la requête est plus simple dans la plupart des cas.

  2. Vérifier le seuil : Comparez le solde à votre limite prédéfinie. Si en dessous, déclenchez une alerte.

  3. Déclencher une notification : Cela pourrait être aussi simple que d'imprimer un avertissement dans la console, mais pour de vraies alertes, vous pourriez envoyer un e-mail ou une notification push. Vous pouvez vous intégrer à l'e-mail (via smtplib) ou à un service comme IFTTT ou l'API webhook de Slack pour pousser l'alerte. Par exemple :

    if balance < 1000:
    send_email("Alerte de solde faible", f"Le solde du compte XYZ est de {balance}")

    (Implémentez send_email avec les détails de votre serveur de messagerie.)

En exécutant ce script quotidiennement (via un cron job ou le Planificateur de tâches Windows), vous obtiendrez des avertissements proactifs. Parce qu'il utilise le ledger, il peut considérer toutes les transactions, y compris celles que vous venez d'ajouter.

Prochaines Dates Limites de Paiement

Si vous utilisez Beancount pour suivre les factures ou les dates limites, vous pouvez marquer les paiements futurs et faire en sorte que des scripts vous le rappellent. Deux façons de représenter les obligations à venir dans Beancount :

  • Événements : Beancount prend en charge une directive event pour les notes datées arbitraires. Par exemple :

    2025-05-10 event "BillDue" "Paiement hypothécaire dû"

    Cela n'affecte pas les soldes, mais enregistre une date avec une étiquette. Un script peut scanner les entries pour les entrées EventEvent.type == "BillDue" (ou tout type personnalisé que vous choisissez) et vérifier si la date est dans, disons, les 7 prochains jours à partir d'aujourd'hui. Si oui, déclenchez une alerte (e-mail, notification ou même une popup).

  • Transactions Futures : Certaines personnes saisissent des transactions datées dans le futur (post-datées) pour des choses comme les paiements planifiés. Celles-ci n'apparaîtront pas dans les soldes tant que la date ne sera pas passée (à moins que vous n'exécutiez des rapports à partir de dates futures). Un script peut rechercher les transactions datées dans un avenir proche et les lister.

En utilisant ceux-ci, vous pourriez créer un script "tickler" qui, lorsqu'il est exécuté, sort une liste de tâches ou de factures dues bientôt. Intégrez-vous à une API comme Google Calendar ou à un gestionnaire de tâches si vous voulez créer automatiquement des rappels là-bas.

Détection d'Anomalies

Au-delà des seuils ou des dates connus, vous pouvez scripter des alertes personnalisées pour les schémas inhabituels. Par exemple, si une dépense normalement mensuelle ne s'est pas produite (peut-être avez-vous oublié de payer une facture), ou si les dépenses d'une catégorie sont anormalement élevées ce mois-ci, votre script pourrait le signaler. Cela implique généralement d'interroger les données récentes et de les comparer à l'historique (ce qui pourrait être un sujet avancé - employant éventuellement des statistiques ou de l'IA).

En pratique, de nombreux utilisateurs comptent sur le rapprochement pour détecter les anomalies (transactions inattendues). Si vous recevez des notifications bancaires (comme des e-mails pour chaque transaction), vous pourriez les analyser avec un script et les ajouter automatiquement à Beancount, ou au moins vérifier qu'elles sont enregistrées. Un passionné a même configuré sa banque pour envoyer des e-mails d'alerte de transaction, avec le plan de les analyser et de les ajouter automatiquement au ledger. Ce type d'alerte axée sur les événements peut garantir qu'aucune transaction ne reste non enregistrée.

Extension de Fava avec des Plugins et des Vues Personnalisés

Fava est déjà scriptable grâce à son système d'extension. Si vous voulez que votre automatisation ou vos rapports s'intègrent directement dans l'interface web, vous pouvez écrire une extension Fava (également appelée plugin) en Python.

Comment les Extensions Fava Fonctionnent : Une extension est un module Python qui définit une classe héritant de fava.ext.FavaExtensionBase. Vous l'enregistrez dans votre fichier Beancount via une option personnalisée. Par exemple, si vous avez un fichier myextension.py avec une classe MyAlerts(FavaExtensionBase), vous pouvez l'activer en ajoutant à votre ledger :

1970-01-01 custom "fava-extension" "myextension"

Lorsque Fava se charge, il importera ce module et initialisera votre classe MyAlerts.

Les extensions peuvent faire plusieurs choses :

  • Hooks : Elles peuvent s'accrocher à des événements dans le cycle de vie de Fava. Par exemple, after_load_file() est appelée après le chargement du ledger. Vous pourriez l'utiliser pour exécuter des vérifications ou précalculer des données. Si vous vouliez implémenter la vérification du solde faible à l'intérieur de Fava, after_load_file pourrait itérer sur les soldes des comptes et peut-être stocker des avertissements (bien que les faire apparaître dans l'interface utilisateur pourrait nécessiter un peu plus de travail, comme soulever une FavaAPIError ou utiliser Javascript pour afficher une notification).
  • Rapports/Pages Personnalisés : Si votre classe d'extension définit un attribut report_title, Fava ajoutera une nouvelle page dans la barre latérale pour celui-ci. Vous fournissez ensuite un modèle (HTML/Jinja2) pour le contenu de cette page. C'est ainsi que vous créez des vues entièrement nouvelles, comme un tableau de bord ou un résumé que Fava n'a pas par défaut. L'extension peut collecter toutes les données dont elle a besoin (vous pouvez accéder à self.ledger qui a toutes les entrées, les soldes, etc.) et ensuite rendre le modèle.

Par exemple, l'extension intégrée portfolio_list dans Fava ajoute une page listant vos positions de portefeuille. Les extensions communautaires vont plus loin :

  • Tableaux de Bord : Le plugin fava-dashboards permet de définir des graphiques et des panneaux personnalisés (en utilisant des bibliothèques comme Apache ECharts). Il lit une configuration YAML des requêtes à exécuter, les exécute via Beancount et génère une page de tableau de bord dynamique dans Fava. Essentiellement, il relie les données de Beancount et une bibliothèque de graphiques JavaScript pour produire des visualisations interactives.
  • Analyse de Portefeuille : L'extension PortfolioSummary (contribuée par les utilisateurs) calcule des résumés d'investissement (regroupement des comptes, calcul du TRI, etc.) et les affiche dans l'interface utilisateur de Fava.
  • Revue des Transactions : Une autre extension, fava-review, aide à revoir les transactions au fil du temps (par exemple, pour s'assurer que vous n'avez manqué aucun reçu).

Pour créer une extension simple vous-même, commencez par sous-classer FavaExtensionBase. Par exemple, une extension minimale qui ajoute une page pourrait ressembler à ceci :

from fava.ext import FavaExtensionBase

class HelloReport(FavaExtensionBase):
report_title = "Bonjour le Monde"

def __init__(self, ledger, config):
super().__init__(ledger, config)
# toute initialisation, peut-être analyser la config si elle est fournie

def after_load_file(self):
# (optionnel) exécuter après le chargement du ledger
print("Ledger chargé avec", len(self.ledger.entries), "entrées")

Si vous placiez ceci dans hello.py et ajoutiez custom "fava-extension" "hello" à votre ledger, Fava afficherait une nouvelle page "Bonjour le Monde" (vous auriez également besoin d'un fichier de modèle HelloReport.html dans un sous-dossier templates pour définir le contenu de la page, à moins que l'extension n'utilise que des hooks). Le modèle peut utiliser les données que vous attachez à la classe d'extension. Fava utilise des modèles Jinja2, vous pourriez donc rendre vos données dans un tableau HTML ou un graphique dans ce modèle.

Remarque : Le système d'extension de Fava est puissant mais considéré comme "instable" (sujet à changement). Il nécessite une certaine familiarité avec le développement web (HTML/JS) si vous créez des pages personnalisées. Si votre objectif est simplement d'exécuter des scripts ou des analyses, il pourrait être plus facile de les garder comme des scripts externes. Utilisez les extensions Fava lorsque vous voulez une expérience intégrée à l'application sur mesure pour votre workflow.

Intégration d'APIs et de Données Tierces

L'un des avantages des workflows scriptables est la capacité d'intégrer des données externes. Voici des intégrations courantes :

  • Taux de Change et Commodities : Beancount ne récupère pas automatiquement les prix par conception (pour garder les rapports déterministes), mais il fournit une directive Price pour que vous fournissiez les taux. Vous pouvez automatiser la récupération de ces prix. Par exemple, un script peut interroger une API (Yahoo Finance, Alpha Vantage, etc.) pour le dernier taux de change ou le prix d'une action et ajouter une entrée de prix à votre ledger :

    2025-04-30 price BTC 30000 USD
    2025-04-30 price EUR 1.10 USD

    Il existe des outils comme bean-price (maintenant un outil externe sous l'égide de beancount) qui récupèrent les cotations quotidiennes et les sortent au format Beancount. Vous pourriez planifier l'exécution de bean-price chaque nuit pour mettre à jour un fichier d'inclusion prices.beancount. Ou utilisez Python : par exemple, avec la bibliothèque requests pour appeler une API. La documentation de Beancount suggère que pour les actifs négociés publiquement, vous pouvez "invoquer du code qui téléchargera les prix et écrira les directives pour vous." En d'autres termes, laissez un script faire la recherche et insérer les lignes price, plutôt que de le faire manuellement.

  • Données du Portefeuille d'Actions : Similaire aux taux de change, vous pouvez vous intégrer à des APIs pour récupérer des données boursières détaillées ou des dividendes. Par exemple, l'API Yahoo Finance (ou les bibliothèques communautaires comme yfinance) peut récupérer des données historiques pour un ticker. Un script pourrait mettre à jour votre ledger avec l'historique des prix mensuels pour chaque action que vous possédez, permettant ainsi des rapports historiques précis de la valeur marchande. Certaines extensions personnalisées (comme fava_investor) tirent même les données de prix à la volée pour l'affichage, mais le plus simple est d'importer régulièrement les prix dans le ledger.

  • APIs Bancaires (Open Banking/Plaid) : Au lieu de télécharger des CSVs, vous pouvez utiliser des APIs pour récupérer automatiquement les transactions. Des services comme Plaid regroupent les comptes bancaires et permettent un accès programmatique aux transactions. Dans une configuration avancée, vous pourriez avoir un script Python qui utilise l'API de Plaid pour tirer les nouvelles transactions quotidiennement et les enregistrer dans un fichier (ou les importer directement dans le ledger). Un utilisateur avancé a construit un système où Plaid alimente son pipeline d'importation, rendant ses livres presque automatiques. Il note que "rien ne vous empêche de vous inscrire à l'API Plaid et de faire de même localement" - c'est-à-dire que vous pouvez écrire un script local pour obtenir les données bancaires, puis utiliser votre logique d'importateur Beancount pour les analyser en entrées de ledger. Certaines régions ont des APIs d'open banking fournies par les banques ; celles-ci pourraient être utilisées de manière similaire.

  • Autres APIs : Vous pourriez intégrer des outils de budgétisation (exporter les budgets planifiés pour les comparer aux réalisations dans Beancount), ou utiliser une API OCR pour lire les reçus et les faire correspondre automatiquement aux transactions. Parce que vos scripts ont un accès complet à l'écosystème de Python, vous pouvez intégrer tout, des services de messagerie (pour envoyer des alertes) à Google Sheets (par exemple, mettre à jour une feuille avec des métriques financières mensuelles) aux applications de messagerie (vous envoyer un rapport récapitulatif via un bot Telegram).

Lorsque vous utilisez des APIs tierces, n'oubliez pas de sécuriser vos identifiants (utilisez des variables d'environnement ou des fichiers de configuration pour les clés d'API), et de gérer les erreurs (problèmes de réseau, temps d'arrêt de l'API) avec élégance dans vos scripts. Il est souvent sage de mettre les données en cache (par exemple, stocker les taux de change récupérés afin de ne pas demander le même taux historique à plusieurs reprises).

Meilleures Pratiques pour des Scripts Modulaires et Maintenables

Au fur et à mesure que vous construisez des workflows scriptables, gardez votre code organisé et robuste :

  • Modularité : Séparez les différentes préoccupations dans différents scripts ou modules. Par exemple, ayez des scripts séparés pour "l'importation/le rapprochement des données" vs. la "génération de rapports" vs. les "alertes". Vous pouvez même créer un petit package Python pour votre ledger avec des modules comme ledger_import.py, ledger_reports.py, etc. Cela rend chaque partie plus facile à comprendre et à tester.

  • Configuration : Évitez de coder en dur les valeurs. Utilisez un fichier de configuration ou des variables en haut du script pour des choses comme les noms de compte, les seuils, les clés d'API, les plages de dates, etc. Cela facilite l'ajustement sans modifier le code en profondeur. Par exemple, définissez LOW_BALANCE_THRESHOLDS = {"Assets:Bank:Checking": 500, "Assets:Savings": 1000} en haut, et votre script d'alerte peut boucler à travers ce dict.

  • Tests : Traitez votre automatisation financière comme un code essentiel - parce que c'est le cas ! Écrivez des tests pour la logique complexe. Beancount fournit des helpers de test (utilisés en interne pour le test des importers) que vous pouvez utiliser pour simuler les entrées du ledger. Même sans frameworks sophistiqués, vous pouvez avoir un CSV factice et les transactions de sortie attendues, et affirmer que votre script d'importation produit les entrées correctes. Si vous utilisez pytest, vous pouvez intégrer ces tests facilement (comme Alex Watt l'a fait via une commande just test enveloppant pytest).

  • Contrôle de Version : Gardez votre ledger et vos scripts sous contrôle de version (git). Cela vous donne non seulement des sauvegardes et un historique, mais vous encourage également à apporter des modifications de manière contrôlée. Vous pouvez étiqueter les versions de vos "scripts financiers" ou examiner les différences lors du débogage d'un problème. Certains utilisateurs suivent même leurs enregistrements financiers dans Git pour voir les changements au fil du temps. Faites juste attention à ignorer les données sensibles (comme les fichiers de relevé bruts ou les clés d'API) dans votre dépôt.

  • Documentation : Documentez vos workflows personnalisés pour votre futur vous. Un README dans votre dépôt expliquant comment configurer l'environnement, comment exécuter chaque script, et ce que chacun fait sera inestimable après des mois. Commentez également votre code, en particulier toute logique comptable non évidente ou interaction API.

  • Maintenance des Plugins Fava : Si vous écrivez une extension Fava, gardez-la simple. Fava pourrait changer, donc les extensions plus petites avec des fonctionnalités ciblées sont plus faciles à mettre à jour. Évitez de dupliquer trop de logique - utilisez le moteur de requête de Beancount ou les fonctions d'assistance existantes chaque fois que possible, plutôt que de coder en dur des calculs qui pourraient être sensibles aux changements du ledger.

  • Sécurité : Puisque vos scripts peuvent gérer des données sensibles et se connecter à des services externes, traitez-les avec soin. N'exposez pas les clés d'API et envisagez d'exécuter votre automatisation sur une machine sécurisée. Si vous utilisez une solution hébergée ou le cloud (comme la planification d'Actions GitHub ou d'un serveur pour exécuter Fava), assurez-vous que vos données de ledger sont chiffrées au repos et que vous êtes à l'aise avec les implications en matière de confidentialité.

En suivant ces pratiques, vous vous assurez que votre workflow reste fiable même si vos finances (et les outils eux-mêmes) évoluent. Vous voulez des scripts que vous pouvez réutiliser année après année, avec un minimum de modifications.

Conclusion

Beancount et Fava fournissent une plateforme puissante et flexible pour que les utilisateurs avertis en technologie personnalisent complètement leur suivi des finances personnelles. En écrivant des scripts Python, vous pouvez automatiser les tâches fastidieuses comme le rapprochement des relevés, produire des rapports riches adaptés à vos besoins et rester au top de vos finances avec des alertes opportunes. Nous avons couvert une gamme d'exemples allant du basique à l'avancé - en commençant par de simples requêtes et importations de CSV, et en passant à des plugins Fava à part entière et des intégrations API externes. Au fur et à mesure que vous les implémentez, commencez simple et construisez progressivement. Même quelques petits scripts d'automatisation peuvent vous faire gagner des heures de travail et améliorer considérablement la précision. Et rappelez-vous, parce que tout est en texte brut et en Python, vous avez le contrôle total - votre système financier grandit avec vous, s'adaptant à vos besoins spécifiques. Bon scripting !

Sources : Les techniques ci-dessus sont tirées de la documentation de Beancount et des expériences de la communauté. Pour en savoir plus, consultez les documents officiels de Beancount, les guides et les blogs de la communauté, et le dépôt Awesome Beancount pour les liens vers des plugins et des outils utiles.