跳转到主要内容

在 Beancount 中记录税务(实用主义之道)

发布日期 最后更新 阅读需 3 分钟Mike ThriftMike Thrift
在 Beancount 中记录税务(实用主义之道)

税务在个人理财领域常常被视为一种特殊而复杂的难题。但如果它们不是呢?如果你能像处理账簿中任何其他资金流一样对待它们,会怎样?好消息是:你可以。通过将税务视为简单的价值流动,你的 Beancount 账簿将保持整洁、易于查询,并且——最重要的是——易于理解。

以下是一种实用、直接的模式,你可以将其直接用于个人或小型企业的 Beancount 文件中。这是一个处理工资单、纳税甚至跨年退税的简单系统。我们将介绍你需要的核心账户,通过实际示例进行讲解,并展示确切的查询语句以获得你需要的答案。


核心原则

在我们深入研究代码之前,让我们先达成几个简单的共识。这些原则有助于保持逻辑清晰并避免未来的麻烦。

  • 将“它是什么”与“现金何时流动”分开。 🗓️ 这是最重要的概念。一项税务支出属于你赚取收入的年份(例如 2024 年),即使你在 2025 年 4 月才向税务局缴清这笔款项。如果你不将支出的时间与现金支付的时间分开,你的逐年报告将会变得混乱且具有误导性。

  • 保持你的账户层级简单乏味。 📁 根据税务_类型_(例如 IncomeTaxSocialSecurity)清晰地命名你的账户。这将使你的查询变得极其简单。不要在账户名称中混入供应商名称或“W-2”、“1099”等表格编号;将这些细节放在元数据和标签中。

  • 在年末调整中采用权责发生制。 ⚖️ 即使对于个人账簿,在年末使用简单的应计条目也是使报告准确的最清晰方法。这意味着在正确的年份确认一项支出或退税,即使资金直到下一年才流动。这是一个小的额外步骤,可以避免你日后费尽心思。

  • 为未来的自己而写。 🧠 你的目标是清晰。只有在确实使查询更简单时,才在账户名称中添加额外的细节(例如纳税年度)。除非有令人信服的理由,否则避免每年创建一套新的账户(Expenses:Taxes:2024:FederalExpenses:Taxes:2025:Federal 等)。扁平结构通常更易于管理。


最小账户框架

以下是一组基本的账户,可助你入门。此结构以美国为中心,但你可以轻松地根据你所在国家的税收制度调整名称。只需将这些 open 指令放入你的 Beancount 文件中。

; --- 美国联邦所得税与工资税 ---
; 用于从你工资中预扣的税款
2024-01-01 open Expenses:Taxes:Federal:IncomeTax:Withheld       USD
; 用于你直接支付的预估税款或报税日账单
2024-01-01 open Expenses:Taxes:Federal:IncomeTax:Payments       USD
; 用于你收到的退税
2024-01-01 open Expenses:Taxes:Federal:IncomeTax:Refunds        USD
 
; 你的 FICA 缴款
2024-01-01 open Expenses:Taxes:Federal:SocialSecurity           USD
2024-01-01 open Expenses:Taxes:Federal:Medicare                 USD
 
; --- 其他常见税种 ---
; 用于你在购买时支付的销售税/使用税
2024-01-01 open Expenses:Taxes:Sales                            USD
 
; --- 年末调整账户(可选但推荐!) ---
; 用于你尚未缴纳的应缴税款的临时持有账户
2024-01-01 open Liabilities:AccruedTaxes:Federal:Income         USD
; 用于你尚未收到的应退税款的临时持有账户
2024-01-01 open Assets:Tax:Receivable                           USD

此设置将预扣税款与直接支付和退税分开,使你能够轻松了解资金去向。LiabilitiesAssets 账户是我们在年底保持报告准确的秘密武器。


示例 1:工资单

让我们记录一张典型的工资单,其中税款被自动预扣。关键是首先记录你的总收入,然后显示其在税款和实际到达你银行账户的现金之间是如何分配的。

2025-07-15 * "Employer Inc." "7 月上半月工资"
  Income:Work:Salary                                  -6,000.00 USD
  Expenses:Taxes:Federal:IncomeTax:Withheld             1,200.00 USD
  Expenses:Taxes:Federal:SocialSecurity                   372.00 USD
  Expenses:Taxes:Federal:Medicare                          87.00 USD
  Assets:Cash:Checking                                  4,341.00 USD

这笔单一交易讲述了完整的故事:

  • 你赚取了 $6,000 的总收入。
  • 其中 $1,200 被发送给 IRS 用于联邦所得税。
  • $372 用于社会保障,$87 用于医疗保险。
  • 剩余的 $4,341 是你的实得工资。

专业提示: 你可以将工资单上的元数据(例如 pay_period_end: "2025-07-15")附加到交易中,以便轻松进行审计跟踪。


示例 2:申报纳税申报表(跨年问题)

这是一个让许多人困惑的场景:现在是 2025 年 4 月,你正在申报 2024 年的税款。你发现在所有预扣之后,你仍需额外支付 $3,000

