Se sei solito pagare tutto tramite carta sicuramente avrai meno difficoltà nel trovare la risposta alla domanda del titolo. Ormai quasi tutte le banche permettono di categorizzare in automatico le spese e di avere un resoconto mensile. Ma permettono di personalizzare il procedimento? Puoi cambiare la categoria di una spesa? Puoi aggiungere nuove categorie? È possibile avere categorie e sotto categorie? Se utilizzi più banche come fai ad unire i dati che provengono dalle varie app? L’obbiettivo di questo post è dare una risposta a tutte queste domande attraverso l’utilizzo di Ledger.

Cos’è Ledger

Ledger è uno strumento per la contabilità a partita doppia pensato per essere usato attraverso la linea di comando. Molti paroloni, ma ti assicuro che è tutto più semplice di quanto possa sembrare.

strumento per la contabilità

Sicuramente ti è già chiaro cosa sia la contabilità, ma perché tenerla, mica sei un’azienda. Vero, non sei un’azienda, ma gestire il proprio denaro diventa ogni giorno più complicato. La ragione principale di questo aumento di complessità è il numero di conti che utilizziamo; abbiamo il conto corrente dove riceviamo lo stipendio, poi c’è un conto deposito, abbiamo un conto che utilizziamo per i viaggi, Satispay per scambiarsi soldi con gli amici. E non è finita qui, molti hanno anche un conto d’investimento, altri hanno dei wallet per per cryptovalute, c’è chi ha dei soldi sull’account PayPal, chi su Amazon e così via. Usiamo più servizi di prima e ogni servizio ha il suo perché, ma tenere traccia della nostra situazione finanziaria è più complicato, quindi dobbiamo affrontare il problema con gli strumenti giusti.

partita doppia

La partita doppia è un metodo contabile usato per la prima volta dai mercanti fiorentini nel XIV secolo. L’idea alla base del metodo è quella di registrare un’operazione sempre almeno su due conti. Questo vuol dire che se un conto aumenta di 10€ necessariamente un altro conto deve diminuire di 10€ in quanto non è possibile creare soldi dal niente. All’inizio può sembrare un po’ contro intuitivo, ma se viene usato da seicento anni un motivo ci sarà.

usato attraverso la linea di comando

Non voglio mentirti, questo post fa largo uso del terminale e a te il terminale probabilmente non piace. Prima di chiudere la pagina lasciami solo dirti che Ledger ha dato vita ad un movimento che prende il nome di Plain Text Accounting e sono molti software che aderiscono a questo movimento. Alcuni di questi sono dotati anche di un’interfaccia grafica per cui puoi applicare molti concetti trattati in questo post anche ad altri tool.

Plain Text Accounting

L’idea alla base del plain text accounting è quella di tenere traccia della contabilità attraverso l’utilizzo di file in plain text. Cos’è un file in plain text? Semplice è un file di testo, niente di più, niente di meno. No, non come Word, in cui ci sono i font, le dimensioni, il grassetto, il colore ecc. Un file plain text contiene solo del testo, nient’altro.

Ti sembra troppo limitato? Ti assicuro che non è così. Con i file in plain text ci si può fare tantissimo, come in questo caso tenere traccia della contabilità. Inoltre hanno due grandi vantaggi:

  • Un file plain text potrà essere aperto anche fra cent’anni.
  • Un file plain text può essere compreso anche dagli esseri umani.

All’interno di un file Ledger, spesso chiamato journal, sono contenute prevalentemente delle transazioni che vanno ad alterare il saldo dei vari conti. Una transazione si compone di una riga d’intestazione, al cui interno sono riportate la data e il beneficiario/causale del pagamento, e n righe ognuna che rappresenta un cambiamento in un conto. Ecco un esempio di transazione in Ledger.

2021-01-17 Airbnb
    expenses:travel:accommodation         550 EUR
    assets:current:revolut               -550 EUR

Come si legge? Il diciassette gennaio ho fatto un pagamento ad Airbnb. Il costo dell’affitto è stato categorizzato come una spesa di viaggio, in particolar modo è rientrato nella sotto categoria accommodation. Il pagamento dei 550€ è avvenuto mediante il mio conto Revolut.

