Scriptable Workflows met Beancount en Fava
Beancount (een plain-text double-entry accounting tool) en Fava (de web interface) zijn zeer uitbreidbaar en scriptable. Hun ontwerp stelt je in staat om financiële taken te automatiseren, aangepaste rapporten te genereren en alerts in te stellen door Python scripts te schrijven. In de woorden van een gebruiker: “Ik vind het erg fijn om mijn data in zo'n handig formaat te hebben, en ik vind het fijn dat ik dingen naar hartenlust kan automatiseren. Er is geen API zoals een bestand op je schijf; het is gemakkelijk te integreren.” Deze handleiding zal je door het maken van scriptable workflows leiden—van beginner-vriendelijke automatisering tot geavanceerde Fava plugins.
Aan de slag: Beancount uitvoeren als een Python Script
Voordat je in specifieke taken duikt, zorg ervoor dat je Beancount hebt geïnstalleerd (bijv. via pip install beancount). Aangezien Beancount in Python is geschreven, kun je het als een library gebruiken in je eigen scripts. De algemene aanpak is:
-
Laad je Beancount grootboek: Gebruik Beancount's loader om het
.beancountbestand te parsen naar Python objecten. Bijvoorbeeld:from beancount import loader
entries, errors, options_map = loader.load_file("myledger.beancount")
if errors:
print("Errors:", errors)Dit geeft je een lijst met
entries(transacties, saldi, enz.) en eenoptions_mapmet metadata. Al je accounts, transacties en saldi zijn nu toegankelijk in code. -
Maak gebruik van Beancount Query Language (BQL): In plaats van handmatig te itereren, kun je SQL-achtige queries uitvoeren op de data. Om bijvoorbeeld de totale uitgaven per maand te krijgen, kun je de query API gebruiken:
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)Dit gebruikt Beancount's Query systeem om data te aggregeren. (Onder de motorkap is dit vergelijkbaar met wat het
bean-querycommando doet, maar hier gebruik je het in een script.) De Beancount auteur merkt zelfs op dat je het bestand kunt laden enrun_query()direct via de Python API kunt aanroepen, waardoor je geen externe commando's in een loop hoeft aan te roepen. -
Stel een projectstructuur op: Organiseer je scripts naast je grootboek. Een gebruikelijke indeling is om directories te hebben voor importers (om externe data op te halen/parsen), reports of queries (voor analysescripts) en documents (om gedownloade overzichten op te slaan). Een gebruiker bewaart bijvoorbeeld:
importers/– aangepaste Python import scripts (met tests),queries/– scripts om rapporten te genereren (uitvoerbaar viapython3 queries/...),documents/– gedownloade bank CSV's/PDF's georganiseerd per account.
Met deze setup kun je scripts handmatig uitvoeren (bijv. python3 queries/cash_flow.py) of ze plannen (via cron of een task runner) om je workflow te automatiseren.
Reconciliatie Taken Automatiseren
Reconciliatie betekent ervoor zorgen dat je grootboek overeenkomt met externe records (bankafschriften, creditcard rapporten, enz.). Beancount's plain-text grootboek en Python API maken het mogelijk om een groot deel van dit proces te automatiseren.
Transacties Importeren en Matchen (Beginner)
Voor beginners is de aanbevolen aanpak om Beancount's importer plugins te gebruiken. Je schrijft een kleine Python class die het Beancount importer protocol volgt om een gegeven formaat (CSV, OFX, PDF, enz.) te parsen en transacties te produceren. Gebruik vervolgens het bean-extract commando of een script om deze importers toe te passen:
- Schrijf een importer (een Python class met methoden zoals
identify(),extract()) voor het CSV formaat van je bank. Beancount's documentatie biedt een handleiding en voorbeelden. - Gebruik
bean-extractin een script of Makefile (zoals hetjustfilevoorbeeld) om nieuwe overzichten te parsen. Een workflow voert bijvoorbeeldbean-extractuit op alle bestanden in~/Downloadsen voert transacties uit naar een tijdelijk bestand. - Controleer en kopieer handmatig transacties van het tijdelijke bestand naar je hoofd grootboek, en voer vervolgens
bean-checkuit om ervoor te zorgen dat de saldi reconciliëren.
Hoewel dit proces nog steeds een beoordelingsstap omvat, wordt veel van het zware werk van het parsen en formatteren van entries geautomatiseerd. Importer scripts kunnen ook automatisch categorieën toewijzen en zelfs balans assertions (verklaringen van verwachte saldi) instellen om discrepanties op te vangen. Na het importeren kun je bijvoorbeeld een regel hebben als 2025-04-30 balance Assets:Bank:Checking 1234.56 USD die het eindsaldo bevestigt. Wanneer je bean-check uitvoert, zal Beancount verifiëren dat al deze balans assertions correct zijn, en eventuele fouten signaleren als transacties ontbreken of gedupliceerd zijn. Dit is een best practice: genereer automatisch balans assertions voor elke overzichtsperiode om de computer onverzoende verschillen te laten opsporen.