текстова бухгалтерія за допомогою ledger

| ledger, гроші, підказка, поновлюється

[поновлюється] років п’ять тому, приїхавши до канади з невеликою кількістю грошей, я спробував вести «домашню бухгалтерію». до того, ще в україні, я вже пробував різні додатки для windows mobile на кпк, потім щось для android на мудрофоні, навіть gnucash на ноутбуці… ніщо не прижилося. тож я шукав щось простіше, і перечепився через ledger. мінімаліст у мені закохався з першого погляду! тож цього разу я протримався… чотири роки, занотовуючи витрати з більшою чи меншою деталізацією, — але в підсумку втратив інтерес та припинив. тепер прийшов час пригадати, а заразом розкажу, як воно робиться.

зміст

чому звичайний текст?

простий текст — найкращий формат даних для багатьох застосувань, а особливо для невеликих проєктів і особистих записів, тому що доступний і портативний: (як правило) не потрібно спеціяльних програм для читання й редагування, однаково відображається на всіх системах, дозволяє за потреби відносно легко конвертувати в інші формати. окрім видатків, ось що особисто я зберігаю в текстовому форматі:

  • цей щоденник (у форматі kramdown, який автомагічно конвертується в статичний сайт за допомогою jekyll)
  • нотатки: власні й робочі, конспекти під час навчання тощо (asciidoc)
  • скрипти й програми (переважно bash та python)
  • задачі (у форматі todo.txt)

якщо ви ще не закохалися в простий текст — цей допис не для вас… але почитайте наступний абзац — можливо, вам сподобається ідея?

«текстова» бухгалтерія — це як?

щодо особистих видатків, — зрозуміло, що можна було би просто занотовувати все до текстового файлу, періодично підсумовувати на калькуляторі й робити якісь висновки… але це надто примітивно: навіть середньовічні торговці в європі вже використовували складніші підходи, як от подвійний запис, а в епоху комп’ютерів то був би сором. отож, 20 років тому такий собі джон віґлі запропонував простий формат для ведення бухгалтерських записів і написав програму ledger для автоматизованих підрахунків та аналізу даних з файлів у цьому форматі. ось як виглядатиме типовий запис про сплату, скажімо, за електроенергію в форматі ledger:

2022-11-17 Київенерго
  ; Оплата комунальних послуг (готівкою в касі)
  Готівка              -256,37 грн
  Електрика             256,37 грн

найпростіший запис ledger містить:

  • перший рядок: дата, назва контрагента;
  • кожен наступний рядок з відступом: рахунок, сума списання/зарахування, валюта;
  • (опційно) рахунок без суми (для списання/зарахування різниці по транзакції).

нічого страшного? очевидно, що програма, попри простоту формату, підтримує подвійний запис: з одного рахунку (Готівка) списано якусь суму, на інший (Електрика) цю ж суму записано. рядки, що починаються з ; — це коментарі. а ось таке можна було би занотувати після закупів у супермаркеті:

2022-11-18 Сільпо
  ; Закупи в супермаркеті
  Кредитка
  Продукти              123,45 грн
  Інше                  234,56 грн

стривайте, де ж тут сума, що її списують з рахунку Кредитка? а це діє «автомагія» ledger: нема потреби вказувати, яку суму списано: програма сама її полічить, достатньо вказати рахунок, на який відносяться витрати. це не єдина зручність ledger; ось так можна занотувати обмін валют:

2022-11-19 Приватбак
  ; Купівля валюти
  Готівка               100 USD @ 40,25 грн
  Готівка       

тут на готівковий рахунок внесено 100 доларів сша за курсом 40,25 грн/долар, — ledger сам порахує, скільки витрачено гривень на цю операцію, і віднесе відповідне списання на той самий рахунок Готівка. стоп, як? тобто на одному рахунку можуть бути «одночасно» гривні й долари? — так, легко! а чому ні? але якщо хочеться мати окремий рахунок на кожну валюту, ніхто не обмежує.

а де програма зберігає стан рахунків, і де зберігається довідник рахунків?

ніде! в цім краса ledger: він нічого ніде не зберігає; за назви рахунків правлять довільні текстові мітки, з яких починаються відбитті (ті, що з відступом) рядки; кількість та назви валют довільні: можна грн та долари, можна UAH та USD, а можна вести облік у кришечках.

