商店現已上線

我們打造用於網站、AI 智慧體和 LLM 訓練的 Workstation AI 機器——線上配置併購買。

獲取同行價格
AI 產品
AI 實驗室OpenAI 智慧體Claude 代理Grok BotWorkstation AI 原生 CRM營銷所有產品
AI 解決方案
應用型 AIAI 智慧體生成式 AIAI 自動化AI 技能提升中小企業 AI 套餐企業 AI 實驗室AI 工作站NVIDIA 硬體與軟體NVIDIA 加速計算私有 AIGPU 私有云GPU 叢集邊緣 AI行業 AI
AI 服務
平臺現代化數字工程資料基礎與 AI自主運營AI 諮詢DevOps 自動化網路安全軟體開發智慧體構建MLOps 搭建GPU 租賃GPU 私有云
關於我們
公司我們的故事合作伙伴客戶案例
AI 資料中心
AI 資料中心GPU 私有云GPU 叢集GPU 租賃
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
台灣辦公室
3F, No. 2-4, Aisi Rd., Ren'ai Dist., Keelung City 200, Taiwan基隆市仁愛區愛四路2之4號3樓週一至週五:上午 9:00 - 下午 6:00 臺灣時間(GMT+8)
+886 926 892 701+32 492 45 67 46

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

隱私資料刪除Cookie服務條款網站地圖

NVIDIA、NVIDIA 標誌、RTX、RTX PRO、Blackwell、CUDA、NVLink、MGX、Omniverse、Spectrum-X、Quantum、BlueField、DGX 與 HGX 為 NVIDIA Corporation 在美國及其他國家的商標及/或註冊商標。AMD、AMD Arrow 標誌、EPYC、Instinct、Ryzen 與 Threadripper 為 Advanced Micro Devices, Inc. 的商標。Dell 與 PowerEdge 為 Dell Inc. 或其子公司的商標。Intel 與 Xeon 為 Intel Corporation 或其子公司的商標。AMAX、AceleMax 與 LiquidMax 為 AMAX Engineering Corporation 的商標。所有其他產品名稱、標誌與品牌均為其各自所有者之財產。我們使用它們僅為識別我們所描述、供應或支援的產品;使用這些名稱並不表示其所有者為我們背書。

首頁 / 技術說明 / 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 內容

AMD Instinct vs NVIDIA for AI Infrastructure: Evaluate, Port and Run Both (2026)

AMD Instinct vs NVIDIA for AI Infrastructure: Evaluate, Port and Run Both (2026)

From Lisa Su's 2024 interview to Helios: the 2026 platforms layer by layer, Instinct product lines, memory arithmetic, the CUDA-to-ROCm software map, a porting workflow with commands, dual-vendor Kubernetes, fair benchmarking, a decision workflow and day-two operations

閱讀更多
Private AI for Financial Data: Residency, Routing and Cost on AWS Bedrock, Microsoft Azure and Your Own GPUs

Private AI for Financial Data: Residency, Routing and Cost on AWS Bedrock, Microsoft Azure and Your Own GPUs

Billing models and idle cost, per-call cost at three volumes, Bedrock in-region vs EU profiles, Converse API with prompt caching and IAM region enforcement, Azure deployment types and Claude on Foundry, UK and EU providers, a residency-aware provider registry, cost-cutting workflow, a golden-set evaluation harness and GPU break-even

閱讀更多
NVKE and NVKR Technote: Building a Managed GPU Kubernetes Service from Bare Metal, with Reproducible, Verifiable Builds

NVKE and NVKR Technote: Building a Managed GPU Kubernetes Service from Bare Metal, with Reproducible, Verifiable Builds

Architecture, components and pinned versions, the NVKR Definition-Run-Release-Verify lifecycle, the full nvkectl workflow from racked servers to a customer cluster, node attestation, day-two operations, every preview limitation with a mitigation, a comparison with other approaches and a staged evaluation plan

閱讀更多