Ledger is een open source applicatie voor je persoonlijke financiële administratie en voor de boekhouding van kleine organisaties. Ledger gebruikt platte tekstbestanden in plaats van een database.

Door: Matto Fransen

Het bijhouden van je financiën biedt veel voordelen. Je krijgt overzicht en inzicht, het geeft je grip op je uitgaven, het helpt bij je financiële planning en budgettering. Er bestaan verschillende open source boekhoudprogramma’s. Platte tekst boekhoudprogramma’s vormen een vreemde eend in de bijt. De administratie doe je in een of meer platte tekstbestanden. Het programma leest de bestanden in en zet dit om in zinvolle informatie.

Rondom de platte tekst boekhouding is een heel ecosysteem ontstaan. Het begon met het open source programma Ledger, dat in 2003 is ontstaan en nog steeds actief ontwikkeld wordt. Ledger is geschreven in C++. Later volgden meer vergelijkbare programma’s in andere programmeertalen, die een vergelijkbaar bestandsformaat gebruiken.

Naast dat deze alternatieven in een andere programmeertaal geschreven zijn, bieden ze soms afwijkende features. Enkele voorbeelden zijn hledger, dat stamt uit 2007 en geschreven is in Haskell, Beancount uit 2008 geschreven in Python en Goledger uit 2019 geschreven in Go.

Platte tekst

Het werken in platte tekst past goed in de traditie van Linux- en BSD-systemen. Platte tekst is een duurzaam formaat, over 20 jaar is het nog steeds te lezen en te verwerken. De platte tekst bestanden in het Ledger-formaat zijn goed door mensen te lezen en te schrijven.

Je kunt platte tekst met een versiebeheersysteem beheren en met diff krijg je snel en efficiënt inzicht in de verschillen tussen bestanden. Dit levert je een gedetailleerde audittrail en een super-undo functie.

Platte tekstbestanden integreren goed in een geautomatiseerde omgeving, zijn te genereren en te bewerken met de bekende tekst-utilities zoals awk en grep. Je bouwt al snel eigen scripts rondom platte tekstbestanden. Er bestaat een verscheidenheid aan third party programma’s zoals handige tools voor import of export van en naar andere formaten zoals CSV. Zie plaintextaccounting.org. Ledger is eenvoudig te installeren via de package manager van de meeste Linux-distributies en de BSD besturingssystemen.

Dubbele boekhouding

Ledger gebruikt de principes van de dubbele boekhouding. Dit is de “best practice” op het gebied van financiële administraties. Een dubbele boekhouding start bij de transacties. Een transactie is een statuswijziging, zoals de aanschaf van een paar sokken, de betaling van je huur, of het ontvangen van rente. Het bijzondere aan de dubbele boekhouding is dat de verwerking van een transactie altijd uit minimaal twee boekingsregels bestaat, met tenminste één bron- en tenminste één doelrekening, waarbij de som van de bedragen van de transactie in totaal nul is. Men zegt dan dat de boeking “in evenwicht” is. Wanneer deze som niet nul is dan is de boeking “niet in evenwicht”, wat betekent dat een fout in de registratie of verwerking van de transactie is opgetreden.

De boekingen vinden plaats op verschillende soorten rekeningen, namelijk rekeningen die een stand weergeven en rekeningen die het volume van een stroom over een bepaalde tijd weergeven. Een rekening die een stand weergeeft, is bijvoorbeeld een rekening met het saldo van je bankrekening of de rekening met het geld in je spaarpot. Een rekening die het volume van een stroom over een bepaalde tijd weergeeft, bevat bijvoorbeeld de hoeveelheid geld die je in dit jaar aan salaris hebt ontvangen of in het laatste kwartaal aan het energiebedrijf hebt betaald.

Rekeningen

Rekeningen die een positieve stand weergeven, zoals het geld in je spaarvarken, noemen we “bezittingen”, rekeningen die een negatieve stand weergeven, zoals je hypotheek, of nog te betalen belasting, noemen we “schulden”. Rekeningen die een positieve stroom weergeven, noemen we “inkomsten”, zoals je salaris-ontvangsten. Rekeningen die een negatieve stroom weergeven noemen we “uitgaven”, zoals je Netflix-abonnement of een parkeerboete.

Tenslotte hebben we nog de rekeningsoort “vermogen”, dit is het saldo van je bezittingen en schulden. Voor je persoonlijke financiën, gebruik je dit vooral bij de initiële start van je administratie. Je begint nooit bij nul, op de dag waarop je administratie start heeft je bankrekening een saldo, je hebt misschien ook nog een spaarrekening, enzovoorts. Wanneer je deze initiële standen boekt (de “openingsbalans”) dan gebruik je “vermogen” als de tegenrekening.