але яка тоді роль ledger? це програма для аналізу записів у текстовому файлі, і обчислення звітів «на льоту»! наприклад, якщо треба порахувати поточний баланс по всіх згаданих у файлі рахунках:

> ledger --file ledger_test.txt balance 
          234,56 грн  Інше
             100 USD
        -4281,37 грн  Готівка
          256,37 грн  Електрика
         -358,01 грн  Кредитка
          123,45 грн  Продукти
--------------------
             100 USD
        -4025,00 грн

або якщо треба переглянути журнал всіх операцій:

> ledger --file ledger_test.txt register
22-Nov-17 Київенерго    Готівка       -256,37 грн    -256,37 грн
                        Електрика      256,37 грн              0
22-Nov-18 Сільпо        Кредитка      -358,01 грн    -358,01 грн
                        Продукти       123,45 грн    -234,56 грн
                        Інше           234,56 грн              0
22-Nov-19 Приватбак     Готівка           100 USD        100 USD
                        Готівка      -4025,00 грн        100 USD

звісно, це лише примітивний приклад для швидкої демонстрації облікової книги в текстовому файлі й ledger. для застосування в реальному житті треба додати трішечки планування й базових знань про облік, але основні засади будуть ті самі. якщо цікаво — читайте далі!

ledger: найпростіші звіти

встановлення й налаштування

отже, для експериментів знадобиться сам ledger — консольний додаток для linux. можна завантажити, але правильніше встановити з репозиторіїв, — для прикладу, в arch-базованих дистрибутивах якось так:

[sudo] pacman -S ledger
ledger --version

для debian так само все просто, ledger є в репозиторії:

[sudo] apt-get update
[sudo] apt-get install ledger
ledger --version

є версії для windows, macos, *bsd, але розбирайтеся з ними самі, якщо вони вам треба.

ledger не потребує налаштувань; чи не єдине, що я зазвичай роблю — зберігаю розташування файлу до змінної для знучности (приміром, до ~/.bashrc); розширення не обов’язково має бути .ledger (це просто текстовий файл!), але це спрощує застосування підствітки синтаксису (див. далі) у vim, kate чи іншому притомному текстовому редакторі:

LEDGER=~/test.ledger

якщо користуватися vim, можна додатково покращити собі настрій, додавши підсвітку синтаксису ledger і декілька додаткових можливостей:

> pamac install vim-ledger-git

тепер можна братися до експериментів (сподіваюся, редактор за замовчуванням налаштовано?):

$EDITOR $LEDGER

планування облікової книги

якщо мені вдалося когось зацікавити, тут варто було би зупинитися й порадити чудовий довідник «ledger: command-line accounting» на офіційному сайті ledger’а: він надзвичайно детальний, містить велику кількість прикладів, в до того ж легко читається! щоправда, він написаний англійською мовою, і я не стрічав перекладів українською; тож коли вже я пообіцяв якийсь зрозумілий вступ до використання ledger для особистої бухгалтерії, тож мушу продовжити.

тільки замість вибірково переказувати довідник, я розповім про власний досвід на конкретних прикладах з канадійських реалій; кому треба — легко зможе адаптувати до своїх задач.

отож, я починаю з порожнього файлу tivasyk_2023.ledger на власному сервері owncloud (раніше зберігав на dropbox’і):

LEDGER="~/owncloud/ledger/tivasyk_2023.ledger"
vim $LEDGER

далі — просто робота з цим файлом. для початку — заголовок.

; ---------------------- 
; Фінансовий журнал 2023
; ----------------------

далі я створюю для себе великий блоковий коментар, який міститиме «довідник рахунків» — перелік усіх рахунків, які я планую використовувати. навіщо?

  • слугує мені нагадуванням про структуру рахунків;
  • дозволяє скористатися автодоповненням в більшости текстових редакторів.

«пласка» (однорівнева) структура рахунків, як у попередніх прикладах — це надто просто і незручно в реальному житті; тому назви рахунків у мене мають певний формат: категорія:[банк:]рахунок:власник; ledger ніяк не обмежує, але зручно й правильно використовувати канонічні бухгалтерські категорії — активи, пасиви, доходи, витрати й капітал:

