Workstation Logo
Продукты
AI LabsАгенты OpenAIАгенты ClaudeGrok BotWorkstation CRM (WSL CRM)МаркетингВсе продукты
Решения ИИ
Рабочие станции ИИAI SME PackagesЧастный ИИКластеры GPUПограничный ИИЛаборатория корпоративного ИИИИ по отраслям
Услуги
Platform ModernisationDigital EngineeringData Foundations & AIAutonomous OperationsИИ-консалтингАвтоматизация DevOpsКибербезопасностьРазработка ПОСоздание агентовНастройка MLOps
О нас
ПартнёрыИстории клиентов
Статьи
Документация
WSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7
Блог
Связаться с намиLogin
Workstation

AI-рабочие станции, мультиагентное AI-ПО, GPU-инфраструктура и решения на базе интеллектуальных агентов для современного бизнеса.

Связаться с нами

AI-решения

Рабочие станции ИИAI SME PackagesЧастный ИИКластеры GPUПограничный ИИЛаборатория корпоративного ИИИИ по отраслям

Продукты

Все продуктыWSL CRM и ERPМаркетингАгенты OpenAIWSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7

Компания

О насПочему WorkstationПартнёрыИстории клиентовЦеныКонтакты

Ресурсы

СтатьиДокументацияБлогПоискКарта сайта
Офис в Великобритании
77-79 Marlowes, Hemel Hempstead HP1 1LFКак добраться: съезд 20 с трассы M25, Внешний ЛондонРег. номер компании: 11641870Пн - Пт: 9:00 - 18:00 GMT
+44 7515 356 146
Офис в Бельгии
Workstation SRL, Rue Vanderkindere 34, 1180 Uccle, BrusselsBE 0751.518.683Пн - Пт: 9:00 - 18: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
ИИБухгалтерияPythonАвтоматизация

Создание системы возврата VAT с помощью Claude Code на основе базы данных счетов и расходов

От счетов Postgres + базы данных расходов до HMRC, Box 1 до 9: подсказки, детерминированный механизм Python, отправка OAuth2 MTD и крайние случаи (Брексит, протокол NI, обратное начисление, частичное освобождение, фиксированная ставка, мультивалютность, кредит-ноты)

May 16, 2026Technology20 min read

Это подробное подробное описание. Более быструю и удобочитаемую версию см. сопутствующий пост в блоге.

VAT возвращается с Claude Code из счетов и покрытия расходов

1. Почему я это сделал

Каждый малый бизнес в Великобритании, чей налогооблагаемый оборот превышает порог регистрации VAT, должен рассчитывать и подавать отчет VAT — обычно ежеквартально — через службу Making Tax Digital (MTD) HMRC. Девять пронумерованных коробок. Выход VAT минус вход VAT. Оплатите чистую сумму или запросите возврат средств. Теоретически легко; на практике это наказание, когда ваши счета хранятся в Postgres, ваши расходные квитанции представляют собой PDF-файлы от двадцати различных поставщиков, ваши банковские выписки представляют собой CSV от Wise и Revolut, а ваши строки в иностранной валюте необходимо пересчитывать в фунтах стерлингов по правильному ежемесячному курсу.

В течение нескольких лет я с трудом справлялся с огромной электронной таблицей, календарем-напоминанием и небольшим шагом веры. Каждый квартал занимал примерно полдня, большую часть которого занимала обработка данных: экспортировать CSV-файл из базы данных счетов, вставить его в Excel, вручную классифицировать несколько сотен строк, перепроверить формулы, скопировать девять чисел в сторонний мост MTD, нажать «Отправить». Аудиторский след был таким: «Поверьте мне, у меня была электронная таблица». Изменения ставок в середине квартала сломали ситуацию. Квитанции пропали. Одна неуместная классификация может подтолкнуть Box 5 снизился на сотни фунтов.

В этом году я восстановил трубопровод как небольшой Claude Code проект, который напрямую обращается к моей базе данных счетов и расходов, классифицирует каждую строку, вычисляет Box 1 в Box 9 с помощью детерминированного механизма Python, выполняет пробный прогон отчета в виде отчета Markdown и только после того, как человек подписывает подпись, отправляет HMRC MTD. Весь квартал теперь занимает у меня около часа, большая часть которого уходит на анализ пробного прогона с моим бухгалтером. Журнал аудита представляет собой git-репозиторий. Математические расчеты проходят модульное тестирование. Классификатор представляет собой документированный файл Markdown. Подача закрыта.

