Кожен звіт про рух грошових коштів спирається на тихе рішення, яке приймається один раз для кожного рахунку: чи є цей рахунок частиною грошових коштів, які ви пояснюєте, чи це операційна, інвестиційна або фінансова діяльність? Прийміть це рішення правильно — і звіт розповість вам, куди насправді пішли ваші гроші. Помиліться — і звіт буде впевнено вводити в оману.
До цього часу звіт про рух грошових коштів Beancount.io приймав це рішення за вас за допомогою евристик — кореневого типу рахунку плюс здогад на основі назви, які активи вважати грошима. Для більшості книг здогад був правильним більшість часу, а решту часу — мовчки неправильним. Брокерський рахунок, названий неправильно, потрапляв у неправильний розділ. Фонд грошового ринку, який є грошима в будь-якому практичному сенсі, сидів в інвестиційній діяльності, тому що його назва про це не говорила.
Починаючи з сьогодні, ви можете зробити класифікацію явною. Один рядок стандартних метаданих beancount у директиві open рахунку:
2000-01-01 open Assets:US:Brokerage
cash-flow-role: "investing"
2000-01-01 open Assets:US:Marcus:Savings
cash-flow-role: "cash"Один ключ, чотири значення — cash, operating, investing, financing — і це вся конфігурація. Немає сторінки налаштувань, немає JSON-файлу, немає діалогу параметрів для кожного звіту. Наступного разу, коли завантажиться звіт про рух грошових коштів, потоки брокерського рахунку з'являться в розділі інвестиційної діяльності, ощадний рахунок приєднається до купи грошових коштів, зміну яких пояснює звіт, а всі інші рахунки працюватимуть точно так, як раніше.

Що означає кожна роль
Звіт про рух грошових коштів сортує кожен рахунок в одну з двох ролей, і cash-flow-role відповідає на обидва питання одним словом:
"cash"— рахунок належить до купи грошових коштів та їх еквівалентів. Грошові рахунки ніколи не з'являються як окремі рядки; звіт пояснює зміну їхнього сукупного балансу, а перекази між двома грошовими рахунками взаємознищуються, як і має бути, коли ви переміщуєте гроші з поточного на ощадний рахунок."operating"/"investing"/"financing"— рахунок не є грошима, і його зміна за період з'являється як рядок у відповідному розділі діяльності.
За замовчуванням звіт вважає активи, назви яких містять Cash, Checking, Savings або Bank, еквівалентами грошових коштів. Оголошення ролі перевизначає це в обох напрямках. cash-flow-role: "cash" додає рахунок, який правило назви пропускає — фонд грошового ринку, гаманець стейблкоїнів. А cash-flow-role: "investing" на Assets:US:Bank:CD робить дві речі одним рядком: виключає депозитний сертифікат із грошових коштів і відносить його до інвестицій, навіть якщо його назва відповідала б правилу грошових коштів.
Ми навмисно використали один ключ замість двох. "Чи є цей рахунок грошима?" і "до якого розділу діяльності він належить?" ніколи не були незалежними питаннями — рахунок або є частиною купи грошових коштів, або належить рівно до одного розділу діяльності. Два ключі дозволили б безглузді стани, наприклад, грошовий рахунок із роллю діяльності. Один ключ робить нелегальні стани непредставними, а вся специфікація вміщується в один твіт.

Класифікація, яку ви оголошуєте, — це класифікація, яку використовує кожне подання. Графік By Activity складає щомісячні операційні, інвестиційні та фінансові потоки; змініть роль рахунку — і його потоки перемістяться на правильний шар графіка, у правильний розділ звіту та правильний рядок експорту, все одночасно.
Оголошене перемагає над виведеним — і звіт показує свою роботу
Класифікація тепер визначається у строгому порядку: спочатку ваші метадані, потім вбудована евристика. І звіт чесно розповідає, що він зробив. Звіт закінчується панеллю "Грошові кошти та їх еквіваленти у цьому звіті", яка перелічує точно, які рахунки він вважав грошима при побудові цифр, а потім звіряє їх: грошові кошти на початок періоду, грошові кошти на кінець періоду та чисту зміну, яку пояснюють розділи діяльності.

