Что получится в результате
Соберем ИИ-агента для закупок и снабжения, который принимает закупочные заявки, проверяет полноту требований, смотрит остатки и потребность, подбирает поставщиков, сравнивает предложения, готовит RFQ, черновик purchase order и задачи закупщику, но не покупает и не согласует деньги без человека.
Первая рабочая версия будет делать так:
- настройки хранятся в `settings`;
- заявители и подразделения хранятся в `requesters`;
- категории закупок хранятся в `procurement_categories`;
- закупочные заявки хранятся в `purchase_requests`;
- строки заявок хранятся в `purchase_request_items`;
- справочник товаров и услуг хранится в `item_catalog`;
- поставщики хранятся в `supplier_master`;
- договоры хранятся в `supplier_contracts`;
- лимиты и бюджеты хранятся в `budget_limits`;
- остатки и потребность хранятся в `demand_snapshot`;
- проверка полноты заявки пишется в `request_checks`;
- подбор поставщиков пишется в `supplier_candidates`;
- запросы цен пишутся в `rfq_queue`;
- предложения поставщиков пишутся в `supplier_quotes`;
- сравнение предложений пишется в `quote_comparison`;
- риски закупки пишутся в `procurement_risk_log`;
- черновики purchase order пишутся в `po_drafts`;
- спорные действия уходят в `approval_queue`;
- одобренные действия попадают в `execution_queue`;
- задачи закупщику, финансам, юристу и складу пишутся в `task_queue`;
- ежедневная сводка пишется в `daily_procurement_report`;
- все решения пишутся в `audit_log`;
- ошибки данных и API пишутся в `error_log`.
В первой версии агент не создает реальный PO, не меняет банковские реквизиты, не выбирает нового поставщика сам, не обходит лимиты и не отправляет деньги. Он проверяет, сравнивает, готовит черновики и отправляет рискованные действия на approval.
Что понадобится
- n8n Cloud или self-hosted n8n.
- Google Sheets для MVP-таблиц.
- Форма заявки: Google Forms, Tally, Typeform, Bitrix24, CRM или ERP.
- Источник закупочных данных: Odoo, Coupa, SAP Ariba, 1С, МойСклад, ERP или CSV.
- Read-only API-ключ к закупочной системе на первом этапе.
- Справочник поставщиков.
- Список договоров, лимитов, бюджетов и категорий закупок.
- Данные по остаткам или потребности со склада, производства или продаж.
- Канал approval: Telegram, Slack, email или задача.
- API-ключ LLM-провайдера.
- Ответственный закупщик или руководитель, который подтверждает выбор.
Шаг 1. Выберите один сценарий закупки
Не начинайте с полного автономного снабжения.
Для MVP выберите один сценарий:
- проверка полноты закупочной заявки;
- поиск подходящих поставщиков;
- сравнение предложений по RFQ;
- подготовка черновика PO;
- поиск дублей закупок;
- контроль заявок вне бюджета;
- ежедневный отчет по открытым закупкам.
Самый безопасный старт: `агент проверяет новые закупочные заявки, находит недостающие данные и готовит задачи закупщику`.
Проверка: сценарий можно вручную проверить на 5 заявках.
Шаг 2. Запретите опасные действия
В первой версии запретите агенту:
- создавать реальный purchase order;
- отправлять PO поставщику;
- выбирать нового поставщика без согласования;
- менять банковские реквизиты поставщика;
- менять договор;
- обходить бюджетный лимит;
- подтверждать закупку вне бюджета;
- отправлять оплату;
- менять цену в ERP;
- менять дату поставки в договоре;
- закупать у заблокированного поставщика;
- удалять заявку или документ.
Разрешите агенту:
- читать заявки;
- проверять полноту;
- искать дубли;
- подбирать кандидатов;
- готовить RFQ;
- сравнивать quotes;
- создавать черновик PO;
- отправлять approval;
- вести лог.
Проверка: write-доступ к ERP выключен или все write-действия идут только через `approval_queue`.
Шаг 3. Создайте Google Sheet проекта
Создайте таблицу:
Procurement agent
Добавьте листы:
settings
requesters
procurement_categories
purchase_requests
purchase_request_items
item_catalog
supplier_master
supplier_contracts
budget_limits
demand_snapshot
request_checks
supplier_candidates
rfq_queue
supplier_quotes
quote_comparison
procurement_risk_log
po_drafts
approval_queue
execution_queue
task_queue
daily_procurement_report
audit_log
error_log
Проверка: n8n может читать и писать во все листы.
Шаг 4. Заполните settings
В `settings` добавьте колонки:
key
value
description
updated_at
Заполните минимум:
approval_required | true | закупки только через approval
auto_execute | false | автоприменение выключено
max_po_draft_amount | 500000 | лимит черновика PO
new_supplier_requires_legal | true | новый поставщик требует юрпроверку
bank_details_change_blocked | true | изменение реквизитов запрещено
rfq_min_quotes | 3 | минимум предложений для сравнения
budget_overrun_pct | 5 | допустимое превышение бюджета
duplicate_check_days | 30 | период поиска дублей
Проверка: `approval_required = true`, `auto_execute = false`.
Шаг 5. Заполните requesters
В `requesters` добавьте колонки:
requester_id
name
email
department
manager_email
cost_center
approval_limit
status
updated_at
Пример:
REQ-001 | Анна Орлова | anna@example.ru | production | boss@example.ru | CC-PROD | 50000 | active | 2026-05-23
Проверка: у каждой заявки есть заявитель и cost center.
Шаг 6. Заполните procurement_categories
В `procurement_categories` добавьте колонки:
category_id
name
category_type
default_owner
requires_contract
requires_rfq
requires_legal_review
requires_security_review
status
updated_at
Пример:
CAT-RAW | Сырье и материалы | goods | procurement | true | true | false | false | active | 2026-05-23
CAT-SOFT | SaaS и ПО | service | procurement | true | true | true | true | active | 2026-05-23
Проверка: у каждой категории есть правила review.
Шаг 7. Заполните purchase_requests
В `purchase_requests` добавьте колонки:
request_id
source_system
external_id
requester_id
department
cost_center
category_id
business_reason
needed_by
priority
estimated_amount
currency
status
created_at
updated_at
Статусы:
new
needs_data
checked
rfq_needed
quotes_received
approval_pending
approved
rejected
po_drafted
closed
cancelled
Пример:
PR-1001 | form | 9001 | REQ-001 | production | CC-PROD | CAT-RAW | Нужно сырье для заказа MO-45 | 2026-06-01 | high | 180000 | RUB | new | 2026-05-23 | 2026-05-23
Проверка: есть минимум 3 заявки со статусом `new`.
Шаг 8. Заполните purchase_request_items
В `purchase_request_items` добавьте колонки:
request_item_id
request_id
item_id
item_name
description
quantity
unit
target_price
currency
preferred_supplier_id
spec_file_url
status
updated_at
Пример:
PRI-1001-1 | PR-1001 | MAT-2201 | Доска дубовая 20 мм | сорт A, влажность до 10% | 120 | m2 | 1500 | RUB | SUP-11 | https://drive/spec.pdf | new | 2026-05-23
Проверка: у каждой строки есть количество, единица и описание.
Шаг 9. Заполните item_catalog
В `item_catalog` добавьте колонки:
item_id
sku
name
category_id
unit
standard_spec
last_price
last_supplier_id
lead_time_days
status
updated_at
Пример:
MAT-2201 | OAK-BOARD-20 | Доска дубовая 20 мм | CAT-RAW | m2 | сорт A, влажность до 10% | 1420 | SUP-11 | 7 | active | 2026-05-23
Проверка: агент может сравнить заявку с прошлой ценой и спецификацией.
Шаг 10. Заполните supplier_master
В `supplier_master` добавьте колонки:
supplier_id
name
inn
category_ids
contact_email
contact_phone
payment_terms
average_lead_time_days
quality_score
delivery_score
risk_status
is_approved
status
updated_at
`risk_status`:
ok
watchlist
blocked
new
needs_legal_review
Проверка: поставщик с `blocked` никогда не попадает в recommendation без критического предупреждения.
Шаг 11. Заполните supplier_contracts
В `supplier_contracts` добавьте колонки:
contract_id
supplier_id
contract_number
category_id
valid_from
valid_to
payment_terms
delivery_terms
currency
limit_amount
status
updated_at
Статусы:
active
expired
draft
blocked
missing
Проверка: если категория требует договор, а договора нет, заявка получает риск.
Шаг 12. Заполните budget_limits
В `budget_limits` добавьте колонки:
budget_id
cost_center
category_id
period
budget_amount
committed_amount
spent_amount
available_amount
currency
owner
updated_at
Формула:
available_amount = budget_amount - committed_amount - spent_amount
Проверка: заявка выше доступного бюджета попадает в `procurement_risk_log`.
Шаг 13. Заполните demand_snapshot
В `demand_snapshot` добавьте колонки:
snapshot_at
source_system
item_id
sku
needed_qty
on_hand_qty
incoming_qty
reserved_qty
shortage_qty
needed_by
source_reason
updated_at
`source_reason`:
production_shortage
stockout_risk
sales_order
maintenance
office_need
manual_request
Проверка: закупочная заявка связана с реальной потребностью, а не только с текстом заявителя.
Шаг 14. Подключите источники данных в n8n
Создайте workflow:
Procurement Agent - request check
Добавьте узлы:
- `Schedule Trigger`;
- `Read purchase_requests`;
- `Read purchase_request_items`;
- `Read item_catalog`;
- `Read supplier_master`;
- `Read supplier_contracts`;
- `Read budget_limits`;
- `Read demand_snapshot`;
- `Check request completeness`;
- `Find supplier candidates`;
- `Check budget and contract`;
- `LLM procurement analysis`;
- `Write checks and risks`;
- `Create RFQ drafts`;
- `Send approval`;
- `Write audit_log`;
- `Write error_log`.
Проверка: workflow читает все листы и обрабатывает новую заявку.
Шаг 15. Если есть ERP, подключите read-only API
Для Coupa читайте:
requisitions
purchase_orders
suppliers
contracts
Для SAP Ariba читайте:
procurement requests
suppliers
contracts
approval tasks
Для Odoo External API читайте модели:
purchase.order
purchase.order.line
res.partner
product.product
account.analytic.account
Проверка: агент получает заявки, поставщиков и PO, но не создает реальные документы.
Шаг 16. Проверьте полноту заявки в request_checks
В `request_checks` добавьте колонки:
check_id
run_id
request_id
check_type
status
missing_fields
notes
created_at
`check_type`:
required_fields
specification
budget
supplier
contract
duplicate
compliance
Обязательные поля:
- заявитель;
- cost center;
- категория;
- описание;
- количество;
- единица;
- срок;
- бизнес-причина;
- ориентировочная сумма;
- спецификация или ссылка на файл.
Проверка: неполная заявка получает статус `needs_data`.
Шаг 17. Найдите дубль закупки
Сравните новую заявку с последними заявками за `duplicate_check_days`.
Признаки дубля:
same item_id
same requester
same cost_center
same needed_by
similar description
same preferred_supplier_id
Если найден дубль, запишите риск в `procurement_risk_log`:
duplicate_request
Проверка: две одинаковые заявки на один товар не уходят в RFQ без review.
Шаг 18. Подберите supplier_candidates
В `supplier_candidates` добавьте колонки:
candidate_id
request_id
item_id
supplier_id
supplier_name
match_reason
last_price
average_lead_time_days
quality_score
delivery_score
risk_status
score
status
created_at
Формула простого score:
score = quality_score * 0.4 + delivery_score * 0.4 + price_score * 0.2
Проверка: поставщик `blocked` получает `status = excluded`.
Шаг 19. Создайте rfq_queue
В `rfq_queue` добавьте колонки:
rfq_id
request_id
supplier_id
supplier_email
items_json
message_draft
status
approval_required
sent_at
created_at
Статусы:
draft
sent_to_approval
approved
sent
rejected
expired
Пример `message_draft`:
Просим направить коммерческое предложение по позиции MAT-2201: 120 m2, сорт A, влажность до 10%, срок поставки до 2026-06-01.
Проверка: RFQ не отправляется поставщику без approval.
Шаг 20. Запишите supplier_quotes
В `supplier_quotes` добавьте колонки:
quote_id
rfq_id
request_id
supplier_id
item_id
quantity
unit_price
currency
delivery_cost
lead_time_days
payment_terms
valid_until
attachments_url
status
received_at
Статусы:
received
needs_clarification
valid
expired
rejected
Проверка: предложение без цены, срока или валюты получает `needs_clarification`.
Шаг 21. Сравните предложения в quote_comparison
В `quote_comparison` добавьте колонки:
comparison_id
request_id
quote_ids
best_price_quote_id
best_delivery_quote_id
recommended_quote_id
total_cost
price_delta_pct
lead_time_delta_days
risk_notes
recommendation
created_at
Сравнивайте:
- цену;
- стоимость доставки;
- срок поставки;
- условия оплаты;
- наличие договора;
- качество поставщика;
- историю задержек;
- риск статуса поставщика.
Проверка: агент объясняет выбор через evidence, а не только пишет “лучший”.
Шаг 22. Запишите риски в procurement_risk_log
В `procurement_risk_log` добавьте колонки:
risk_id
run_id
request_id
item_id
risk_type
risk_level
evidence_json
recommended_action
owner
status
created_at
`risk_type`:
missing_data
budget_overrun
blocked_supplier
new_supplier
expired_contract
duplicate_request
price_above_last
lead_time_risk
single_quote
bank_details_change
Проверка: закупка у нового поставщика получает `new_supplier` и задачу юристу или закупщику.
Шаг 23. Настройте prompt для LLM procurement analysis
В n8n добавьте узел `LLM procurement analysis`.
System prompt:
Ты закупочный аналитик. Работай только с переданными данными.
Не создавай реальный purchase order, не выбирай поставщика окончательно, не меняй реквизиты и не обходи бюджет.
Если данных не хватает, верни status = needs_data.
Любое финансовое или внешнее действие отправляй в approval.
Ответ возвращай только JSON.
User prompt:
Проанализируй закупочную заявку.
request:
{{$json.purchase_request}}
items:
{{$json.purchase_request_items}}
suppliers:
{{$json.supplier_candidates}}
quotes:
{{$json.supplier_quotes}}
budget:
{{$json.budget_limits}}
contracts:
{{$json.supplier_contracts}}
risks:
{{$json.procurement_risk_log}}
Верни JSON:
{
"request_id": "...",
"status": "needs_data | rfq_needed | ready_for_approval | blocked | po_draft_ready",
"risk_level": "low | medium | high | critical",
"summary": "...",
"evidence": ["..."],
"recommended_actions": [
{
"action_type": "ask_requester | send_rfq | request_legal_review | draft_po | create_task | reject_request",
"owner": "requester | procurement | legal | finance | warehouse",
"text": "...",
"requires_approval": true
}
]
}
Проверка: ответ валидный JSON и не содержит покупки без approval.
Шаг 24. Создайте po_drafts
В `po_drafts` добавьте колонки:
po_draft_id
request_id
recommended_quote_id
supplier_id
items_json
total_amount
currency
delivery_terms
payment_terms
contract_id
evidence_json
approval_required
status
created_at
Статусы:
draft
sent_to_approval
approved
rejected
manual_only
exported
Проверка: `po_drafts` - это черновик, а не реальный заказ поставщику.
Шаг 25. Настройте approval_queue
В `approval_queue` добавьте колонки:
approval_id
source
source_id
request_id
action_type
action_text
payload_json
amount
currency
risk_level
requested_by
approver
status
requested_at
approved_at
decision_comment
Статусы:
pending
approved
rejected
needs_changes
expired
В approval отправляйте:
- RFQ поставщику;
- выбор поставщика;
- черновик PO;
- закупку вне бюджета;
- нового поставщика;
- изменение банковских реквизитов;
- закупку без договора;
- закупку с единственным предложением.
Проверка: без `approved` запись не попадает в `execution_queue`.
Шаг 26. Сделайте Telegram approval
В n8n добавьте узел `Telegram`.
Сообщение:
PR-1001: закупка 180 000 RUB
Позиция: MAT-2201, 120 m2
Рекомендация: SUP-11
Причина: цена ниже на 4%, срок 7 дней, договор активен.
Риск: medium, есть только 2 quote вместо 3.
Approve: /approve PR-1001
Reject: /reject PR-1001
Need changes: /changes PR-1001
После `/approve PR-1001` workflow должен:
- найти `approval_id`;
- проверить статус `pending`;
- записать `approved`;
- заполнить `approved_at`;
- передать действие в `execution_queue`;
- записать событие в `audit_log`.
Проверка: `/reject` не создает PO и не отправляет поставщику письмо.
Шаг 27. Настройте execution_queue
В `execution_queue` добавьте колонки:
execution_id
approval_id
request_id
action_type
target_system
payload_json
status
executed_at
result_json
error_message
Статусы:
queued
manual_only
executed
failed
skipped
Для MVP используйте `manual_only`: агент готовит документ, а закупщик создает реальный PO в ERP.
Проверка: пока write-доступ не включен, все PO остаются `manual_only`.
Шаг 28. Создайте task_queue
В `task_queue` добавьте колонки:
task_id
source
source_id
request_id
task_type
title
description
owner_team
assignee
priority
status
created_at
due_at
closed_at
`task_type`:
ask_requester
send_rfq
legal_review
finance_review
supplier_check
po_create_manual
warehouse_check
budget_review
data_fix
Пример:
TASK-901 | procurement_risk_log | RISK-441 | PR-1001 | legal_review | Проверить нового поставщика SUP-55 | Поставщик новый, договора нет | legal | lawyer_1 | high | open | 2026-05-23 | 2026-05-24 | -
Проверка: каждый риск превращается в задачу с владельцем и сроком.
Шаг 29. Соберите daily_procurement_report
В `daily_procurement_report` добавьте колонки:
report_date
new_requests
needs_data
rfq_needed
quotes_received
approval_pending
po_drafts
budget_risks
blocked_suppliers
tasks_created
summary
created_at
Пример summary:
Сегодня 14 новых заявок, 5 неполных, 4 требуют RFQ, 3 ждут approval, 2 заявки выше бюджета, 1 поставщик заблокирован.
Проверка: отчет отправляется закупщику и руководителю снабжения.
Шаг 30. Настройте audit_log
В `audit_log` добавьте колонки:
event_id
run_id
event_type
request_id
actor
input_hash
output_hash
summary
created_at
Пишите события:
run_started
data_loaded
request_checked
duplicate_checked
suppliers_scored
rfq_created
quote_compared
risk_found
po_drafted
approval_requested
approval_approved
task_created
run_finished
Проверка: по `run_id` можно объяснить каждую рекомендацию.
Шаг 31. Настройте error_log
В `error_log` добавьте колонки:
error_id
run_id
step
source_system
request_id
supplier_id
error_type
error_message
payload_sample
status
created_at
resolved_at
`error_type`:
api_error
missing_requester
missing_item
missing_budget
unknown_supplier
blocked_supplier
invalid_json
approval_error
write_error
Проверка: если поставщик неизвестен, агент пишет `unknown_supplier`, а не создает поставщика сам.
Шаг 32. Протестируйте на одной заявке
Создайте тестовую заявку:
purchase_requests:
PR-TEST-001 | form | 9001 | REQ-001 | production | CC-PROD | CAT-RAW | Нужно сырье для заказа MO-45 | 2026-06-01 | high | 180000 | RUB | new | 2026-05-23 | 2026-05-23
purchase_request_items:
PRI-TEST-001 | PR-TEST-001 | MAT-2201 | Доска дубовая 20 мм | сорт A, влажность до 10% | 120 | m2 | 1500 | RUB | SUP-11 | https://drive/spec.pdf | new | 2026-05-23
supplier_quotes:
Q-1 | RFQ-1 | PR-TEST-001 | SUP-11 | MAT-2201 | 120 | 1420 | RUB | 8000 | 7 | 50% предоплата | 2026-05-30 | https://drive/q1.pdf | valid | 2026-05-23
Q-2 | RFQ-2 | PR-TEST-001 | SUP-12 | MAT-2201 | 120 | 1490 | RUB | 0 | 5 | постоплата 10 дней | 2026-05-30 | https://drive/q2.pdf | valid | 2026-05-23
Ожидаемый результат:
- `request_checks` показывает, что заявка полная;
- `supplier_candidates` содержит минимум 2 поставщика;
- `quote_comparison` сравнивает цену и срок;
- `procurement_risk_log` пишет риск, если quote меньше трех;
- `po_drafts` создает черновик;
- `approval_queue` создает заявку;
- `task_queue` создает задачу закупщику;
- `audit_log` содержит шаги запуска;
- `error_log` пустой.
Проверка: реальный PO не создан без approval.
Шаг 33. Проверьте негативные сценарии
Сделайте 5 тестов:
- удалите заявителя из `requesters`;
- укажите заблокированного поставщика;
- поставьте сумму выше бюджета;
- удалите договор для категории, где договор обязателен;
- верните от LLM невалидный JSON.
Ожидаемый результат:
- нет заявителя - `missing_requester`;
- заблокированный поставщик - `blocked_supplier`;
- сумма выше бюджета - `budget_overrun`;
- нет договора - `expired_contract` или `missing_contract`;
- невалидный JSON - `invalid_json`;
- PO не создается;
- execution не запускается без approval.
Проверка: агент не обходит лимиты и не придумывает поставщиков.
Минимальная проверка результата
Прототип работает, если выполняются условия:
- `purchase_requests` содержит минимум 3 заявки;
- `purchase_request_items` содержит позиции;
- `supplier_master` содержит поставщиков;
- `budget_limits` содержит лимиты;
- `request_checks` ловит неполные заявки;
- `supplier_candidates` исключает заблокированных;
- `rfq_queue` создает RFQ только как черновик;
- `supplier_quotes` хранит предложения;
- `quote_comparison` показывает evidence;
- `procurement_risk_log` ловит бюджет, договор и поставщика;
- `po_drafts` создает только черновик;
- `approval_queue` блокирует внешние действия;
- без `approved` нет записи в `execution_queue`;
- `task_queue` назначает владельца;
- `daily_procurement_report` показывает статус закупок;
- `audit_log` объясняет действия;
- `error_log` показывает плохие данные.
Что нельзя автоматизировать в первой версии
- создание реального PO;
- отправку PO поставщику;
- выбор нового поставщика;
- изменение банковских реквизитов;
- оплату;
- закупку вне бюджета;
- закупку у заблокированного поставщика;
- изменение договора;
- обход лимитов;
- удаление заявки или документа;
- массовую рассылку RFQ;
- любые действия с деньгами и юридическими обязательствами без approval.
Частые вопросы
Можно ли начать без Coupa или SAP Ariba?
Да. Для MVP хватит Google Forms, Google Sheets, справочника поставщиков и approval-бота. ERP или procurement platform нужны, когда процесс станет стабильным и появится требование к интеграции.
Может ли агент сам выбирать поставщика?
В первой версии нет. Агент может рекомендовать поставщика, показать цену, срок, договор, риски и историю качества, но финальный выбор должен подтвердить закупщик или согласующий.
Как агент проверяет бюджет?
Он сравнивает сумму заявки с `available_amount` в `budget_limits` и учитывает `budget_overrun_pct`. Если заявка выше лимита, она получает риск и отдельный approval.
Что делать с новым поставщиком?
Новый поставщик должен идти на legal, finance или compliance review. Агент может создать задачу и собрать данные, но не должен добавлять поставщика в боевой справочник сам.
Какой минимальный результат считать успешным?
Успешный MVP: агент берет одну заявку, проверяет поля, находит поставщиков, сравнивает quotes, создает черновик PO, отправляет approval, создает задачу и пишет audit log.