Salta al contenuto principale
Workflow Scriptabili

Workflow Scriptabili

Impara come automatizzare le attività finanziarie e creare report personalizzati utilizzando Beancount e Fava tramite workflow scriptabili. Questa guida copre tutto, dall'automazione per principianti allo sviluppo avanzato di plugin.

Beancount (uno strumento di contabilità a partita doppia in testo semplice) e Fava (la sua interfaccia web) sono altamente estensibili e scriptabili. Il loro design ti permette di automatizzare attività finanziarie, generare report personalizzati e impostare avvisi scrivendo script Python. Come dice un utente: "Mi piace molto avere i miei dati in un formato così comodo, e mi piace poter automatizzare le cose a mio piacimento. Non c'è API come un file sul tuo disco; è facile da integrare." Questa guida ti guiderà nella creazione di workflow scriptabili, dall'automazione per principianti ai plugin Fava avanzati.

Per Iniziare: Eseguire Beancount come Script Python

Prima di addentrarci in attività specifiche, assicurati di avere Beancount installato (ad esempio tramite pip install beancount). Poiché Beancount è scritto in Python, puoi usarlo come libreria nei tuoi script. L'approccio generale è:

  • Carica il tuo registro Beancount: Usa il loader di Beancount per analizzare il file .beancount in oggetti Python. Ad esempio:

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

    Questo ti fornisce una lista di entries (transazioni, saldi, ecc.) e un options_map con metadati. Tutti i tuoi conti, transazioni e saldi sono ora accessibili nel codice.

  • Sfrutta il Linguaggio di Query Beancount (BQL): Invece di iterare manualmente, puoi eseguire query simili a SQL sui dati. Ad esempio, per ottenere le spese totali per mese, potresti usare l'API delle query:

    from beancount.query import query
    q = query.Query(entries, options_map)
    risultato = q.query("SELECT mese, sum(posizione) WHERE account ~ 'Spese' GROUP BY mese")
    print(risultato)

    Questo utilizza il sistema di Query di Beancount per aggregare i dati. (Sotto il cofano, è simile a ciò che fa il comando bean-query, ma qui lo usi in uno script.) L'autore di Beancount nota che puoi caricare il file e chiamare run_query() direttamente tramite l'API Python, evitando la necessità di chiamare comandi esterni in un ciclo.

  • Imposta una struttura di progetto: Organizza i tuoi script insieme al tuo registro. Una disposizione comune è avere directory per importatori (per recuperare/analizzare dati esterni), report o query (per script di analisi) e documenti (per memorizzare estratti conto scaricati). Ad esempio, un utente tiene:

    • importers/ – script di importazione Python personalizzati (con test),
    • queries/ – script per generare report (eseguibili con python3 queries/...),
    • documents/ – CSV/PDF bancari scaricati organizzati per conto.

Con questa configurazione, puoi eseguire script manualmente (ad esempio python3 queries/flusso_cassa.py) o programmarli (tramite cron o un task runner) per automatizzare il tuo flusso di lavoro.

Automatizzare le Attività di Riconciliazione

Riconciliazione significa assicurarsi che il tuo registro corrisponda ai record esterni (estratti conto bancari, rapporti delle carte di credito, ecc.). Il registro in testo semplice di Beancount e la sua API Python rendono possibile automatizzare gran parte di questo processo.

Importare e Abbinare le Transazioni (Principianti)

