Workstation Logo
产品
AI 实验室OpenAI代理Claude 代理Grok BotWorkstation CRM (WSL CRM)营销全部产品
AI 解决方案
AI 工作站AI SME Packages私有 AIGPU 集群边缘 AI企业 AI 实验室按行业分类的 AI
服务
Platform ModernisationDigital EngineeringData Foundations & AIAutonomous OperationsAI 咨询DevOps 自动化网络安全软件开发智能体构建MLOps 搭建
关于我们
合作伙伴客户案例
文章
文档
WSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7
博客
联系我们Login
Workstation

面向现代企业的 AI 工作站、AI 多智能体软件、GPU 基础设施和智能代理解决方案。

联系我们

AI 解决方案

AI 工作站AI SME Packages私有 AIGPU 集群边缘 AI企业 AI 实验室按行业分类的 AI

产品

全部产品WSL CRM 与 ERP营销OpenAI代理WSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7

公司

关于我们为什么选择Workstation合作伙伴客户案例价格联系

资源

文章文档博客搜索网站地图
英国办公室
77-79 Marlowes, Hemel Hempstead HP1 1LF路线指引 — 从 M25 外环伦敦 20 号出口驶出公司编号: 11641870周一至周五:上午 9:00 - 下午 6:00 GMT
+44 7515 356 146
比利时办公室
Workstation SRL, Rue Vanderkindere 34, 1180 Uccle, BrusselsBE 0751.518.683周一至周五:上午 9:00 - 下午 6:00 CET
+32 492 45 67 46
印度办公室
#159 Sector 9, Pocket 1, DDA Flats, 110077 Dwarka, New Delhi
+91 98881 98841

© 2026 Workstation AI。保留所有权利。

隐私Cookie服务条款网站地图
Home / Articles / Technology
AI会计Python自动化

使用发票和费用数据库中的 Claude Code 构建 VAT 退货系统

从 Postgres 发票 + 费用 DB 到 HMRC Box 1 到 9:提示、确定性 Python 引擎、OAuth2 MTD 提交和边缘情况(英国脱欧、NI 协议、反向收费、部分豁免、统一费率、多货币、贷方票据)

May 16, 2026Technology6 min read

这是长篇深入探讨。如需更快、略读的版本,请参阅 同伴博客文章.

VAT 从发票和费用保障中返回 Claude Code

1. 为什么我要构建这个

每家应税营业额超过 VAT 注册门槛的英国小型企业都必须通过 HMRC 的 Making Tax Digital (MTD) 服务计算并提交 VAT 申报表(通常每季度一次)。九个编号的盒子。输出 VAT 减去输入 VAT。支付净额,或要求退款。理论上很容易;当您的发票位于 Postgres 中、您的费用收据是来自 20 个不同供应商的 PDF、您的银行对账单是来自 Wise 和 Revolut 的 CSV、您的外币行必须以正确的每月汇率以英镑重新表述时,这在实践中是一种惩罚。

几年来,我一直在应付一个巨大的电子表格、一个日历提醒和一个小小的信仰飞跃。每个季度大约需要半天时间,其中大部分是数据整理 - 从发票数据库导出 CSV,粘贴到 Excel,手动分类几百行,仔细检查公式,将九个数字复制到第三方 MTD 桥,然后单击“提交”。审计线索是“相信我,我有一个电子表格”。季度中期的利率变化打破了这一局面。收据不见了。一个错误的分类可能会推动 Box 5 减少了数百英镑。

我今年将管道重建为小型 Claude Code 我的项目直接与我的发票和费用数据库对话,对每一行进行分类,使用确定性 Python 引擎计算 Box 1 到 Box 9,以 Markdown 报告的形式对报表进行空运行,只有在人工签核后才提交到 HMRC MTD。现在整个季度大约需要我一个小时,其中大部分时间是与我的会计师一起审查预演。审计跟踪是一个 git 存储库。数学是经过单元测试的。分类器是一个记录的 Markdown 文件。提交已被限制。

本文为长版。提示、Python、模式、HMRC OAuth 流程、边缘情况。如果您首先想要简短版本,请阅读 同伴博客.

2. HMRC MTD 底漆(及免责声明)

