向标准的Fava中添加带日期的侧边栏链接指令,然后保存一个查询,用于在汇总所有分录后查找负的期末余额。这些示例使用Beancount 3.2.3、beanquery 0.2.0和Fava 1.30.16执行。请使用固定本地设置。
这些URL指向本地标准的Fava服务器。Beancount.io的托管仪表板具有不同的报告路径,并在下方单独说明。
为什么要自定义Fava?
侧边栏快捷方式保留了有用的筛选视图。保存的查询随后可以回答特定的会计问题,而无需重复输入BQL。
这解决了哪些痛点:
- 反复选择当前或上个月。
- 重新打开已保存的报告。
- 区分实际余额低于零的账户的资金流出。
✨ 自定义侧边栏链接
将以下指令添加到下一节中的完整sidebar-demo.beancount账本中。使用fava sidebar-demo.beancount启动它,并在点击快捷方式之前打开其日记报告。
2021-01-01 custom "fava-sidebar-link" "Current Month" "/jump?time=month"
2021-01-01 custom "fava-sidebar-link" "Last Month" "/jump?time=month-1"
2021-01-01 custom "fava-sidebar-link" "Clear All" "/jump?account=&time=&filter="它们的作用:
/jump返回浏览器Referer头中的页面,并替换提供的查询参数。它并不总是打开日记报告。在资产负债表中,它保持在资产负债表上。此行为由标准Fava重定向处理器实现。
- 当前月份: 在当前报告上设置
time=month。 - 上个月: 在当前报告上设置
time=month-1。 - 清除全部: 移除
account、time和filter。其他参数(如转换和区间)保持不变。
2021年的固定数据在今天所在的月份将没有交易;在重现其查询结果之前,请使用清除全部。/jumpURL需要引用来源。对于直接打开的书签,请复制一个完整的可用报告URL。
在主机根目录,从/sidebar-demo/journal/?time=2021&account=Assets测试了/jump?time=month:它返回HTTP 302到相同的日记,并带有account=Assets&time=month。目标报告返回200。
如果管理员将整个Fava应用程序挂载在/books下,则每个根相对快捷方式都必须包含该前缀。这是一种替代配置,而不是要与上面的当前月份一起添加的另一个指令:
2021-01-01 custom "fava-sidebar-link" "Current Month" "/books/jump?time=month"本地WSGI挂载测试验证了/books/jump重定向回/books/sidebar-demo/journal/并带有新过滤器。普通的/jump在该挂载之外,返回404。Fava的自定义链接保留提供的URL;开头的/表示主机根目录,而不是账本根目录。
托管范围,检查于2026-09-07: Beancount.io仪表板源使用诸如/ledger/OWNER/LEDGER/income-statement和/ledger/OWNER/LEDGER/query之类的路径。其侧边栏构建自己的报告菜单。检查的源中没有/jump路由或fava-sidebar-link消费者。因此,此标准配方不适用于该仪表板。在托管产品上,打开所需的报告并为其工作地址添加书签。源快照不能证明实时部署运行的是哪个修订版本。
🔍 自定义SQL查询
将以下完整固定数据保存为sidebar-demo.beancount。它有意在每个资产账户中包含正和负的分录:
option "title" "Sidebar Demo"
option "operating_currency" "USD"
2021-01-01 open Assets:BCM:Positive USD
2021-01-01 open Assets:BCM:Negative USD
2021-01-01 open Equity:Opening-Balances USD
2021-12-01 * "Opening balances"
Assets:BCM:Positive 100.00 USD
Assets:BCM:Negative 20.00 USD
Equity:Opening-Balances -120.00 USD
2021-12-10 * "Outflows"
Assets:BCM:Positive -30.00 USD
Assets:BCM:Negative -50.00 USD
Equity:Opening-Balances 80.00 USD
2022-01-05 * "Refund"
Assets:BCM:Negative 10.00 USD
Equity:Opening-Balances -10.00 USD
2022-01-09 balance Assets:BCM:Positive 70.00 USD
2022-01-09 balance Assets:BCM:Negative -20.00 USDbea --file sidebar-demo.beancount check通过。在1月9日开始时,Positive持有100 - 30 = 70 USD;Negative持有20 - 50 + 10 = -20 USD。
在标准Fava的查询页面中运行此查询,并清除全局过滤器:
SELECT account, currency, SUM(number) AS ending_balance
FROM postings
WHERE account ~ ':BCM:'
AND date < 2022-01-09
GROUP BY account, currency
HAVING SUM(number) < 0
ORDER BY account, currency;| 账户 | 货币 | 期末余额 |
|---|---|---|
| Assets:BCM:Negative | USD | -20.00 |
详细说明:
WHERE选择要汇总的分录。没有较低日期界限:期末余额需要所有更早的历史记录,包括12月1日的期初余额。排他性上限包括1月8日,排除1月9日的交易。
GROUP BY account, currency保持不同商品分开。HAVING SUM(number) < 0在汇总每个组的正负数量之后进行过滤。这是每种货币的期末单位余额,而不是转换为一货币的市场价值。它报告每个确切的账户,而不是汇总的父账户。
为了比较,以下可执行查询回答了一个不同的问题:在审查窗口期间,有多少金额被记为负数?
SELECT account, currency, SUM(number) AS negative_postings
FROM postings
WHERE account ~ ':BCM:'
AND number < 0
AND date >= 2021-12-09 AND date < 2022-01-09
GROUP BY account, currency
ORDER BY account, currency;| 账户 | 货币 | 负分录 |
|---|---|---|
| Assets:BCM:Negative | USD | -50.00 |
| Assets:BCM:Positive | USD | -30.00 |
第二个查询省略了退款和期初余额。其-30.00 USD行并不意味着Positive透支。向第一个查询添加较低日期界限将产生期间内的净变动,而不是期末余额。有关更多查询语法,请参阅BQL参考。
使用场景:
- 检查资产账户是否有意外的负数量。
- 在调查流出或冲销时,单独审查负分录。
- 在将其视为异常之前,将报告余额与期初历史和后续活动进行核对。负的负债或收入余额可能是正常的。
🛠 专业提示:组合链接+查询
Fava确实支持指向查询的链接。将以下保存的查询和快捷方式添加到sidebar-demo.beancount:
2021-01-01 query "negative-balances" "SELECT account, currency, SUM(number) AS ending_balance FROM postings WHERE account ~ ':BCM:' AND date < 2022-01-09 GROUP BY account, currency HAVING SUM(number) < 0 ORDER BY account, currency"
2021-01-01 custom "fava-sidebar-link" "Negative Balances" "/sidebar-demo/query/?query_string=.run+%22negative-balances%22"查询指令也出现在Fava的已保存查询侧边栏中,受sidebar-show-queries(默认5)约束。显式快捷方式针对固定数据的sidebar-demoslug并运行命名查询。标准查询页面从URL读取query_string;其查询API在本地测试中返回了相同的单行-20.00 USD。请参阅版本化的查询组件。
在不同的账簿中使用你账本的实际slug。在/books挂载下,快捷方式变为/books/sidebar-demo/query/?query_string=.run+%22negative-balances%22。保持全局过滤器清除以获得完整历史的期末余额;日期过滤器可以在保存的查询运行之前移除期初历史。
最终想法
使用月份快捷方式导航报告,并使用保存的查询检查可重现的期末余额。在审查你的预算时,在解释负数之前区分流出、期间变动和期末余额。有关其他报告,请参阅Fava的扩展文档和UI指南。