Эта статья является длинной версией. Подсказки, Python, схема, поток OAuth HMRC, крайние случаи. Если вам сначала нужна короткая версия, прочитайте сопутствующий блог.

2. Руководство по HMRC MTD (и отказ от ответственности)

Making Tax Digital для VAT — это требование 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, попросите зарегистрированного в Великобритании бухгалтера просмотреть ваш первый отчет от начала до конца. Авторитетные правила для любого конкретного крайнего случая см. в Уведомлении 700 HMRC VAT и соответствующих уведомлениях на веб-сайте 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и коды стран. Лечение — это небольшое перечисление, используемое как классификатором, так и механизмом; код страны определяет логику обратного платежа и приобретения ЕС; Курс валют позволяет вам хранить счета в иностранной валюте в их исходной валюте и по-прежнему пересчитывать в 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, достойные пользовательские интерфейсы и бухгалтеров, которые их уже знают. Не следует развертывать собственную систему VAT, если у вас нет веской причины.

Мои причины были узкими, но реальными. Я уже использую Claude Code каждый день для работы с программным обеспечением, поэтому минимальные усилия по использованию его для VAT были небольшими. Моя база данных счетов находится на моей машине; Я предпочитаю, чтобы это не отражалось в клиенте SaaS. Мой набор поставщиков неудобен (услуги ЕС с обратной оплатой, отложенный импорт VAT, периодические крайние случаи с нулевой ставкой), и кодирование правил в одном файле Markdown плюс модуль Python оказалось быстрее, чем настройка SaaS для их обработки. И журнал аудита, который я получаю из репозитория git — каждое приглашение классификатора, каждое различие, каждый снимок подписанного периода — это именно тот журнал аудита, который мне нужен.

Claude Code хорошо подходит для этой цели по трем причинам. Во-первых, он работает непосредственно с проектом на диске: он может читать мою схему, отчеты о пробных прогонах за предыдущий квартал, файл правил и движок Python, а также предлагать изменения в контексте. Во-вторых, он хорош в скучных сценариях миграции, импортерах CSV, отчетах о сверке, приспособлениях pytest. В-третьих, когда он классифицирует строку, он объясняет ее обоснование на простом английском языке, и это именно то, что я хочу просмотреть, прежде чем подписывать отчет. Матрица решений в нижней части приведенной ниже диаграммы рабочего процесса представляет собой честную версию этого компромисса.

5. Архитектура и рабочий процесс

Возврат VAT Рабочий процесс Claude Code — источник, прием, категоризация, механизм VAT, отправка, полосы аудита и матрица решений