你如何记录这笔费用?你希望这笔支出计入 2024 年,但现金支付发生在 2025 年。以下是两种很好的处理方法。

选项 A:手动两步应计法

此方法是纯 Beancount 操作,无需插件。这是一个清晰的两步过程。

第 1 步:在纳税年度结束时确认支出。 在 2024 年的最后一天,你创建一个“调整”条目。此时没有现金流动;你只是在确认支出并将其暂存于临时负债账户中。

2024-12-31 * "2024 年联邦所得税调整"
  Expenses:Taxes:Federal:IncomeTax:Payments             3,000.00 USD
  Liabilities:AccruedTaxes:Federal:Income             -3,000.00 USD

现在,你的 2024 年损益表正确显示了这笔 $3,000 的支出。

第 2 步:在实际支付时记录现金支付。 在 2025 年 4 月,当你实际将款项发送给 IRS 时,你会结清该负债。

2025-04-15 * "IRS" "支付 2024 年税款"
  Liabilities:AccruedTaxes:Federal:Income              3,000.00 USD
  Assets:Cash:Checking                                -3,000.00 USD

你的 2024 年报告是正确的,你的 2025 年现金流也是正确的。完美!同样的模式也适用于退税,只需使用 Assets:Tax:Receivable 而不是负债账户。

选项 B:使用插件自动化

如果你希望将支付保留在单笔交易中,一个名为 beancount_reds_plugins.effective_date 的优秀社区插件可以提供帮助。它允许你为单个条目分配不同的“生效日期”。

首先,在你的主 Beancount 文件中启用插件: plugin "beancount_reds_plugins.effective_date"

现在,你可以编写一个单笔交易。该插件将在后台自动拆分,以确保你的报告准确。

; 单一条目;插件处理其余部分
2025-04-15 * "IRS" "支付 2024 年税款"
  Assets:Cash:Checking                                 -3,000.00 USD
  Expenses:Taxes:Federal:IncomeTax:Payments             3,000.00 USD
    effective_date: 2024-12-31

在此,现金部分记录于 2025 年 4 月 15 日,但支出部分被追溯至 2024 年 12 月 31 日。它通过与选项 A 不同的工作流程实现了相同的结果。


那销售税呢?

对于大多数个人账簿,销售税很简单。如果你不申请退还,只需在购买时将其作为单独的支出拆分出来。

2025-07-19 * "本地杂货店"
  Expenses:Groceries                                      12.32 USD
  Expenses:Taxes:Sales                                     1.28 USD
  Assets:Cash:Checking                                   -13.60 USD

这使你可以轻松跟踪一年中在销售税上的支出。如果你经营涉及增值税的企业,你将使用带有应付和应收账户的更正式的系统,但原则是相同的。


你会实际运行的查询

这套结构的全部意义在于使获取答案变得容易。以下是一些用于查看税务状况的 BQL 查询。

1. 我在 2024 年的联邦所得税总额是多少?

SELECT cost(sum(position))
WHERE account ~ "Expenses:Taxes:Federal:IncomeTax"
  AND date >= 2024-01-01 AND date < 2025-01-01;

2. 该总额在预扣、支付和退税之间是如何分配的?

SELECT account, cost(sum(position))
WHERE account ~ "Expenses:Taxes:Federal:IncomeTax"
  AND date >= 2024-01-01 AND date < 2025-01-01
GROUP BY account
ORDER BY account;

3. 我是否有任何未清的税务债务或应收款项? (这对于检查你的工作很有用!)

SELECT account, units(sum(position))
WHERE account ~ "Liabilities:AccruedTaxes" OR account ~ "Assets:Tax"
GROUP BY account
ORDER BY account;

如果此查询返回非零余额,则表示你还有未结清的应计项目。


快速问答

  • 我真的需要像 Expenses:Taxes:2024 这样的按年账户吗? 可能不需要。应计法(或插件)可以保持扁平的账户结构清晰易读。仅在你发现按年账户使你的特定查询更容易编写时,才创建它们。

  • Beancount 能为我计算税款吗? 不能直接计算,但它可以准备数据。一些高级用户会编写脚本将 BQL 查询结果导入税务计算软件,这对于在年内估算你的负债非常有用。

  • 这是税务建议吗? 不是。 这是一种用于组织数据的簿记模式。会计是合理的,但你应始终就具体情况咨询税务专业人士。


你的直接采用清单

准备好开始了吗?

  1. 将账户框架 添加到你的 Beancount 文件中(并根据你所在国家调整名称)。
  2. 记录工资单,从总收入开始,并拆分出税务条目。
  3. 在年末,使用负债/资产账户(或使用 effective_date 插件)为任何支付或退税进行应计调整。
  4. 将退税记录为应收款项,并在现金到达时结清。
  5. 运行上述 BQL 查询,在申报前验证你的总额。

保持简单,保持一致,你的税务季节最终将感觉像是你财务故事的另一部分——而不是一个需要解决的谜团。

分享这篇文章