; ------------------------------
; Фінансовий журнал 2022-2023
; ------------------------------
; Довідник рахунків 
; ------------------------------
; Активи                        ; Assets
;   Активи:Готівка              ; Готівка на руках (CAD, USD, UAH тощо)
;   Активи:RBC                  ; Рахунки в RBC
;     Активи:RBC:Поточний       ; ..Чековий рахунок в RBC (CAD)
;     Активи:RBC:Депозит        ; ..Депозитний рахунок в RBC (USD)
;     Активи:RBC:REEE           ; ..Дитячий навчальний депозит в RBC (CAD)
;   Активи:DJ                   ; Рахунки в Desjardins
;     Активи:DJ:Поточний	    ; ..Чековий рахунок в Desjardins (CAD)
;   Активи:IA                   ; Рахунки в Industrial Alliance
;     Активи:IA:Депозит         ; ..Депозитний рахунок в Ind All (CAD)
; ------------------------------
; Пасиви                        ; Liabilities
;   Пасиви:RBC                  ; Кредити в RBC
;     Пасиви:RBC:Кредитка       ; ..MasterCard 
;     Пасиви:RBC:Навчання       ; ..Студентська позика в RBC (коледж)
;     Пасиви:RBC:Кредитна лінія	; ..Кредитна лінія в RBC
;     Пасиви:RBC:Автопозика     ; ..Кредит на автівку
;   Пасиви:DJ                   ; Кредити в Desjardins
;      Пасиви:DJ:Іпотека        ; ..Іпотечний кредит (фікс. 1,79%/рік)
;   Пасиви:CIBC                 ; Кредити в CIBC
;      Пасиви:CIBC:Кредитка   	; ..MasterCard
; ------------------------------
; Капітал                       ; Equity
;   Капітал:Початковий баланс   ; Стан балансу на день відкриття журналу
; ------------------------------
; Доходи                        ; Income
;   Доходи:Соцвиплати           ; Федеральні й провінційні виплати на дітей тощо
;   Доходи:Зарплата             ;
;   Доходи:Інше                 ; Будь-які інші доходи
; ------------------------------
; Витрати                       ; Expenses
;   Витрати:Житло
;     Витрати:Житло:Електрика
;     Витрати:Житло:Іпотека
;     Витрати:Житло:Інше
;   Витрати:Зв'язок
;     Витрати:Зв'язок:Інтернет
;     Витрати:Зв'язок:Телефон
;   Витрати:Здоров'я
;   Витрати:Автівка
;     Витрати:Автівка:Пальне
;     Витрати:Автівка:Інше
;   Витрати:Освіта
;   Витрати:Дозвілля
;   Витрати:Подарунки
;   Витрати:Податки
;   Витрати:Покупки
;   Витрати:Послуги
;   Витрати:Продукти
;   Витрати:Транспорт
;   Витрати:Невраховані
; ------------------------------

це все один великий коментар (рядки починаються з ;), тож ledger його ігнорує — можна додавати будь-яку інфомацію «для себе» (наприклад, в реальному житті я зберігаю номери рахунків, відсотки по кредитах, приблизні щомісячні виплати тощо).

далі: оскільки ніхто ніколи не починає облік з нуля, — потрібно зафіксувати початковий стан рахунків; «дорором» для всіх транзакцій є рахунок Капітал:Початковий баланс.

; ------------------------------
; Фінансовий журнал 2022-2023
; ------------------------------
; Довідник рахунків 
; ------------------------------
...
; ------------------------------
; Початкові баланси 2022-11-15
; ------------------------------
2022-11-15  Початкові баланси
  Активи:Готівка                20,00 CAD
  Активи:RBC:Поточний          	1234,56 CAD			  
  Активи:RBC:Депозит           	1234,56 USD @ 1,36820 CAD	
  Активи:RBC:REEE               1234,56 CAD 
  Активи:DJ:Поточний		    123,45 CAD
  Активи:IA:Депозит             1234,56 CAD 
  Пасиви:RBC:Кредитка        	-123,45 CAD			
  Пасиви:RBC:Кредитна лінія	    -1234,56 CAD			
  Пасиви:RBC:Автопозика   	    -12345,67 CAD			
  Пасиви:RBC:Навчання	        -1234,56 CAD		
  Пасиви:DJ:Іпотека			    -123456,78 CAD		
  Пасиви:CIBC:Кредитка          -123,45 CAD
  Капітал:Початковий баланс
; ------------------------------

зрозуміло, що стан рахунків взято «зі стелі».

нотація транзакцій

(далі буде)

основні звіти

(далі буде)

графіки!

(далі буде)

документація

детальніше про leger-cli можна почитати: