商店现已上线

我们打造用于网站、AI 智能体和 LLM 训练的 Workstation AI 机器——在线配置并购买。

获取同行价格
AI 产品
AI 实验室OpenAI 智能体Claude 代理Grok BotWorkstation AI 原生 CRM营销所有产品
AI 解决方案
应用型 AIAI 智能体生成式 AIAI 自动化AI 技能提升中小企业 AI 套餐企业 AI 实验室AI 工作站NVIDIA 硬件与软件NVIDIA 加速计算私有 AIGPU 集群边缘 AI行业 AI
AI 服务
平台现代化数字工程数据基础与 AI自主运营AI 咨询DevOps 自动化网络安全软件开发智能体构建MLOps 搭建GPU 租赁
关于我们
公司我们的故事合作伙伴客户案例
AI 数据中心
AI 洞察Jev 系列基准测试实验室模型选择
技术说明
文档
Linux 操作系统UbuntuRed Hat Enterprise LinuxSUSE LinuxAlpine LinuxDebian, Rocky & AlmaLinux
AI 云平台AWS & Amazon BedrockGoogle Cloud & Vertex AIMicrosoft Azure & AI FoundryGPU 云与算力市场
私有 AI 数据中心面向律师事务所面向会计师事务所本地部署平台全面安全的云
工具Ring PromoterJobshout
新闻
博客
联系我们登录

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

联系我们

AI 解决方案

应用型 AIAI 智能体生成式 AIAI 自动化AI 技能提升中小企业 AI 套餐企业 AI 实验室行业 AI

产品

所有产品Workstation AI native CRM 与 ERP营销OpenAI 智能体Ring PromoterJobshout

公司

关于我们公司AI 数据中心为什么选择Workstation合作伙伴客户案例定价联系TenthMatrix

资源

AI 洞察技术说明文档Linux 操作系统AI 云平台私有 AI 数据中心博客搜索网站地图
英国办公室
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服务条款网站地图

NVIDIA, the NVIDIA logo, RTX, RTX PRO, Blackwell, CUDA, NVLink, MGX, Omniverse, Spectrum-X, Quantum, BlueField, DGX and HGX are trademarks and/or registered trademarks of NVIDIA Corporation in the US and other countries. AMD, the AMD Arrow logo, EPYC, Instinct, Ryzen and Threadripper are trademarks of Advanced Micro Devices, Inc. Dell and PowerEdge are trademarks of Dell Inc. or its subsidiaries. Intel and Xeon are trademarks of Intel Corporation or its subsidiaries. AMAX, AceleMax and LiquidMax are trademarks of AMAX Engineering Corporation. All other product names, logos and brands are the property of their respective owners. We use them only to identify the products we describe, supply or support; their use does not mean their owners endorse us.

首页 / 技术说明 / Technology
AI会计Python自动化

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

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

2026年5月16日Technology6 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 上有完整的文章,包括提示、模式、引擎代码、边缘案例和诚实的成本故事。不是税务建议;让会计师审查您的第一份申报表。

观看

使用发票和费用数据库中的 Claude Code 构建 VAT 退货系统
点击以在新窗口中打开
分享这篇文章

更多 Technology 内容

AI Is a Five-Layer Cake: What AI Is, How It Works and Why Every Layer Matters

AI Is a Five-Layer Cake: What AI Is, How It Works and Why Every Layer Matters

Jensen Huang's framework explained: energy, chips, infrastructure, models and applications, how each layer depends on the ones below, and what it means for your business.

阅读更多
Jensen Huang on Building the Dynamo of the Intelligence Age: AI Factories, Tokens and Jobs

Jensen Huang on Building the Dynamo of the Intelligence Age: AI Factories, Tokens and Jobs

Notes on NVIDIA founder Jensen Huang's Sequoia Capital interview: why computing is moving from retrieval to generation, why AI factories are this era's dynamos, and why AI changes tasks rather than erasing jobs.

阅读更多
Installing the NVIDIA Container Toolkit: Docker, containerd, CRI-O, Podman and Kubernetes

Installing the NVIDIA Container Toolkit: Docker, containerd, CRI-O, Podman and Kubernetes

Install the toolkit with apt, dnf or zypper, configure every container engine, use CDI, test GPU access, and fix the errors you will meet, with advice for running it across a fleet.

阅读更多