In het begin is even wennen om met deze vijf soorten rekeningen te werken. Na een tijdje ga je de logica zien en wordt het allemaal eenvoudig.

Ledger werkt met een hiërarchische indeling van de rekeningen, met een dubbele punt als scheidingsteken. Bijvoorbeeld “Uitgaven:Auto:Benzine”, of “Bezittingen:Bank:Bankrekening” en “Bezittingen:Bank:Spaarrekening”. De rekeningen mogen een wisselend diepteniveau hebben, bijvoorbeeld “Inkomsten:Salaris” naast “Inkomsten:Rente:Bankrekening”. Deze diepgang is afhankelijk van je eigen behoefte. Is het voor jou voldoende om te weten hoeveel je aan kleding uitgeeft, dan boek je dergelijke aankopen op ’Uitgaven:Kleding“. Wil je echter weten of je meer geld aan sokken of aan T-shirts uitgeeft, dan gebruik je bijvoorbeeld ”Uitgaven:Kleding:Sokken“,”Uitgaven:Kleding:Tshirts” en “Uitgaven:Kleding:Ondergoed”.

Journaal

Een journaal is een bestand met de transacties van een bepaalde periode, bijvoorbeeld een kalenderjaar. Het journaal heeft een voorgeschreven format en maak je met je favoriete teksteditor. Een transactie begint met een kopregel bestaande uit de datum gevolgd door de tegenpartij, bijvoorbeeld de naam van de leverancier, en desgewenst een omschrijving. Daaronder volgen een of meer regels die starten met een of meer spaties gevolgd door de betreffende rekening en het bedrag. Omdat de naam van een rekening spaties mag bevatten, bestaat de scheiding tussen de rekeningnaam en het bedrag uit tenminste twee spaties. Elke transactie kent minstens één bron-rekening en minstens één doel-rekening.

Stel: je betaalt 110 euro aan het energiebedrijf, dan boek je op een uitgavenrekening (bijvoorbeeld “Uitgaven:Vastelasten:Energie”) 110 euro positief en op de rekening voor je bankrekening (bijvoorbeeld “Bezittingen:Bank:Bankrekening”) 110 euro negatief. Zo is het totaal van de boeking nul.

De laatste regel hoeft geen bedrag te bevatten, Ledger rekent in dat geval het benodigde bedrag uit om de transactie in evenwicht te brengen. Zie listing 1. Meestal kun je volstaan met het opnemen van een regel met een bedrag en een regel met de tegenrekening. In Ledger wordt de leverancier “payee” genoemd, letterlijk de partij aan wie je betaalt. De omschrijving achter de payee, weer met twee spaties als scheiding, is handig bij periodieke posten. Je vermeldt de maand, zodat opvalt wanneer een maand ontbreekt. Desgewenst neem je commentaar of een toelichting op. Dit begint met een puntkomma, in een transactieregel achter de boekingsinformatie, of op een eigen regel.

Listing 1: Enkele voorbeeld journaal-regels.

Tags

Ledger werkt met twee verschillende manieren om een tag op te nemen. Tags mogen geen spatie bevatten. Eenvoudige tags neem je op door in een commentaar de tags tussen dubbele punten te plaatsen, bijvoorbeeld:

; :tag1:Tag2:derdetag:

De andere vorm van tags is een key:value combinatie, zoals:

; Weekendtrip: Maastricht

Rapporten

Nadat je het journaal met een aantal transacties gevuld hebt, maak je met Ledger rapporten. Ledger leest je journaal, maar bewerkt het niet. Ledger is een rapportgenerator die je journaal razendsnel in een verscheidenheid van rapporten vertaalt.

Ledger kent vier typen rapporten, “balance” rapporteert over de actuele eindstand van de rekeningen, “register” over de transacties, voeg “–monthly” toe aan register voor maandcijfers. Klopt het banksaldo niet met de rekening “Bezittingen:Bank:Bankrekening”, dan traceer je de afwijkingen met “reconcile.” Met “ledger print” kun je het journal netjes uitlijnen. Met filters beperk je de gegevens waarover Ledger rapporteert, zoals een selectie van een beperkt aantal rekeningen, of bepaalde payees, enzovoorts. Je krijgt een mooi totaaloverzicht van inkomsten en uitgaven met ledger -f journal balance ^Uitgaven ^Inkomsten –invert, waarbij je “balance” kunt afkorten tot “bal”. Zie onderstaande afbeelding.

