之前介绍过 Ledger CLI,最近也一直在用,坚持了这么久的动力之一就是 Ledger 在某些方面真的比较省事:虽然输入账本显得不那么直观,但纯文本数据结构带来的好处是多种多样的,比如可以批量查找替换来重新设计账本结构,也可以在需要的时候随时创造一个新的账本出来,记录不同需求的账目。

作为命令行工具 (CLI) Ledger 的一个缺点就是方便快捷的数据汇报。最近也是折腾了一下,做了一个 command 工具可以直接展示必要的汇报内容,包括——

  • 资产负债一览
  • 列出未清算账目
  • CAD 现金流 (因为对我而言别的货币和商品的流动性意义不大)
  • 三十天收入和支出比较
  • 支出比重,以及主要支出项目的子类目比重
  • 赊账一览,以及常见朋友的具体赊账流水

基本涵盖了总览、对账和收支分析这些常见的内容了。代码如下——

cd <YOUR_PROJECT_PATH>

PS3='Select Report: '
options=("📈 Net Value" "❓ Uncleared Transactions" "💰 Cash Flow CAD" "🆚 30-day Income vs Expenses" "🌲 Expense Comp" "💁 IOUs" "Quit")

select opt in "${options[@]}"
do
    case $opt in
        "📈 Net Value")
            ledger -f main.ledger -c --effective --no-pager bal ^Asset ^Liabilities
            ;;
        "❓ Uncleared Transactions")
            ledger -f main.ledger print --uncleared
            ;;
        "💰 Cash Flow CAD")
            ledger -f main.ledger -d "d>=[last 30 days]" --no-pager reg ^Asset:Payment ^Liabilities -X $ -D -n
            ;;
        "🆚 30-day Income vs Expenses")
            #ledger -f main.ledger -c --effective --no-pager bal ^Expenses ^Income --depth 3 -X $ -b "last 30 days" -c -S -T
            ledger -f main.ledger -b "last 30 days" -c --effective --no-pager reg ^Expenses ^Income:Be ^Income:Apps -X $ -D -n
            ledger -f main.ledger -b "last 30 days" -c --effective --no-pager bal ^Expenses ^Income:Be ^Income:Apps -X $ -n
            ;;
        "🌲 Expense Comp")
            ledger -f main.ledger -c --effective --no-pager bal ^Expenses --depth 1 -X $ -b "last 30 days" -S -T
            ledger -f main.ledger -c --effective --no-pager bal ^Expenses -% --depth 2 -X $ -b "last 30 days" -S -T
            echo "---"
            ledger -f main.ledger -c --effective --no-pager bal ^Expenses:Food --depth 2 -X $ -b "last 30 days" -S -T
            ledger -f main.ledger -c --effective --no-pager bal ^Expenses:Food -% --depth 3 -X $ -b "last 30 days" -S -T
            echo "---"
            ledger -f main.ledger -c --effective --no-pager bal ^Expenses:Home --depth 2 -X $ -b "last 30 days" -S -T
            ledger -f main.ledger -c --effective --no-pager bal ^Expenses:Home -% --depth 3 -X $ -b "last 30 days" -S -T
            echo "---"
            ledger -f main.ledger -c --effective --no-pager bal ^Expenses:Purchase --depth 2 -X $ -b "last 30 days" -S -T
            ledger -f main.ledger -c --effective --no-pager bal ^Expenses:Purchase -% --depth 3 -X $ -b "last 30 days" -S -T
            ;;
        "💁 IOUs")
            ledger -f main.ledger -c --no-pager bal ^Asset:Receivable
            echo "---"
            ledger -f main.ledger -c --no-pager reg ^Asset:Receivable:Bo -d "d>=[last 30 days]" -S d
            echo "---"
            ledger -f main.ledger -c --no-pager reg ^Asset:Receivable:Xin -d "d>=[last 30 days]" -S d
            ;;
        "Quit")
            break
            ;;
        *) echo "invalid option $REPLY";;
    esac
done