Трубопровод имеет пять дорожек для плавания. Источник — это доступ только для чтения к таблицам счетов и расходов, а также папка для CSV из Stripe, Wise и банковских каналов. Поглотить + нормализовать — это небольшой скрипт Python, созданный Claude, который отображает каждую исходную схему в одно каноническое представление, конвертирует иностранную валюту в GBP по ежемесячному курсу HMRC, применяет фильтр диапазона дат и помечает каждую строку идемпотентом. run_key поэтому повторные запуски безопасны. Классифицировать + согласовать — это классификатор Claude Code: он просматривает каждую каноническую строку, выбирает vat_treatment из документированного перечисления с использованием правил в vat-rules.md, сверяет счета с платежами и отмечает аномалии (отрицательная чистая сумма, отсутствующий номер поставщика VAT, несоответствие кода страны, поставщики, которые должны быть зарегистрированы в 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, build_run_key() который хеширует (период_начало, период_конец, схема, схема_версия) в стабильную шестнадцатеричную строку и интерфейс командной строки на основе кликов. Я отредактировал два имени поля и принял остальные.

Подсказка 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 дп. Добавьте явные ветки для 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 и SHA-256 секретного JSON. Сохранить в ./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 еще до того, как она коснется отчета о пробном прогоне. Клод может помочь мне написать больше тестов; он не может заменить двигатель без прохождения этих испытаний.

8. Демонстрационное видео

Ниже приводится краткое описание конвейера, работающего от начала до конца с реальной (анонимизированной) базой данных счетов и расходов за один квартал: нормализация, классификация, пробный прогон, а затем отправка в песочницу MTD. Весь цикл занимает пару минут.

9. Представление HMRC MTD

Это та часть, которую большинство рецензентов замалчивают. MTD VAT API сам по себе хорошо документирован и бесплатен, но прежде чем звонить, вам необходимо уяснить три вещи. POST returns.

OAuth2 и токены. Зарегистрируйте приложение в центре разработчиков HMRC; вы получаете идентификатор клиента, секрет клиента и URI перенаправления. Поток — код авторизации с PKCE: откройте браузер на странице согласия HMRC, пользователь входит в систему, используя свои учетные данные государственного шлюза, и авторизует ваше приложение по своему регистрационному номеру VAT (VRN), HMRC перенаправляет обратно с кодом авторизации, вы обмениваете его на токен доступа + токен обновления. Кэшируйте их с разумными разрешениями на диске. Токен доступа недолговечен; токен обновления намного длиннее.

Заголовки для предотвращения мошенничества. HMRC требует документированного набора заголовков HTTP, идентифицирующих исходное устройство при каждом вызове API: часовой пояс, геометрия экрана, идентификаторы пользователей, общедоступный IP-адрес, MAC-адреса, метод подключения клиента и т. д. Точный список и формат приведены в документации разработчика HMRC (см. Уведомление 700 HMRC VAT и соответствующие спецификации по предотвращению мошенничества для авторитетного правила). Получите их неправильно, и вы получите 403 с неясной ошибкой. Сделайте их правильно, и звонок пройдет. я держу их внутри fraud_headers.py и подтвердить их наличие в тестах.

Сначала песочница. HMRC предоставляет бесплатную песочницу по адресу test-api.service.hmrc.gov.uk с заглушками VRN и заглушками обязательств. Прогоните весь свой конвейер в песочнице до тех пор, пока вы не отправите поддельную декларацию, не получите поддельный идентификатор квитанции и не подтвердите перемещение своих обязательств. Только тогда ты переворачиваешь HMRC_ENV=live. Мой отправитель отказывается вызывать live, если не установлена ​​переменная среды и не введены операторы SUBMIT по подсказке. Автоматического пути выполнения не существует. Стоимость одной неудачной публикации намного выше, чем стоимость еще одной итерации в песочнице.

Фактический вызов счастливого пути короткий: GET obligations с status=O чтобы найти открытый период, отобразите отчет о пробном прогоне, предложите оператору подтвердить, затем POST returns с девятью номерами ящиков, periodKey от обязательства и finalised: true. Сохраните ответ, запишите идентификатор квитанции в папку аудита, и все готово.

10. Безопасность, аудит и соблюдение требований

Три правила, дальше которых я не буду двигаться. Первый, Клод не в арифметике. Классификатор предлагает методы лечения, а LLM может редактировать Python и правила, но итоговые значения блоков создаются с помощью чистой функции с помощью модульных тестов. «Это сделал ИИ» не является защитой в рамках MTD. Второй, каждая подача контролируется человеком. Отчет о пробном запуске является источником истины для подписания. Если я не могу объяснить число из классифицированных строк и кода двигателя, я не отправляю заявку. Третий, журнал аудита предназначен только для добавления. Каждый классифицированный JSON, каждый отчет пробного запуска, каждое приглашение, каждая разница и окончательный идентификатор получения HMRC за период записываются в файл. ./audit/<period>/ и привязан к частному репозиторию git. HMRC требует шестилетних записей; мои подписанные снимки.

Еще две практики я бы порекомендовал, даже если остальные вы не перейдете. Запустите соединение исходной базы данных с ролью только для чтения с наименьшими привилегиями: нет UPDATE, нет DELETE, нет DROP. Храните клиент HMRC в секрете и токены доступа из репозитория, используя диспетчер секретов или файл 0600 в вашем домашнем каталоге. Цель состоит в том, чтобы сделать несчастные случаи невозможными с помощью конструкции, а не только с помощью политики.

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. Время рецензента в квартал около часа, в основном потраченного на чтение пробного прогона с моим бухгалтером. Сравните это примерно с половиной дня споров с электронными таблицами при старом рабочем процессе, и сэкономленное время окупится в течение первого года.

Если бы вы оценивали этот проект как проект, за создание которого вы платили кому-то другому, ваши расценки на консалтинговые услуги были бы примерно четырехзначными, поэтому пакетный SaaS за двадцать-пятьдесят фунтов в месяц почти всегда является правильным ответом для большинства предприятий. Интересный вопрос не в том, «это дешевле, чем Xero?» - обычно это не так - но «является ли это более точным, более проверяемым и мне легче рассуждать?». Для меня ответ — да.

13. Что дальше и выводы

Следующие элементы, которые я хочу добавить, это: автоматический импорт банковских данных (Open Banking AISP), распознавание текста для PDF-файлов поставщиков, чтобы URL-адрес квитанции стал фактической отсканированной строкой, запланированный процесс утверждения cron + Slack, чтобы мне не приходилось запоминать сроки, и расширение для самостоятельного выставления счетов для продавцов на торговой площадке. Ничто из этого не меняет основную форму трубопровода. Все это декорации на одной пятиполосной схеме.

Самый важный урок, по крайней мере для меня, заключается в том, насколько хорошо небольшой проект Claude Code справляется со скучной частью регламентированного рабочего процесса. Скучная половина — это большая часть работы: нормализация схемы, импортеры CSV, отчеты о сверке, фикстуры, правила для крайних случаев, ведение журнала аудита. Клод превосходен во всем этом. Детерминированная половина — фактическая математика, фактическая отправка — остается в простом Python с модульными тестами и воротами одобрения человека, где ей и место.

Отказ от ответственности, еще раз. Эта статья не является налоговой консультацией. Прежде чем вы направите что-либо подобное на реальную учетную запись HMRC, попросите зарегистрированного в Великобритании бухгалтера просмотреть ваш первый отчет от начала до конца. Используйте тестовую среду HMRC MTD, пока вы и ваш бухгалтер не будете уверены в своих силах. Авторитетные правила в отношении любого конкретного лечения VAT см. в Уведомлении 700 HMRC VAT и соответствующих уведомлениях на веб-сайте gov.uk. Если вам нужна краткая версия всего этого, сопутствующий пост в блоге пятиминутное чтение; в противном случае подпишитесь, и я буду продолжать писать по мере развития стека.


SEO-снимок для этой статьи

  • SEO-заголовок: Создайте систему возврата VAT с помощью Claude Code
  • Мета-описание: Используйте Claude Code для чтения ваших счетов и базы данных расходов, классификации VAT, вычисления HMRC Box 1 до 9, пробного запуска, а затем отправки в MTD — детерминистический механизм, одобрение человека.
  • Основные ключевые слова: claude-code, vat, hmrc, mtd, бухгалтерский учет, автоматизация, python, ai-agent, finops, малый бизнес
  • Twitter/X (до 280 символов): Перестроил мой возврат VAT в Великобритании в проект Claude Code: счета-фактуры Postgres + база данных расходов в HMRC, Box 1 в 9, детерминированный движок Python, отправка MTD в песочнице, шлюз одобрения человеком. Полное описание + SVG рабочего процесса + демонстрационное видео. Не налоговые консультации. #ClaudeCode #VAT #HMRC #MTD
  • Сообщение в LinkedIn: В этом году я перестроил свой квартальный доход VAT в Великобритании как небольшой проект Claude Code. Он считывает мою базу данных счетов и расходов только для чтения, классифицирует каждую строку по обработке VAT с использованием файла документированных правил, вычисляет HMRC Box 1 до 9 с помощью детерминированного механизма Python (без LLM в арифметике), и только после того, как я подпишу пробный прогон, данные передаются через HMRC MTD API — сначала песочница, заголовки для предотвращения мошенничества, полный поток OAuth2. Весь квартал теперь занимает около часа. Полное описание с подсказками, схемой, кодом ядра, крайними случаями и честной историей затрат находится на Workstation. Не налоговые консультации; попросите бухгалтера проверить ваш первый возврат.

Watch

Создание системы возврата VAT с помощью Claude Code на основе базы данных счетов и расходов
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