Звіт також розрізняє класифікації, які ви оголосили, від класифікацій, які він вивів, і це розрізнення переноситься в експорт CSV та Markdown: звіт, побудований повністю з оголошених ролей, більше не несе рядок розкриття "класифікація є виведеною", тому що в цей момент класифікація — це не висновок, це частина ваших книг.
Друковані помилки обробляються так, як і має обробляти інструмент відкритого тексту. cash-flow-role: "invsting" не приймається мовчки і не ігнорується мовчки: рахунок повертається до стандартної евристики, а панель статусу позначає це — "невідоме значення cash-flow-role, використовується стандартне" — щоб помилка була видима там, де ви дивитеся, а не похована в журналі.
Якщо ви нічого не змінюєте, нічого не змінюється
Неанотовані рахунки використовують ті самі опубліковані стандартні значення, що й раніше: доходи та витрати відображаються на операційну діяльність, негрошові активи — на інвестиційну, зобов'язання та власний капітал — на фінансову, а грошові еквіваленти, визначені за назвою, формують купу грошових коштів. Існуюча книга відображається ідентично до та після цього випуску. Більшість користувачів анотуватимуть кілька рахунків — ті, де стандартне значення неправильне — і ніколи не думатимуть про решту.
Портативність також не порушена. Метадані в директивах open — це основна синтаксична конструкція beancount, яку розбирає кожен інструмент v2/v3 і ігнорує все, що не шукає цей конкретний ключ. bean-check проходить, Fava знизує плечима, а ваша книга залишається повністю придатною для використання поза Beancount.io.
Кожне подання ваших грошей узгоджується з усіма іншими
Один спільний резолвер визначає остаточну роль для кожного рахунку, і кожен споживач читає з нього:
- Звіт про рух грошових коштів будує свої розділи діяльності та свій підсумок — чисту зміну грошових коштів та їх еквівалентів — із визначених ролей.
- Експорт CSV, Markdown та друк несуть ті самі цифри, з розкриттям виведеної класифікації лише там, де фактично використовувалася евристика.
- Оглядова діаграма Санкі читає ті самі оголошення, тому рахунок, позначений вами як грошовий, перестає з'являтися як вузол потоку, а ваші оголошені ролі діяльності враховуються для не-дохідних рахунків.
- Панель статусу рахунку перестає перелічувати оголошений рахунок як "некласифікований актив".

Немає жодного способу, щоб звіт і діаграма розходилися в думці про те, що є вашими грошима, тому що існує лише одна відповідь, з якою можна не погоджуватися.
Чому книга, а не сторінка налаштувань
Це частина випуску, якою ми найбільше пишаємося. Ми розглядали інтерфейс налаштувань і відхилили його з трьох причин:
- Книга є джерелом істини. Класифікація, яка живе деінде, може суперечити книгам, які вона описує. Класифікація, яка живе в директиві
open, подорожує разом із рахунком — через перейменування, через переміщення репозиторію, через кожного клієнта, який читає файл. - Відкритий текст можна порівнювати, шукати та переглядати. Якщо ви зберігаєте свою книгу в git — а якщо ви використовуєте Beancount.io, ви це робите — правило класифікації тепер можна
grep,diffтаblame, і рецензент може побачити його в pull request. Сторінка налаштувань не є жодним із цих. - Це працює офлайн і всюди. Будь-який редактор може оголосити роль. Будь-який майбутній клієнт, який читає книгу, отримує класифікацію безкоштовно, без жодних налаштувань для синхронізації на кожному клієнті.
З тієї ж причини класифікації навмисно не є дато-ефективними. Метадані описують природу рахунку, яка рідко змінюється; коли це стається, ви редагуєте директиву open, і ваша історія git записує, що змінилося і коли. Ця історія і є аудиторським слідом.
Спробуйте на своїй книзі
Функція зараз розгортається на всіх книгах. Оголошення ролі потребує лише текстового редактора:
- Відкрийте файл, де живе директива
openрахунку. - Додайте
cash-flow-role: "cash"(або"operating","investing","financing") як рядок метаданих із відступом під нею. - Перезавантажте звіт про рух грошових коштів. Ваше оголошення негайно перемагає над евристикою.
Почніть із рахунків, де стандартний здогад неправильний — депозитний сертифікат, який насправді не є грошима, фонд грошового ринку, який насправді є, брокерський рахунок, який ви хочете чітко віднести до інвестиційної діяльності. Решту залиште як є. Повна специфікація — прийняті значення, пріоритет, стандартні класифікації та як обробляються недійсні значення — знаходиться в довіднику Ролі грошових потоків.
Звіт про рух грошових коштів є частиною кожної книги Beancount.io, поряд зі звітом про прибутки та збитки та балансом. Якщо ви наздоганяєте, що ще вийшло цього літа — розумніші імпорти, AI-асистент із можливістю дій та перебудований мобільний застосунок — примітки до випуску 3.6 охоплюють решту.
Ваші книги вже знали, які рахунки є інвестиціями, а які — щоденними витратами. Тепер звіт про рух грошових коштів знає це теж.