Semplice no? Forse anche troppo, proviamo con qualcosa di più complesso. Per prepararmi al viaggio, il giorno dopo, ho comprato su Amazon un cuscino da viaggio dal costo di 10€. Inoltre ho visto che c’è un nuovo modello di kindle in offerta (100€), quindi ho comprato anche quello. Anche in questo caso voglio pagare con la mia carta Revolut, ma sul mio account Amazon ho ancora 25€, per cui la transazione su ledger sarà del tipo:

2021-01-18 Amazon
    expenses:travel:accessories            10 EUR  ; cuscino da viaggio
    expenses:entertainment:books          100 EUR  ; kindle
    assets:current:amazon                 -25 EUR
    assets:current:revolut

Ok qui sembra esserci qualcosa di strano. Innanzitutto non è stato specificato quanti soldi sono stati prelevati dal conto Revolut, ma tranquillo questo non è un errore. Poiché Ledger usa la partita doppia, la somma di tutte le modifiche sui vari conti deve essere sempre zero. Nel nostro caso abbiamo 10 + 100 - 25 quindi per portare il tutto a zero ci serve un -85. Quindi Ledger è abbastanza furbo da capire che da Revolut sono stati presi 85€1.

L’altra particolarità della transazione precedente è la presenza del simbolo ;. In punto e virgola, in Ledger, viene utilizzato per le note. Se la nota viene messa su una riga con un movimento (come nell’esempio) allora la nota si riferisce al singolo movimento. Mentre quando la nota sta su una riga tutta sua allora questa fa riferimento all’intera transazione.

Struttura dei conti

Dopo aver visto gli esempi precedenti ti dovrebbe essere già abbastanza chiaro il modo in cui Ledger gestisce i conti, ovvero in maniera gerarchica. Ogni categoria (per esempio expenses) può avere più sotto categorie (per esempio travel) che a sua volta può avere altre sotto categorie (per esempio accessories) e così via. Ogni livello viene separato dai due punti (:) e ci possono essere infiniti sotto livelli.

Il nome dei conti è totalmente libero e viene deciso dall’utente. Sebbene non gli abbia usati, il nome di un conto può contenere anche spazzi e lettere maiuscole.

Ledger è democratico con i conti e li tratta tutti allo stesso modo. Questo vuol dire che i conti con le nostre spese agli occhi di Ledger sono totalmente uguali a quelli in cui ci sono i nostri averi. Anzi, ti dirò di più, Ledger non sa neanche che il conto expenses contiene le nostre spese. Siamo noi a dare una semantica ai vari conti, per questo è importante usare nomi sensati.

Ti ripeto, sei totalmente libero di utilizzare i nomi che preferisci per i tuoi conti, ma ti consiglio di introdurre delle regole per gestire al meglio il tutto. In particolare ti consiglio di limitare a cinque il numero di conti principali e di usare quelli elencati qui sotto (o la loro traduzione in italiano).

  • assets: sono i conti in cui stazionano i tuoi soldi.
  • expenses: sono i conti in cui vanno a finire i tuoi soldi.
  • income: sono i conti da cui arrivano i soldi.
  • liabilities: sono i conti in cui risiedono i soldi che devi ad altri.
  • equity: questo è un po’ complicato. Da un punto di vista teorico in questi conti è riportato il valore reale dei tuoi averi. Da un punto di vista pratico questi conti vengono usati come account jolly. Comunque tranquillo questo conto viene utilizzato poco.

Registrare le entrate

Prima di poter vedere il funzionamento di Ledger devo spiegarti come segnare le tue entrate. Per prima cosa dobbiamo fare una fotografia della situazione iniziale. Quindi se iniziamo a tenere traccia della nostra contabilità a partire dal primo gennaio 2022 dobbiamo dire a Ledger qual è la nostra situazione finanziaria.

Ipotizzando di avere, al primo gennaio, la seguente situazione finanziaria:

  • conto Revolut: 243€
  • conto corrente Illimity: 729€
  • saldo account Amazon: 25€
  • contanti: 37€

avremo la seguente transazione Ledger:

2022-01-01 Opening Balances
    assets:current:revolut          243 EUR
    assets:current:amazon            25 EUR
    assets:current:illimity         729 EUR
    assets:current:cash              37 EUR

Per verificare che il file sia corretto e comprensibile a Ledger utilizziamo il comando stats che oltre ad interpretare il file con le transazioni ci fornisce diverse statistiche. Nel mio caso il comando completo è ledger --file ledger.journal stats poiché ho inserito la transazione nel file ledger.journal.

Si è verificato un’errore? Tranquillo non è colpa tua. La verità è che sono uno stronzo e ti ho fatto sbagliare di proposito. Riguardando la transazione si nota subito che abbiamo violato la prima regola di Ledger: La somma di tutti i movimenti deve essere zero. Ledger vuole sapere da dove vengono questi 1034€. Sono soldi che già sono nelle nostre disponibilità, per cui non è corretto inserirli tra le entrate, quindi la soluzione migliore è utilizzare la categoria jolly e quindi il conto equity. Per questo la nostra transazione di apertura sarà:

2022-01-01 Opening Balances
    assets:current:revolut          243 EUR
    assets:current:amazon            25 EUR
    assets:current:illimity         729 EUR
    assets:current:cash              37 EUR
    equity:open                   -1034 EUR

Ora se provi ad eseguire nuovamente il comando ledger --file ledger.journal stats non dovresti vedere degli errori, bensì delle statistiche sul tuo journal.

Ok è arrivato il quindici del mese e riceviamo lo stipendio, come segnare queste entrate? Basta inserire all’interno del journal una nuova transazione in cui aggiungiamo 1500€ (il nostro stipendio) al conto Illimity (il conto su cui ci accreditano lo stipendio). Da dove prendiamo questi 1500€? Semplice dal conto del nostro datore di lavoro.

2022-01-15 Employer
    assets:current:illimity         1500 EUR
    income:salary                  -1500 EUR

Balance & Register

Ora che dovrebbe essere chiaro come registrare i movimenti tra i nostri conti è arrivato il momento vedere come funziona Ledger e in particolare i due comandi più usati; balance e register. Ti consiglio di eseguire passo passo i comandi che ti farò vedere e, per ottenere i miei stessi risultati, devi usare questo journal.

Balance

Il comando balance permette di visualizzare il bilancio corrente di tutti gli account. Eseguendo da terminale il comando ledger --file ledger.journal balance si ottiene il seguente output:

            1607 EUR  assets:current
              37 EUR    cash
            1509 EUR    illimity
              61 EUR    revolut
           -1034 EUR  equity:open
             927 EUR  expenses
             100 EUR    entertainment:books
              47 EUR    food:restaurants
             220 EUR    groceries
             560 EUR    travel
              10 EUR      accessories
             550 EUR      accommodation
           -1500 EUR  income:salary
--------------------
                   0

Da questo output si nota bene l’organizzazione gerarchica dei conti in Ledger. Se questa rappresentazione dovesse crearti problemi puoi usare il flag --flat.

In altri casi ancora non si vuole conoscere il bilancio di tutti i conti, per questo motivo Ledger permette di selezionare solo i conti che matchano una regular expression. Nel caso fossi interessato a conoscere la posizione di tutti i soldi di cui disponi e visualizzare i vari conti in modo piatto è possibile usare il comando ledger --file ledger.journal balance assets --flat che genera il seguente output:

              37 EUR  assets:current:cash
            1509 EUR  assets:current:illimity
              61 EUR  assets:current:revolut
--------------------
            1607 EUR

Register

Un altro comando fondamentale di Ledger è register il cui compito è quello di simulare un registratore di cassa. Questo comando permette di vedere l’effetto sui conti di ogni singolo movimento. Anche in questo caso il report può essere ridotto solo a determinati conti.

Per vedere tutte le transazioni in generi alimentari possiamo usare il comando ledger --file ledger.journal register groceries che ha il seguente output:

2022-01-10 Esselunga          expenses:groceries          137 EUR       137 EUR
2022-01-23 Esselunga          expenses:groceries           83 EUR       220 EUR

