日付付きサイドバーリンクディレクティブを標準の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で起動し、ショートカットをクリックする前にそのJournalレポートを開いてください。
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ヘッダー内のページに戻り、指定されたクエリパラメータを置き換えます。常にJournalレポートを開くわけではありません。貸借対照表では、貸借対照表のままです。この動作は標準Favaリダイレクトハンドラによって実装されています。
- 今月: 現在のレポートに
time=monthを設定します。 - 先月: 現在のレポートに
time=month-1を設定します。 - すべてクリア:
account、time、filterを削除します。換算や間隔などの他のパラメータは残ります。
2021年のフィクスチャには、今月の取引はありません。クエリ結果を再現する前にすべてクリアを使用してください。/jump URLにはリファラーが必要です。ブックマークを直接開いた場合は、代わりに完全な動作レポートURLをコピーしてください。
ホストルートで、/jump?time=monthが/sidebar-demo/journal/?time=2021&account=Assetsからテストされました。同じジャーナルにaccount=Assets&time=monthを付けてHTTP 302を返しました。宛先レポートは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 USDbean-check sidebar-demo.beancountは合格します。1月9日の開始時点で、Positiveは100 - 30 = 70 USDを保持し、Negativeは20 - 50 + 10 = -20 USDを保持します。
標準FavaのQueryページでグローバルフィルターをクリアして、このクエリを実行してください:
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は各グループの正と負の数量を合計した後にフィルタリングします。これは1通貨あたりの最終数量残高であり、1つの通貨に換算された市場価値ではありません。ロールアップされた親勘定科目ではなく、各正確な勘定科目を報告します。
比較のために、この実行可能なクエリは別の質問に答えます: レビュー期間中に負の転記はいくらありましたか?
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 |
2番目のクエリは返金と期首残高を省略します。その-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"クエリディレクティブは、sidebar-show-queries(デフォルト5)に従うFavaの保存済みクエリサイドバーにも表示されます。明示的なショートカットはフィクスチャのsidebar-demoスラッグをターゲットにし、名前付きクエリを実行します。標準クエリページはURLからquery_stringを読み取ります。そのクエリAPIはローカルテストで同じ単一の-20.00 USD行を返しました。バージョン管理されたQueryコンポーネントを参照してください。
別のブックでは実際の台帳スラッグを使用してください。/booksマウントでは、ショートカットは/books/sidebar-demo/query/?query_string=.run+%22negative-balances%22になります。完全な履歴の最終残高にはグローバルフィルターをクリアしたままにしてください。日付フィルターは保存されたクエリが実行される前に期首履歴を削除できます。
最後に
月のショートカットを使用してレポートをナビゲートし、保存されたクエリを使用して再現可能な最終残高を確認してください。予算を確認するときは、負の数を解釈する前に、送金、期間移動、期末残高を区別してください。追加のレポートについては、Favaの拡張機能ドキュメントとUIガイドを参照してください。