Totaaloverzicht Inkomsten en Uitgaven.

Een overzicht van je gemiddelde uitgaven op maandbasis krijg je met ledger –monthly –average register ^Uitgaven -f journal.ledger. Je kunt aan deze opdrachtregels tag-filters toevoegen, bijvoorbeeld “and not tag derdetag”, of “tag(/Weekendtrip/) =~ /Maastricht/”. Ledger maakt de rapporten razend snel. Je kiest uit een verscheidenheid aan rapporten of definieert ze zelf. Zie legder-cli.org voor meer voorbeelden van rapporten.

Vreemde valuta en beleggingen

Ledger werkt met vreemde valuata en met beleggingen op dezelfde wijze. Op het moment van aankoop of verkoop voer je bij vreemde valuta in plaats van euro de naam van de betreffende valuata in, bijvoorbeeld “GBP” voor Britse ponden, bij aandelen voer je op de naam van het aandeel in, bijvoorbeeld “AMZN” voor Amazon. De bankmutatie voer je in euro’s in. Ledger herleidt de koers als het quotiënt van het valuta-bedrag of het aantal aandelen en de euro-waarde. Dit noemt Ledger de “prijs”. Iedere keer wanneer je een transactie doet, herberekent Ledger de prijs. Bij het opvragen van de balans waardeert Ledger de vreemde valuatie en tegen de meest recente prijs.

Include files

Ledger begrijpt de werking van include-bestanden. In het journaalbestand neem je een regel op met “include” gevolgd door een spatie en de naam van het bestand dat je wilt includen. Wanneer je geregeld contant geld gebruikt en die transacties ook wilt verwerken, dan maak je bijvoorbeeld een apart journaal voor de banktransacties en een apart journaal voor kastransacties, en include je het ene journaal in het andere.

Budgettering

Een budget is een uitgavenplan waarbij je op regelmatige momenten bewaakt in hoeverre je uitgaven afwijken van het plan. Ledger werkt met periodieke budgetten, bijvoorbeeld maandelijks of jaarlijks. Het budget voer je als eerste regels in je journaal in, of als een include. Je maakt een blok aan, dat begint met een tilde gevolgd door de periode-aanduiding, bijvoorbeeld “~ Monthly”. Daaronder maak je per post die je wilt budgetteren een regel met de rekening en het periodebedrag. Om te zorgen dat ook deze transactie op nul uitkomt, eindig je dit blok met een regel “Bezittingen”. Zie listing 2:

Listing 2: Een blok met budget regels.

Maak een maandelijks budget voor geregeld terugkerende uitgaven, zoals boodschappen of brandstof. Posten als reparatie van je fiets of auto of de vervanging van je wasmachine zijn vooraf niet te voorspellen, kies daarvoor een jaarbudget. Regelmatig draai je een rapport uit met de toevoeging “–budget”. Door deze toevoeging maakt ledger virtuele transacties aan. Staat in je monhtly budget bijvoorbeeld de rekening Uitgaven:Auto:Benzine met een bedrag van euro 70, dan wordt elke maand een transactieregel toegevoegd van plus 70. Je echte uitgaven zijn in een bepaalde maand bijvoorbeeld een uitgave van 45 en van 30, dan heb je in die maand +70 van het budget en -45 en -30 uitgaven, wat opgeteld negatief uitkomt op -5. Dit betekent dat je 5 euro meer hebt uitgegeven dan gepland. Zie ook de onderstaande afbeelding.

Budget versus werkelijk.

Editors

Voor Atom, Vim en Emacs bestaan uitbreidingen die het werken met Ledger makkelijker maken, waarbij die voor Emacs de meeste functionaliteiten biedt. Voor Atom bestaat de Ledger language package en voor Vim bestaat de ledger-plugin, beide uitbreidingen bieden onder andere syntax highlighting en autocompletion. Emacs gebruikers kiezen voor de uitgebreide ledger-mode, zie de afbeelding hieronder. Verder bevat Ledger een aantal features voor het werken met org-mode. Wij hebben lang niet alle mogelijkheden laten zien. Ledger lijkt eenvoudig maar is vernuftig. Je administratie bijhouden in Ledger is makkelijk en past goed bij mensen die graag op de commandline werken, scriptjes schrijven en met versiebeheer overweg kunnen.

Emacs met ledger-mode.