这是长篇深入探讨。如需更快、略读的版本,请参阅 同伴博客文章.
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_rate | 0.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. 架构和工作流程
该管道有五个泳道。 来源 是对发票和费用表的只读访问权限,以及来自 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 上有完整的文章,包括提示、模式、引擎代码、边缘案例和诚实的成本故事。不是税务建议;让会计师审查您的第一份申报表。