VAT 的 Making Tax Digital 是 HMRC 的要求,即 VAT 注册企业保留数字记录并通过记录的 API 通过兼容软件提交申报表,而不是在 gov.uk 网络表格中输入数字。 API 是 OAuth2,需要识别原始设备的防欺诈 HTTP 标头,并且在您接触现场制作之前可以在免费沙箱中使用。

回报本身是九个盒子:Box 1 是因销售和其他产出而产生的 VAT; Box 2 是因从欧盟成员国采购商品而产生的 VAT(与 NI 协议下的北爱尔兰企业相关); Box 3 是到期的 VAT 总额(Box 1 + Box 2); Box 4是购买时可回收的VAT(输入VAT); Box 5为支付或回收的净VAT(Box 3 - Box 4); Box 6 是不包括 VAT 的总销售额; Box 7是不包括VAT的总购买量; Box 8 是供应给欧盟成员国的商品总价值(同样仅限 NI); Box 9 是从欧盟成员国收购的总价值(仅限 NI)。有多种方案变体 - 统一费率方案、现金会计、年度会计 - 这些都会发生变化 如何 你得到了数字,但没有得到盒子的形状。

免责声明。 我是一名软件工程师,而不是一名特许会计师。这篇文章是 不是税务建议。 VAT 分类、部分豁免、统一费率计划、数字服务的供应地规则、英国脱欧后欧盟商品和服务的处理以及 NI 协议的确切规则都会随着时间的推移而变化,并取决于您的具体情况。在针对真实的 HMRC 帐户运行此类操作之前,请让一位英国注册会计师对您的第一份报表进行端到端审核。有关任何特定边缘情况的权威规则,请参阅 HMRC VAT 通知 700 以及 gov.uk 网站上的相关通知。会计师一小时的时间成本比一次错误提交的成本要小得多。

3. 数据模型

下游的一切都取决于两个表的形状:开具的发票(销售)和记录的费用(采购)。我将我的保留在 Postgres 中,但相同的形状也适用于 MySQL 或 SQLite。最小有用模式:

CREATE TABLE invoices (
  id              BIGSERIAL PRIMARY KEY,
  invoice_number  TEXT NOT NULL UNIQUE,
  issued_at       DATE NOT NULL,
  customer_name   TEXT NOT NULL,
  customer_vat_no TEXT,
  customer_country CHAR(2) NOT NULL,
  net_amount      NUMERIC(14,2) NOT NULL,
  vat_amount      NUMERIC(14,2) NOT NULL,
  gross_amount    NUMERIC(14,2) NOT NULL,
  currency        CHAR(3) NOT NULL DEFAULT 'GBP',
  fx_rate_to_gbp  NUMERIC(18,8) NOT NULL DEFAULT 1,
  vat_rate        NUMERIC(5,2) NOT NULL,
  vat_treatment   TEXT NOT NULL,
  status          TEXT NOT NULL,
  paid_at         DATE,
  notes           TEXT,
  created_at      TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE expenses (
  id              BIGSERIAL PRIMARY KEY,
  supplier_name   TEXT NOT NULL,
  supplier_vat_no TEXT,
  supplier_country CHAR(2) NOT NULL,
  incurred_at     DATE NOT NULL,
  net_amount      NUMERIC(14,2) NOT NULL,
  vat_amount      NUMERIC(14,2) NOT NULL,
  gross_amount    NUMERIC(14,2) NOT NULL,
  currency        CHAR(3) NOT NULL DEFAULT 'GBP',
  fx_rate_to_gbp  NUMERIC(18,8) NOT NULL DEFAULT 1,
  vat_rate        NUMERIC(5,2) NOT NULL,
  vat_treatment   TEXT NOT NULL,
  category        TEXT NOT NULL,
  receipt_url     TEXT,
  notes           TEXT,
  created_at      TIMESTAMPTZ NOT NULL DEFAULT now()
);

不明显的列是 vat_treatment, fx_rate_to_gbp,以及国家/地区代码。 Treatment 是分类器和引擎都使用的一个小枚举;国家代码驱动反向收费和欧盟收购逻辑;汇率允许您将外币发票保留为其原始货币,并仍以 GBP 重新说明箱内总计。

柱子 目的 使用者
vat_treatment标准/减少/零/豁免/范围外/反向收费/欧盟商品/欧盟服务/推迟进口分类器+引擎
vat_rate0.00、5.00、20.00(或方案特定利率)引擎+校验和
currency + fx_rate_to_gbp多币种重结单标准化器
customer_country / supplier_country反向充电、NI 协议、供应地分类器
paid_at现金会计计划分行引擎

将这些列回填到旧发票表中是项目中最慢的部分。 Claude Code可以生成迁移;您仍然需要对尴尬的边缘情况进行手动分类。

4. 为什么选择 Claude Code(而不是 Xero / QuickBooks / FreeAgent)

对于大多数英国小型企业来说,答案是真正使用打包软件。 Xero、QuickBooks、FreeAgent、Sage 都拥有经过 HMRC 认证的 MTD 提交、不错的 UI 以及已经了解它们的会计师。除非有明确的理由,否则您不应该推出自己的 VAT 系统。

我的理由虽然狭隘但却真实。我已经每天使用 Claude Code 进行软件工作,因此将它用于 VAT 的边际努力很小。我的发票数据库位于我自己的机器上;我不希望将其镜像到 SaaS 租户中。我的供应商组合很尴尬(带有反向收费的欧盟服务、延迟导入 VAT、偶尔的零税率边缘情况),并且将规则编码在单个 Markdown 文件和 Python 模块中,结果比配置 SaaS 来处理它们更快。我从 git 存储库获得的审计跟踪 - 每个分类器提示、每个差异、每个签名的周期快照 - 正是我想要的审计跟踪。

Claude Code 非常适合于此,原因有三个。首先,它直接针对磁盘上的项目工作:它可以读取我的架构、上一季度的试运行报告、规则文件和 Python 引擎,并在上下文中提出编辑建议。其次,它擅长枯燥的脚手架——迁移脚本、CSV 导入器、协调报告、pytest 固定装置。第三,当它对一行进行分类时,它会用简单的英语解释其推理,这正是我在签署申报表之前想要查看的内容。下面工作流程图底部的决策矩阵是这种权衡的诚实版本。

5. 架构和工作流程

VAT 返回 Claude Code 工作流程 - 来源、摄取、分类、VAT 引擎、提交、审核通道以及决策矩阵

该管道有五个泳道。 来源 是对发票和费用表的只读访问权限,以及来自 Stripe、Wise 和银行源的 CSV 的放置文件夹。 摄取+标准化 是 Claude 生成的一个小型 Python 脚本,它将每个源模式映射到一个规范视图,以 HMRC 月汇率将外币转换为 GBP,应用日期范围过滤器,并使用幂等标记每一行 run_key 所以重新运行是安全的。 分类+协调 是 Claude Code 分类器:它遍历每个规范行,选择一个 vat_treatment 使用规则从记录的枚举中 vat-rules.md,核对发票与付款,并标记异常(负净值、缺少供应商 VAT 编号、国家/地区代码不匹配、应注册但未注册的供应商)。 VAT发动机 是一个纯Python模块,它读取分类行并确定性地计算Box 1到Box 9;统一费率、现金和年度计划分支是明确的代码路径。 提交+审核 是 HMRC MTD API 调用(OAuth2、欺诈预防标头、沙箱优先),在人工批准步骤后面进行门控,将签名的周期快照和完整的分类器日志写入仅附加审核文件夹,保留六年。

6. 使用 Claude Code 逐步构建

这是我实际使用的工作流程。五个提示。我为这篇文章清理了它们;原件更加混乱。

提示 1 - 标准化器。 “看看 invoices 和 expenses 表在 schema.sql。生成Python模块 normalise.py 使用读取两个表 psycopg (只读角色 vat_reader), 限制为日期范围 2026-01-01 到 2026-03-31,并发出带有键的规范字典列表: id, source, date, party, gross, net, vat_amount, vat_rate, vat_treatment, country, currency, fx_rate, run_key。使用 Decimal,不浮动。包括文档字符串和 __main__ 打印摘要的块。”

克劳德返回了一个干净的模块 Decimal,参数化 SQL,a build_run_key() 将(period_start、period_end、scheme、schema_version)散列成稳定的十六进制字符串和基于Click的CLI。我编辑了两个字段名称并接受了其余的。

提示 2 - 分类器。 “读 vat-rules.md 并写 classify.py。对于每个规范行 normalise.py, 放 vat_treatment 至以下之一: 标准, 减少, 零, 豁免, 范围外, 反向充电, 欧盟商品, 欧盟服务, 推迟进口。如果该行已经有一个非空 vat_treatment,保留它并将其记录为 保留。否则,从国家代码、供应商VAT编号、类别和金额中决定,并写一句话 reason 在每一行上。异常情况(负净值、英国供应商缺少供应商 VAT 高于注册阈值、国家/地区不匹配)将转至单独的部门 anomalies.json 供人工审查。不要改变源数据库。”

分类器本身是一个小型的、主要基于规则的函数,具有一个 LLM 支持的分支,用于处理不明确的费用类别。重要的是,它永远不会写入源数据库 - 它会发出引擎读取的分类 JSON 文件。如果我不同意某个分类,我会编辑 JSON;下一次试运行就会发现这一点。

提示 3 - 引擎。 “写 engine.py 作为纯函数: def compute_boxes(rows: list[Row], scheme: Scheme) -> BoxTotals。无输入/输出。没有 LLM。 BoxTotals 是一个冻结数据类,其中 Box 1 到 Box 9 为 Decimal 值为 2 dp。添加显式分支 standard, flat_rate, cash, 和 annual 计划。标准方案为权责发生制:销售VAT贡献Box 1,购买VAT贡献Box 4。反向收费发票添加到 Box 1 和 Box 4 中。推迟导入 VAT 会添加到 Box 1 和 Box 4 中。欧盟对 NI 业务的收购将纳入 Box 2 和 Box 9。按框总数舍入,而不是按行舍入。编写一个文档,将每个分支与其规则联系起来。”

提示 4 - 试运行报告。 “写 dryrun.py 那个叫 compute_boxes() 并发出 Markdown 报告:带有句点和方案的标题、带有规范标签的 Box 1 到 Box 9 的表格、每个分类器存储桶的一个部分(按总数列出前 10 行)、异常部分以及带有 run_key 以及分类 JSON 的 SHA-256。保存到 ./audit/<period>/dryrun.md."

提示 5 - 提交者。 “写 submit.py 与 HMRC MTD VAT API v1.0 对比。将 OAuth2 授权代码流程与 PKCE 结合使用。从中读取访问令牌 ~/.vat/token.json;如果过期就刷新。 HMRC 记录的必需的防欺诈标头;把他们从 fraud_headers.py。默认为沙箱 https://test-api.service.hmrc.gov.uk。步骤: GET /organisations/vat/{vrn}/obligations?status=O,找到匹配的周期,通过显示空运行摘要提示操作员确认,然后 POST /organisations/vat/{vrn}/returns 和 finalised: true。打印 receiptId。切勿致电现场直播,除非 HMRC_ENV=live 已设置并且运算符类型 提交."

五个提示、四个文件和一个小的 Markdown 规则文档。总构建时间可能是一周的集中晚上,其中大部分是分类器规则和 HMRC OAuth 舞蹈。

7.VAT引擎

发动机是故意无聊的部分。它是一个纯函数,带有单元测试,没有人工智能。这是实际的形状:

from dataclasses import dataclass
from decimal import Decimal, ROUND_HALF_UP

D2 = Decimal("0.01")

@dataclass(frozen=True)
class BoxTotals:
    box1: Decimal
    box2: Decimal
    box3: Decimal
    box4: Decimal
    box5: Decimal
    box6: Decimal
    box7: Decimal
    box8: Decimal
    box9: Decimal

def _q(x: Decimal) -> Decimal:
    return x.quantize(D2, rounding=ROUND_HALF_UP)

def compute_boxes(rows, scheme="standard", is_ni_business=False) -> BoxTotals:
    box1 = box2 = box4 = Decimal(0)
    box6 = box7 = box8 = box9 = Decimal(0)

    for r in rows:
        gbp_net = r.net * r.fx_rate
        gbp_vat = r.vat_amount * r.fx_rate

        if r.source == "invoice":
            box6 += gbp_net
            if r.vat_treatment in ("standard", "reduced"):
                box1 += gbp_vat
            elif r.vat_treatment == "eu-goods" and is_ni_business:
                box8 += gbp_net
        else:
            box7 += gbp_net
            if r.vat_treatment in ("standard", "reduced"):
                box4 += gbp_vat
            elif r.vat_treatment == "reverse-charge":
                notional = gbp_net * (r.vat_rate / Decimal(100))
                box1 += notional
                box4 += notional
            elif r.vat_treatment == "postponed-import":
                notional = gbp_net * (r.vat_rate / Decimal(100))
                box1 += notional
                box4 += notional
            elif r.vat_treatment == "eu-goods" and is_ni_business:
                notional = gbp_net * (r.vat_rate / Decimal(100))
                box2 += notional
                box4 += notional
                box9 += gbp_net

    box3 = box1 + box2
    box5 = box3 - box4
    return BoxTotals(
        _q(box1), _q(box2), _q(box3), _q(box4), _q(box5),
        _q(box6), _q(box7), _q(box8), _q(box9),
    )

有两件事需要注意。首先,每个盒子的总数在最后被量化一次。每行舍入泄漏几分,HMRC 对于不协调的总数是不可原谅的。其次,引擎是完全确定性的:每次都有相同的输入、相同的输出。这就是让我对其进行单元测试并信任试运行的属性。

def test_simple_quarter():
    rows = [
        Row("invoice", net=Decimal("24500.00"), vat_amount=Decimal("4900.00"),
            vat_rate=Decimal("20"), vat_treatment="standard", fx_rate=Decimal(1), source="invoice"),
        Row("expense", net=Decimal("3000.00"), vat_amount=Decimal("600.00"),
            vat_rate=Decimal("20"), vat_treatment="standard", fx_rate=Decimal(1), source="expense"),
    ]
    t = compute_boxes(rows)
    assert t.box1 == Decimal("4900.00")
    assert t.box4 == Decimal("600.00")
    assert t.box5 == Decimal("4300.00")
    assert t.box6 == Decimal("24500.00")
    assert t.box7 == Decimal("3000.00")

有了这个,每个回归都会在触及试运行报告之前被 CI 捕获。 Claude可以帮我写更多的测试;如果没有通过这些测试,它就无法更改发动机。

8. 演示视频

下面是针对一个季度的真实(匿名)发票和费用数据库端到端运行的管道的简短演练:规范化、分类、试运行,然后提交沙箱 MTD。整个循环只需几分钟。

9. HMRC MTD提交

这是大多数文章所掩盖的部分。 MTD VAT API 本身有详细的文档记录并且免费,但在致电之前您需要做好三件事 POST returns.

OAuth2 和代币。 在 HMRC 开发者中心注册应用程序;您将获得一个客户端 ID、一个客户端密钥和一个重定向 URI。流程是使用 PKCE 的授权代码:打开浏览器到 HMRC 同意页面,用户使用其政府网关凭据登录,并根据其 VAT 注册号 (VRN) 授权您的应用程序,HMRC 使用授权代码重定向回来,您将其交换为访问令牌 + 刷新令牌。使用合理的权限将它们缓存在磁盘上。访问令牌是短暂的;刷新令牌更长。

防欺诈标头。 HMRC 需要一组记录在案的 HTTP 标头,用于识别每个 API 调用上的原始设备:时区、屏幕几何形状、用户 ID、公共 IP、MAC 地址、客户端连接方法等。确切的列表和格式位于 HMRC 开发人员文档中(请参阅 HMRC VAT 通知 700 以及权威规则的相关防欺诈规范)。如果他们错了,你就会得到一个 403 有一个模糊的错误。如果他们正确的话,电话就会接通。我把它们留在里面 fraud_headers.py 并在测试中断言它们的存在。

首先是沙盒。 HMRC 提供免费沙箱 test-api.service.hmrc.gov.uk 具有存根 VRN 和存根义务。针对沙箱端到端运行整个管道,直到您提交虚假退货、收到虚假收据 ID 并确认您的义务转移。只有这样你才会翻转 HMRC_ENV=live。我的提交者拒绝调用 live,除非设置了环境变量并且操作员键入 SUBMIT 在提示符下。没有自动执行路径。一次错误的实时提交的成本远高于多一次沙箱迭代的成本。

实际的快乐路径调用很短: GET obligations 和 status=O 找到开启时间段,显示试运行报告,提示操作人员确认,然后 POST returns 与九个盒子号码, periodKey 来自义务,并且 finalised: true。保存响应,将收据 ID 写入审核文件夹,然后就完成了。

10. 安全、审计和合规性

我不会继续的三个规则。第一的, 克劳德不参加算术。分类器建议处理方法,LLM 可以编辑 Python 和规则,但框总数是由带有单元测试的纯函数生成的。 “人工智能做到了”并不是 MTD 下的辩护理由。第二, 每个提交都由人类控制。试运行报告是签字的事实来源。如果我无法解释分类行和引擎代码中的数字,我不会提交。第三, 审计跟踪仅是附加的。每个分类的 JSON、每个试运行报告、每个提示、每个差异以及该期间的最终 HMRC 收据 ID 都写入 ./audit/<period>/ 并致力于私人 git 存储库。 HMRC需要六年的记录;我的是签名快照。

即使您不采用其余的做法,我也会推荐另外两种做法。以最低权限只读角色运行源数据库连接:否 UPDATE, 不 DELETE, 不 DROP。使用机密管理器或主目录中的 0600 文件将 HMRC 客户端机密和访问令牌保留在存储库之外。重点是通过建设,而不仅仅是通过政策,来杜绝事故发生。

11. 边缘情况

VAT 是一种受监管的税种,自 1973 年以来历届英国政府都对其进行了编辑,其中包括英国脱欧后的叠加税和北爱尔兰协议。边缘情况是真实的。我的引擎处理的非详尽列表:

  • 英国脱欧和北爱尔兰。 英国企业不再填写 Box 8 或 Box 9。 NI 企业仍然在 NI 协议下从事商品(而非服务)业务。发动机需要 is_ni_business 作为参数并相应地分支。权威规则参见HMRC VAT公告700。
  • 反向充电。 从英国境外的供应商购买的服务(以及某些国内建筑行业服务)按反向收费进行会计处理:您将名义输出 VAT 添加到 Box 1,并在 Box 4 中收回相同金额。对现金的净影响为零;对回报的净影响是两个盒子一起移动。
  • 推迟进口 VAT。 对于从英国境外进口的商品,您可以将进口 VAT 推迟到下次退货,而不是在边境付款。该处理看起来类似于退货时的反向充电。
  • 部分豁免。 如果您同时生产应税供应品和免税供应品,则您只能回收与应税供应品相关的输入 VAT。有标准方法和特殊方法;这是最经常需要会计的角落。不要尝试在 Markdown 文件中编码部分豁免规则。
  • 统一费率计划。 您按标准费率收取 VAT,但按总营业额的固定百分比向 HMRC 支付费用,并且您通常无法收回投入的 VAT。引擎为此有一个单独的分支,并忽略大部分每行分类。
  • 多币种发票。 按照相关日期有效的汇率将每一行转换为 GBP。 HMRC公布月平均费率;您也可以使用即期汇率。保持一致。这 fx_rate_to_gbp 列存储每行应用的实际费率。
  • 信用票据。 贷方票据是负发票。它减少了 Box 1 和 Box 6(如果是购买积分,则减少 Box 4 和 Box 7)。确保您的 net_amount 和 vat_amount 可能会变成负数并且引擎正确地求和它们。
  • 定金和分期付款。 纳税点可能是收到押金时,而不是开具最终发票时。现金会计可以简化这一过程。
  • 季度中期利率变化。 历史上罕见,但有可能。存储每行的速率,而不是作为全局常量。

12. 费用

诚实的数字。 构建时间 大约是一周的集中晚上——称之为 25 到 30 个小时。其中大部分是模式规范化、分类器规则和编写引擎测试; HMRC OAuth 舞蹈是第二大块。 每季度运行成本 很小:我现有的 Claude Code 订阅(已经为其他软件工作付费),分类器令牌使用量只有几美分,HMRC API 的费用为零。引擎和审核日志在我的 Mac 上本地运行。 每季度审稿人时间 大约一个小时,大部分时间都是和我的会计师一起阅读试运行。与旧工作流程下大约半天的电子表格争论相比,节省的时间可以在第一年内收回构建成本。

如果你将其定价为一个你付钱给别人建造的项目,那么你的咨询费大约会达到四位数——这就是为什么每月 20 到 50 英镑的打包 SaaS 几乎总是大多数企业的正确答案。有趣的问题不是“这比 Xero 便宜吗?” - 通常不是 - 但“它是否更准确、更可审计、更容易让我推理?”。对我来说,答案是肯定的。

13. 接下来是什么以及结论

我要添加的下一部分是:自动银行馈送导入(开放银行 AISP)、供应商 PDF 的 OCR(使收据 URL 成为实际扫描行)、预定的 cron + Slack 批准流程(这样我不必记住截止日期)以及市场卖家的自助计费扩展。这些都不会改变管道的核心形状。它们都是同一张五车道图上的装饰。

至少对我来说,更大的教训是,一个小型 Claude Code 项目如何很好地处理受监管工作流程中无聊的一半。无聊的一半是大部分工作:模式标准化、CSV 导入器、协调报告、固定装置、边缘情况规则、审计日志记录。克劳德在这一切方面都很出色。确定性的一半——实际的数学、实际的提交——保留在带有单元测试和人工审批门的普通 Python 中,这正是它所属的地方。

再次免责声明。 本文不是税务建议。在您在真实的 HMRC 账户上进行此类操作之前,请让一位英国注册会计师对您的第一份报表进行端到端审核。运行 HMRC MTD 沙箱,直到您和您的会计师都充满信心。有关任何特定 VAT 治疗的权威规则,请参阅 HMRC VAT 通知 700 以及 gov.uk 网站上的相关通知。如果您想要所有这些的简短版本, 同伴博客文章 五分钟阅读;否则,请订阅,随着堆栈的成熟,我将继续写作。


本文的 SEO 快照

  • 搜索引擎优化标题: 使用 Claude Code 构建 VAT 返回系统
  • 元描述: 使用 Claude Code 读取您的发票和费用数据库,对 VAT 进行分类,将 HMRC Box 1 计算为 9,试运行,然后提交给 MTD - 确定性引擎,人工批准。
  • 主要关键词: claude-code、增值税、hmrc、mtd、会计、自动化、python、ai-agent、finops、小型企业
  • Twitter / X(280 个字符以下): 将我的英国 VAT 退货重建为 Claude Code 项目:Postgres 发票 + 费用 DB 到 HMRC Box 1 到 9、确定性 Python 引擎、沙箱优先 MTD 提交、人工审批门。完整的文章 + 工作流程 SVG + 演示视频。不是税务建议。 #ClaudeCode #VAT #HMRC #MTD
  • 领英帖子: 今年,我将英国 VAT 季度回报重建为一个小型 Claude Code 项目。它以只读方式读取我的发票和费用数据库,使用记录的规则文件按 VAT 处理对每一行进行分类,使用确定性 Python 引擎将 HMRC Box 1 计算为 9(算术中没有 LLM),并且只有在我签署试运行后,它才会通过 HMRC MTD API 提交 - 沙箱优先、防欺诈标头、完整的 OAuth2 流程。现在整个季度大约需要一个小时。 Workstation 上有完整的文章,包括提示、模式、引擎代码、边缘案例和诚实的成本故事。不是税务建议;让会计师审查您的第一份申报表。

Watch

使用发票和费用数据库中的 Claude Code 构建 VAT 退货系统
Click to open in new window
Share this article

More in Technology

Jobshout SEO Analyst AI Agent — Analyse Any Website & Fix SEO Issues Automatically

Jobshout SEO Analyst AI Agent — Analyse Any Website & Fix SEO Issues Automatically

Technical brief: SEO Analyst modes, real workstation.co.uk run (score 44), findings with fix prompts, Improve/Publish paths, and Jobshout supervised agents

Read more
WSLVault: Steal the Server. Not the Secrets.

WSLVault: Steal the Server. Not the Secrets.

Technical brief: AES-256-GCM envelope hierarchy, cryptographic tenant isolation, engines, identity/MFA, active/active regions, Kubernetes deploy, and video chapters

Read more
Workstation WSL Proxy — Docker Image Optimisation, Build Cache, Full Deploy Workflow, and Shipping It with AI Assistance

Workstation WSL Proxy — Docker Image Optimisation, Build Cache, Full Deploy Workflow, and Shipping It with AI Assistance

Technical brief: prebuilt OpenResty Dockerfile, Buildx/GHA cache, Ansible extract, delivery pipeline DEPLOY_MODE, and an operator+agent loop for finishing pipeline work

Read more