Per i principianti, l'approccio consigliato è utilizzare i plugin importatori di Beancount. Scrivi una piccola classe Python seguendo il protocollo dell'importatore di Beancount per analizzare un dato formato (CSV, OFX, PDF, ecc.) e produrre transazioni. Quindi usa il comando bean-extract o uno script per applicare questi importatori:

  • Scrivi un importatore (una classe Python con metodi come identify(), extract()) per il formato CSV della tua banca. La documentazione di Beancount fornisce una guida e degli esempi.
  • Usa bean-extract in uno script o Makefile (come l'esempio justfile) per analizzare nuovi estratti conto. Ad esempio, un flusso di lavoro esegue bean-extract su tutti i file in ~/Downloads e invia l'output a un file temporaneo.
  • Rivedi manualmente e copia le transazioni dal file temporaneo nel tuo registro principale, poi esegui bean-check per assicurarti che i saldi corrispondano.
Niente importer per un caso isolato

Non serve scrivere un importer per convertire un singolo estratto conto. Incolla il file nel Convertitore CSV in Beancount, oppure usa il Convertitore OFX e QIF in Beancount per i download .ofx, .qfx e .qif. Entrambi girano interamente nel browser, quindi l'estratto conto non lascia mai il tuo computer.

Sebbene questo processo includa ancora una fase di revisione, gran parte del lavoro pesante di analisi e formattazione delle voci è automatizzato. Gli script degli importatori possono anche assegnare automaticamente le categorie e persino impostare asserzioni di saldo (dichiarazioni di saldi previsti) per individuare le discrepanze. Ad esempio, dopo l'importazione, potresti avere una riga come 2025-04-30 balance Assets:Banca:ContoCorrente 1234.56 EUR che asserisce il saldo di chiusura. Quando esegui bean-check, Beancount verificherà che tutte queste asserzioni di saldo siano corrette e segnalerà eventuali errori se le transazioni mancano o sono duplicate. Questa è una buona pratica: genera automaticamente asserzioni di saldo per ogni periodo di estratto conto per lasciare che il computer individui per te le differenze non riconciliate.

Script di Riconciliazione Personalizzati (Intermedio)

Per un maggiore controllo, puoi scrivere uno script Python personalizzato per confrontare l'elenco delle transazioni della banca (CSV o tramite API) con le voci del tuo registro:

  1. Leggi i dati esterni: Analizza il file CSV della banca usando il modulo csv di Python (o Pandas). Normalizza i dati in un elenco di transazioni, ad esempio ciascuna con data, importo e descrizione.
  2. Carica le transazioni del registro: Usa loader.load_file come mostrato in precedenza per ottenere tutte le voci del registro. Filtra questo elenco per il conto di interesse (ad esempio il tuo conto corrente) e, eventualmente, l'intervallo di date dell'estratto conto.
  3. Confronta e trova le discrepanze:
  • Per ogni transazione esterna, verifica se esiste una voce identica nel registro (corrispondenza per data e importo, eventualmente descrizione). Se non trovata, contrassegnala come "nuova" ed eventualmente produzila come transazione formattata Beancount per la tua revisione.
  • Al contrario, identifica eventuali voci del registro in quel conto che non appaiono nella fonte esterna – potrebbero essere errori di immissione dati o transazioni non ancora liquidate dalla banca.
  1. Output dei risultati: Stampa un report o crea un nuovo snippet .beancount con le transazioni mancanti.

Ad esempio, uno script della community chiamato reconcile.py fa esattamente questo: dato un file Beancount e un CSV di input, stampa un elenco di nuove transazioni da importare, così come eventuali registrazioni del registro esistenti che non sono nell'input (potenzialmente un segno di errata classificazione). Con un tale script, la riconciliazione mensile può essere semplice come eseguirlo e poi aggiungere le transazioni suggerite al tuo registro. Un utente di Beancount nota che "fa un processo di riconciliazione su tutti i conti ogni mese" e usa una raccolta crescente di codice Python per eliminare gran parte del lavoro manuale nell'importazione e riconciliazione dei dati.

Suggerimento: Durante la riconciliazione, sfrutta gli strumenti di Beancount per la precisione:

  • Usa le asserzioni di saldo come menzionato, per avere controlli automatici sui saldi dei conti.
  • Usa la direttiva pad se lo desideri, che può inserire automaticamente voci di bilanciamento per piccole differenze di arrotondamento (usa con cautela).
  • Scrivi test unitari per la logica del tuo importatore o di riconciliazione (Beancount fornisce helper per i test). Ad esempio, un flusso di lavoro prevedeva la presa di un CSV di esempio, la scrittura di test fallimentari con transazioni previste, quindi l'implementazione dell'importatore fino al superamento di tutti i test. Questo garantisce che il tuo script di importazione funzioni correttamente per vari casi.

Generare Report e Riepiloghi Personalizzati

Sebbene Fava fornisca molti report standard (Conto Economico, Stato Patrimoniale, ecc.), puoi creare report personalizzati usando script. Questi possono variare da semplici output sulla console a file formattati ricchi o grafici.

Interrogare i Dati per i Report (Principianti)

A livello base, puoi usare il Linguaggio di Query Beancount (BQL) per ottenere dati di riepilogo e stamparli o salvarli. Ad esempio:

  • Riepilogo Flusso di Cassa: Usa una query per calcolare il flusso di cassa netto. Il "flusso di cassa" potrebbe essere definito come la variazione del saldo di determinati conti in un periodo. Usando BQL, potresti fare:

    SELECT anno, mese, sum(importo)
    WHERE account LIKE 'Reddito:%' OR account LIKE 'Spese:%'
    GROUP BY anno, mese

    Questo sommerebbe tutte le registrazioni di reddito e spesa per mese. Potresti eseguirlo tramite il CLI bean-query o tramite l'API Python (query.Query come mostrato in precedenza) e poi formattare il risultato.

  • Report Spese per Categoria: Interroga le spese totali per categoria:

    SELECT account, round(sum(posizione), 2)
    WHERE account ~ 'Spese'
    GROUP BY account
    ORDER BY sum(posizione) ASC

    Questo produce una tabella delle spese per categoria. Puoi eseguire più query in uno script e produrre i risultati come testo, CSV o persino JSON per un'ulteriore elaborazione.

Un utente ha trovato "banale" analizzare i dati finanziari con Fava o con script, citando che usa uno script Python per estrarre i dati da Beancount tramite il Linguaggio di Query e poi inserirli in un DataFrame Pandas per preparare un report personalizzato. Ad esempio, potresti recuperare i totali mensili con una query e poi usare Pandas/Matplotlib per tracciare un grafico del flusso di cassa nel tempo. La combinazione di BQL e librerie di scienza dei dati ti permette di creare report oltre a quelli offerti da Fava per impostazione predefinita.

Reportistica Avanzata (Grafici, Performance, ecc.)

Per esigenze più avanzate, i tuoi script possono calcolare metriche come la performance degli investimenti o creare output visivi:

  • Performance degli Investimenti (IRR/XIRR): Poiché il tuo registro contiene tutti i flussi di cassa (acquisti, vendite, dividendi), puoi calcolare i tassi di rendimento del portafoglio. Ad esempio, potresti scrivere uno script che filtra le transazioni dei tuoi conti di investimento e poi calcola il Tasso Interno di Rendimento. Esistono librerie (o formule) per calcolare l'IRR a partire dai dati del flusso di cassa. Alcune estensioni Fava sviluppate dalla community (come PortfolioSummary o fava_investor) fanno esattamente questo, calcolando l'IRR e altre metriche per i portafogli di investimento. Come script, potresti usare una funzione IRR (da NumPy o tua) sulla serie di contributi/prelievi più il valore finale.

  • Metriche Personalizzate o Multi-periodo: Vuoi un report del tuo tasso di risparmio (rapporto tra risparmi e reddito) ogni mese? Uno script Python può caricare il registro, sommare tutti i conti di Reddito e tutti i conti di Spesa, quindi calcolare risparmio = reddito - spese e la percentuale. Questo potrebbe produrre una bella tabella o persino generare un report HTML/Markdown per i tuoi archivi.

  • Visualizzazione: Puoi generare grafici al di fuori di Fava. Ad esempio, usa matplotlib o altair in uno script per creare un grafico del patrimonio netto nel tempo, usando i dati del registro. Poiché il registro ha tutti i saldi storici (o puoi accumularli iterando le voci), puoi produrre grafici di serie temporali. Salva questi grafici come immagini o HTML interattivo. (Se preferisci le visualizzazioni in-app, consulta la sezione sulle estensioni Fava di seguito per aggiungere grafici all'interno di Fava.)

Opzioni di Output: Decidi come consegnare il report:

  • Per un'analisi una tantum, stampare a schermo o salvare in un file CSV/Excel potrebbe essere sufficiente.
  • Per dashboard, considera la generazione di un file HTML con i dati (possibilmente usando una libreria di templating come Jinja2 o anche solo scrivendo Markdown) che puoi aprire in un browser.
  • Puoi anche integrare con Jupyter Notebook per un ambiente di reportistica interattivo, anche se questo è più per l'esplorazione che per l'automazione.

Attivare Avvisi dal Tuo Registro

Un altro uso potente dei workflow scriptabili è l'impostazione di avvisi basati su condizioni nei tuoi dati finanziari. Poiché il tuo registro viene aggiornato regolarmente (e può includere voci future come bollette imminenti o budget), puoi esaminarlo con uno script e ricevere notifiche per eventi importanti.

Avvisi di Saldo Basso

Per evitare scoperti o per mantenere un saldo minimo, potresti volere un avviso se un conto (ad esempio il conto corrente o i risparmi) scende al di sotto di una soglia. Ecco come puoi implementarlo:

  1. Determina i saldi correnti: Dopo aver caricato entries tramite il loader, calcola il saldo più recente dei conti di interesse. Puoi farlo aggregando le registrazioni o usando una query. Ad esempio, usa una query BQL per il saldo di un conto specifico:

    SELECT sum(posizione) WHERE account = 'Attività:Banca:ContoCorrente'

    Questo restituisce il saldo corrente di quel conto (somma di tutte le sue registrazioni). In alternativa, usa le funzioni interne di Beancount per costruire uno stato patrimoniale. Ad esempio:

    from beancount.core import realization
    albero = realization.realize(entries, options_map)
    acct = realization.get_or_create(albero, "Attività:Banca:ContoCorrente")
    saldo = acct.balance  # un Inventory di valute

    Quindi estrai il valore numerico (ad esempio saldo.get_currency_units('EUR') potrebbe darti il Decimale). Tuttavia, per la maggior parte dei casi, usare la query è più semplice.

  2. Controlla la soglia: Confronta il saldo con il tuo limite predefinito. Se inferiore, attiva un avviso.

  3. Attiva la notifica: Questo potrebbe essere semplice come stampare un avviso sulla console, ma per avvisi reali potresti inviare un'email o una notifica push. Puoi integrare con l'email (tramite smtplib) o un servizio come IFTTT o l'API webhook di Slack per inviare l'avviso. Ad esempio:

    if saldo < 1000:
        invia_email("Avviso saldo basso", f"Il saldo del conto XYZ è {saldo}")

    (Implementa invia_email con i dettagli del tuo server email.)

Eseguendo questo script quotidianamente (tramite cron o Utilità di pianificazione di Windows), riceverai avvisi proattivi. Poiché usa il registro, può considerare tutte le transazioni, incluse quelle appena aggiunte.

Scadenze di Pagamento Imminenti

Se usi Beancount per tenere traccia di bollette o scadenze, puoi contrassegnare i pagamenti futuri e far sì che gli script te li ricordino. Due modi per rappresentare gli obblighi imminenti in Beancount:

  • Eventi: Beancount supporta una direttiva event per note datate arbitrarie. Ad esempio:

    2025-05-10 event "ScadenzaBolletta" "Scadenza mutuo"

    Questo non influisce sui saldi ma registra una data con un'etichetta. Uno script può scansionare entries per voci Event dove Event.type == "ScadenzaBolletta" (o qualsiasi tipo personalizzato tu scelga) e verificare se la data è entro, ad esempio, i prossimi 7 giorni da oggi. Se sì, attiva un avviso (email, notifica o persino un popup).

  • Transazioni Future: Alcune persone inseriscono transazioni future (post-datate) per cose come pagamenti programmati. Queste non appariranno nei saldi fino al passaggio della data (a meno che non esegui report a date future). Uno script può cercare transazioni datate nel prossimo futuro e elencarle.

Usando questi, potresti creare uno script "promemoria" che, quando eseguito, produce un elenco di attività o bollette in scadenza. Integra con un'API come Google Calendar o un task manager se desideri creare automaticamente promemoria lì.

Rilevamento Anomalie

Oltre a soglie o date note, puoi scrivere avvisi personalizzati per modelli insoliti. Ad esempio, se una spesa normalmente mensile non si è verificata (forse hai dimenticato di pagare una bolletta), o se la spesa di una categoria è insolitamente alta questo mese, il tuo script potrebbe segnalarlo. Questo tipicamente comporta l'interrogazione di dati recenti e il confronto con la cronologia (che potrebbe essere un argomento avanzato – possibilmente impiegando statistiche o ML).

In pratica, molti utenti si affidano alla riconciliazione per individuare anomalie (transazioni impreviste). Se ricevi notifiche bancarie (come email per ogni transazione), potresti analizzarle con uno script e aggiungerle automaticamente a Beancount, o almeno verificare che siano registrate. Un appassionato ha persino configurato la sua banca per inviare email di avviso transazione, con l'intenzione di analizzarle e aggiungerle al registro automaticamente. Questo tipo di avviso basato su eventi può garantire che nessuna transazione rimanga non registrata.

Estendere Fava con Plugin e Viste Personalizzate

Fava è già scriptabile attraverso il suo sistema di estensioni. Se desideri che la tua automazione o i tuoi report si integrino direttamente nell'interfaccia web, puoi scrivere un'estensione Fava (chiamata anche plugin) in Python.

Come Funzionano le Estensioni Fava: Un'estensione è un modulo Python che definisce una classe che eredita da fava.ext.FavaExtensionBase. La registri nel tuo file Beancount tramite un'opzione personalizzata. Ad esempio, se hai un file miaestensione.py con una classe MieiAvvisi(FavaExtensionBase), puoi abilitarla aggiungendo al tuo registro:

1970-01-01 custom "fava-extension" "miaestensione"

Quando Fava si carica, importa quel modulo e inizializza la tua classe MieiAvvisi.

Le estensioni possono fare diverse cose:

  • Hook: Possono agganciarsi agli eventi del ciclo di vita di Fava. Ad esempio, after_load_file() viene chiamato dopo il caricamento del registro. Potresti usarlo per eseguire controlli o precalcolare i dati. Se volessi implementare il controllo del saldo basso all'interno di Fava, after_load_file potrebbe iterare sui saldi dei conti e, eventualmente, memorizzare avvisi (sebbene renderli visibili nell'interfaccia utente possa richiedere un po' più di lavoro, come sollevare un FavaAPIError o usare Javascript per mostrare una notifica).
  • Report/ Pagine Personalizzate: Se la tua classe di estensione imposta un attributo report_title, Fava aggiungerà una nuova pagina nella barra laterale per essa. Fornisci quindi un template (HTML/Jinja2) per il contenuto di quella pagina. Questo è il modo in cui crei viste completamente nuove, come una dashboard o un riepilogo che Fava non ha per impostazione predefinita. L'estensione può raccogliere tutti i dati di cui ha bisogno (puoi accedere a self.ledger che ha tutte le voci, i saldi, ecc.) e poi renderizzare il template.

Ad esempio, l'estensione integrata portfolio_list in Fava aggiunge una pagina che elenca le posizioni del tuo portafoglio. Le estensioni della community vanno oltre:

  • Dashboard: Il plugin fava-dashboards consente di definire grafici e pannelli personalizzati (usando librerie come Apache ECharts). Legge una configurazione YAML di query da eseguire, le esegue tramite Beancount e genera una pagina dashboard dinamica in Fava. In sostanza, collega i dati di Beancount e una libreria di grafici JavaScript per produrre visualizzazioni interattive.
  • Analisi di portafoglio: L'estensione PortfolioSummary (contribuita dagli utenti) calcola riepiloghi degli investimenti (raggruppando conti, calcolando l'IRR, ecc.) e li visualizza nell'interfaccia utente di Fava.
  • Revisione transazioni: Un'altra estensione, fava-review, aiuta a rivedere le transazioni nel tempo (ad esempio per assicurarti di non aver perso ricevute).

Per creare una semplice estensione da solo, inizia creando una sottoclasse di FavaExtensionBase. Ad esempio, un'estensione minima che aggiunge una pagina potrebbe assomigliare a:

from fava.ext import FavaExtensionBase
 
class ReportCiao(FavaExtensionBase):
    report_title = "Hello World"
 
    def __init__(self, ledger, config):
        super().__init__(ledger, config)
        # eventuale inizializzazione, forse analizza config se fornito
 
    def after_load_file(self):
        # (opzionale) eseguito dopo il caricamento del registro
        print("Registro caricato con", len(self.ledger.entries), "voci")

Se lo inserisci in ciao.py e aggiungi custom "fava-extension" "ciao" al tuo registro, Fava mostrerà una nuova pagina "Hello World" (avresti anche bisogno di un file template ReportCiao.html in una sottodirectory templates per definire il contenuto della pagina, a meno che l'estensione non usi solo hook). Il template può utilizzare i dati che alleghi alla classe di estensione. Fava usa template Jinja2, quindi potresti renderizzare i tuoi dati in una tabella HTML o un grafico in quel template.

Nota: Il sistema di estensione di Fava è potente ma considerato "instabile" (soggetto a modifiche). Richiede una certa familiarità con lo sviluppo web (HTML/JS) se stai creando pagine personalizzate. Se il tuo obiettivo è semplicemente eseguire script o analisi, potrebbe essere più facile mantenerli come script esterni. Usa le estensioni Fava quando desideri un'esperienza in-app su misura per il tuo flusso di lavoro.

Integrare API e Dati di Terze Parti

Uno dei vantaggi dei workflow scriptabili è la possibilità di integrare dati esterni. Ecco le integrazioni comuni:

  • Tassi di Cambio e Merci: Beancount non recupera automaticamente i prezzi per design (per mantenere i report deterministici), ma fornisce una direttiva Price per fornire i tassi. Puoi automatizzare il recupero di questi prezzi. Ad esempio, uno script può interrogare un'API (Yahoo Finance, Alpha Vantage, ecc.) per l'ultimo tasso di cambio o prezzo azionario e aggiungere una voce di prezzo al tuo registro:

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

    Ci sono strumenti come bean-price (ora uno strumento esterno sotto l'egida di Beancount) che recuperano quotazioni giornaliere e le producono in formato Beancount. Potresti programmare bean-price per l'esecuzione ogni notte per aggiornare un file include prezzi.beancount. O usa Python: ad esempio, con la libreria requests per chiamare un'API. La documentazione di Beancount suggerisce che per gli asset quotati in borsa, puoi "invocare del codice che scaricherà i prezzi e scriverà le direttive per te." In altre parole, lascia che uno script faccia la ricerca e inserisca le righe price, invece di farlo manualmente.

  • Dati del Portafoglio Azionario: Similmente ai tassi di cambio, puoi integrare con API per recuperare dati azionari dettagliati o dividendi. Ad esempio, l'API Yahoo Finance (o librerie della community come yfinance) può recuperare dati storici per un ticker. Uno script potrebbe aggiornare il tuo registro con la cronologia dei prezzi mensili per ogni azione che possiedi, consentendo report storici accurati del valore di mercato. Alcune estensioni personalizzate (come fava_investor) recuperano persino i dati dei prezzi al volo per la visualizzazione, ma la cosa più semplice è importare regolarmente i prezzi nel registro.

  • API Bancarie (Open Banking/Plaid): Invece di scaricare CSV, puoi usare API per recuperare le transazioni automaticamente. Servizi come Plaid aggregano conti bancari e consentono l'accesso programmatico alle transazioni. In una configurazione avanzata, potresti avere uno script Python che utilizza l'API di Plaid per recuperare nuove transazioni quotidianamente e salvarle in un file (o importarle direttamente nel registro). Un utente esperto ha costruito un sistema in cui Plaid alimenta la sua pipeline di importazione, rendendo la sua contabilità quasi automatica. Notano che "niente ti impedisce di iscriverti all'API Plaid e fare lo stesso localmente" – cioè, puoi scrivere uno script locale per ottenere i dati bancari, quindi usare la logica del tuo importatore Beancount per analizzarli in voci del registro. Alcune regioni hanno API di open banking fornite dalle banche; quelle potrebbero essere usate in modo simile.

  • Altre API: Potresti integrare strumenti di budget (esportare budget pianificati per confrontarli con i dati reali in Beancount), o usare un'API OCR per leggere ricevute e abbinate automaticamente alle transazioni. Poiché i tuoi script hanno pieno accesso all'ecosistema Python, puoi integrare di tutto, dai servizi email (per l'invio di avvisi) a Google Sheets (ad esempio, aggiornare un foglio con metriche finanziarie mensili) alle app di messaggistica (inviarti un report di riepilogo tramite bot Telegram).

Quando usi API di terze parti, ricordati di proteggere le tue credenziali (usa variabili d'ambiente o file di configurazione per le chiavi API) e gestire elegantemente gli errori (problemi di rete, downtime dell'API) nei tuoi script. È spesso saggio memorizzare nella cache i dati (ad esempio, salvare i tassi di cambio recuperati per non richiedere lo stesso tasso storico ripetutamente).

Buone Pratiche per Script Modulari e Manutenibili

Man mano che costruisci workflow scriptabili, mantieni il tuo codice organizzato e robusto:

  • Modularità: Separa le diverse preoccupazioni in script o moduli diversi. Ad esempio, crea script separati per "importazione dati/riconciliazione" rispetto a "generazione report" rispetto a "avvisi". Puoi persino creare un piccolo pacchetto Python per il tuo registro con moduli come registro_import.py, registro_report.py, ecc. Questo rende ogni parte più facile da capire e testare.

  • Configurazione: Evita di codificare i valori. Usa un file di configurazione o variabili all'inizio dello script per cose come nomi di conti, soglie, chiavi API, intervalli di date, ecc. Questo rende facile regolare senza modificare profondamente il codice. Ad esempio, definisci SOGLIE_SALDO_BASSO = {"Attività:Banca:ContoCorrente": 500, "Attività:Risparmi": 1000} all'inizio, e il tuo script di avviso può iterare su questo dizionario.

  • Test: Tratta la tua automazione finanziaria come codice critico – perché lo è! Scrivi test per la logica complessa. Beancount fornisce alcuni helper per i test (usati internamente per i test degli importatori) che puoi sfruttare per simulare gli input del registro. Anche senza framework sofisticati, puoi avere un CSV fittizio e transazioni di output previste, e asserire che il tuo script di importazione produca le voci corrette. Se usi pytest, puoi integrare facilmente questi test (come ha fatto Alex Watt tramite un comando just test che avvolge pytest).

  • Controllo Versione: Tieni il tuo registro e i tuoi script sotto controllo versione (git). Questo non solo ti fornisce backup e cronologia, ma ti incoraggia ad apportare modifiche in modo controllato. Puoi taggare le versioni dei tuoi "script finanziari" o rivedere le differenze durante il debug di un problema. Alcuni utenti tracciano persino i loro record finanziari in Git per vedere i cambiamenti nel tempo. Fai solo attenzione a ignorare i dati sensibili (come file di estratto conto grezzi o chiavi API) nel tuo repository.

  • Documentazione: Documenta i tuoi workflow personalizzati per il te stesso futuro. Un README nel tuo repository che spiega come impostare l'ambiente, come eseguire ogni script e cosa fa ciascuno sarà inestimabile dopo mesi. Commenta anche il tuo codice, specialmente qualsiasi logica contabile non ovvia o interazione API.

  • Manutenzione dei Plugin Fava: Se scrivi un'estensione Fava, mantienila semplice. Fava potrebbe cambiare, quindi le estensioni più piccole con funzionalità mirate sono più facili da aggiornare. Evita di duplicare troppa logica – usa il motore di query di Beancount o le funzioni helper esistenti quando possibile, piuttosto che codificare calcoli che potrebbero essere sensibili alle modifiche del registro.

  • Sicurezza: Poiché i tuoi script possono gestire dati sensibili e connettersi a servizi esterni, trattali con cura. Non esporre le chiavi API e considera di eseguire la tua automazione su una macchina sicura. Se usi una soluzione ospitata o cloud (come la pianificazione di GitHub Actions o un server per eseguire Fava), assicurati che i dati del tuo registro siano crittografati a riposo e che tu sia a tuo agio con le implicazioni sulla privacy.

Seguendo queste pratiche, garantisci che il tuo flusso di lavoro rimanga affidabile anche quando le tue finanze (e gli stessi strumenti) si evolvono. Vuoi script che puoi riutilizzare anno dopo anno, con minimi ritocchi.

Conclusione

Beancount e Fava forniscono una piattaforma potente e flessibile per gli utenti esperti di tecnologia per personalizzare completamente il monitoraggio delle proprie finanze personali. Scrivendo script Python, puoi automatizzare attività noiose come la riconciliazione degli estratti conto, produrre report ricchi su misura per le tue esigenze e tenerti al passo con le tue finanze con avvisi tempestivi. Abbiamo coperto una gamma di esempi dal basico all'avanzato – iniziando con semplici query e importazioni CSV, e passando a plugin Fava veri e propri e integrazioni API esterne. Mentre implementi questi, inizia in modo semplice e costruisci gradualmente. Anche pochi piccoli script di automazione possono far risparmiare ore di lavoro e migliorare notevolmente la precisione. E ricorda, poiché tutto è testo semplice e Python, hai il pieno controllo – il tuo sistema finanziario cresce con te, piegandosi alle tue esigenze specifiche. Buona programmazione!

Fonti: Le tecniche sopra sono tratte dalla documentazione di Beancount e dalle esperienze della community. Per ulteriori letture, consulta i documenti ufficiali di Beancount, le guide e i blog della community, e il repository Awesome Beancount per collegamenti a plugin e strumenti utili.