Oltre alla data e al conto della transazione nell’output sono riportate due colonne, la prima mostra l’ammontare della transazione, mentre la seconda tiene traccia della somma di tutte le transazioni.

Quanto ho speso questo mese?

Dopo questa lunga introduzione possiamo finalmente rispondere alla domanda del titolo. Lo strumento migliore, messo a disposizione da Ledger, per conoscere le nostre spese è il comando register. In particolare se siamo interessati solo alle spese del mese corrente dobbiamo usare anche il flag --period che permette di selezionare solo un determinato intervallo temporale. Quindi per conoscere tutte le spese di questo mese usiamo il comando: ledger --file ledger.journal register expenses --period 'this month'2.

2022-01-10 Esselunga            expenses:groceries                      137 EUR       137 EUR
2022-01-17 Airbnb               expenses:travel:accommodation           550 EUR       687 EUR
2022-01-18 Amazon               expenses:travel:accessories              10 EUR       697 EUR
2022-01-18 Amazon               expenses:entertainment:books            100 EUR       797 EUR
2022-01-23 Esselunga            expenses:groceries                       83 EUR       880 EUR
2022-01-29 Pub                  expenses:food:restaurants                47 EUR       927 EUR

Nell’output abbiamo l’elenco di tutte le spese del mese. Nella prima colonna è riportata la data della spesa e l’esercizio commerciale dove è stata effettuata. Nella seconda colonna è riportata la categoria e nella terza l’ammontare. Nell’ultima colonna è riportata la somma corrente, quindi per conoscere le spese totali di gennaio dobbiamo guardare all’ultima colonna dell’ultima riga. Quindi in questo esempio a gennaio sono stati spesi 927€.

Non sei interessato a tutte le spese, ma solo a quelle di viaggio? Niente di più semplice, basta usare il seguente comando: ledger --file ledger.journal register expenses:travel --period 'this month'

2022-01-17 Airbnb               expenses:travel:accommodation           550 EUR       550 EUR
2022-01-18 Amazon               expenses:travel:accessories              10 EUR       560 EUR

In altri casi non siamo interessati alle singole transazioni, ma al totale per ogni categoria. In questi casi possiamo usare il flag --subtotal ottenendo il seguente comando: ledger --file ledger.journal register expenses --period 'this month' --subtotal.

2022-01-10 - 2022-01-29           expenses:entertainment:books            100 EUR       100 EUR
                                  expenses:food:restaurants                47 EUR       147 EUR
                                  expenses:groceries                      220 EUR       367 EUR
                                  expenses:travel:accessories              10 EUR       377 EUR
                                  expenses:travel:accommodation           550 EUR       927 EUR

In questo caso la colonna più importante è la terza in cui viene riportata la spesa totale per la categoria. Quindi in questo esempio sono stati spesi 100€ in libri, 47€ in ristoranti e così via.

Siamo arrivati alla fine di pesto primo post su Ledger. Probabilmente questo strumento ti sembrerà overkilled per lo scopo che ci siamo fissati all’inizio del post e in parte hai ragione. Ledger è uno strumento molto potente e flessibile che da il meglio di se solo quando ci si prende la mano. Nei prossimi post della serie ci sarà modo di trattare diversi argomenti e di espandere quelli già accennati. Stay tuned!

Questo post contiene diversi referral link.


  1. Naturalmente è possibile lasciare in bianco solo un valore, quindi lasciandone vuoti due Ledger non è più in grado di determinare quelli mancanti. ↩︎

  2. Ledger ci consente di esprimere gli intervalli temporali attraverso varie espressioni. Espressioni relative come ‘this month’ sono comode perché ci permettono di usare lo stesso comando che si adatta in automatico alla situazione attuale, ma ci sono dei casi in cui abbiamo bisogno di identificare il periodo di riferimento in modo più diretto. Per esempio se stai leggendo questo articolo a febbraio non otterrai alcun risultato in quanto per Ledger ‘this month’ equivale per l’appunto a febbraio. In questi casi è possibile utilizzare il nome del mese (--period 'jan') oppure definire l’intervallo in modo esplicito (--period 'from 2022-01-01 to 2022-01-31'). ↩︎