Контрагенты и экономический контекст
Кто на другой стороне операции и зачем она — контрагенты и автосопоставление адресов, категории, метаданные и связи операций.
Журнал записывает суммы, а контрагенты и метаданные записывают смысл — кто на другой стороне и зачем была операция. Этот слой превращает сырые движения средств в бизнес-события, по которым можно строить отчёты.
Контрагент — это набор адресов
Контрагент — именованная сущность с привязанными адресами. Имя уникально в рамках Vault'а, а каждый адрес принадлежит максимум одному контрагенту — иначе сопоставление было бы неоднозначным. Сети адресов проверяются по реестру Networks.
POST /api/v1/vaults/{code}/counterparties— создать контрагента (можно сразу с адресами).POST /api/v1/vaults/{code}/counterparties/{id}/addresses— добавить адрес.GET /api/v1/vaults/{code}/counterparties— список с фильтрамиsearch(подстрока в имени) иkind(например,exchange).
Автосопоставление и ретро-матч
Когда операция идёт на известный адрес или с него, она автоматически привязывается к контрагенту — вручную размечать не нужно. А если адрес добавлен позже, срабатывает ретро-матч: уже существующие операции с этим адресом сопоставляются контрагенту задним числом, а история классификации сохраняется.
Смысл ретро-матча: классификация не теряется и не требует ручного разбора постфактум — достаточно добавить адрес к контрагенту.
Группы контрагентов
Контрагентов можно объединять — например, по типу или юрисдикции:
POST /api/v1/vaults/{code}/counterparty-groups— создать группу (члены добавляются отдельно). Мутация гейтится политикойcounterparty_group_create: при требовании подписи вернётся заявка.
Архивация: история не теряется
Контрагента не удаляют, а архивируют:
POST /api/v1/vaults/{code}/counterparties/{id}/archive—archived=true: контрагент перестаёт матчиться на новые операции и недоступен для новых переводов, но история сохраняется;false— вернуть. Гейтится политикойcounterparty_archive.
Категории операций
Категории — это настраиваемый версионируемый справочник, по которому собираются отчёты и фильтры:
GET /api/v1/vaults/{code}/operation-categories— список категорий Vault'а. Схема видна любому участнику (из неё собираютcategoryKey,groupByField,metricFieldдля конструктора отчётов);viewScopeограничивает доступ к значениям на операциях, а не к самой схеме.
У категории могут быть свои аппруверы (POST / DELETE /api/v1/vaults/{code}/operation-categories/{id}/approvers) — так операции определённой категории могут требовать подтверждения назначенных людей (см. Аппрувалы).
Метаданные операции
Метаданные привязывают к операции её бизнес-контекст:
GET/PATCH /api/v1/vaults/{code}/operations/{type}/{id}/metadata— upsert плоских метаданных:paymentPurpose,category(валидируемый код из справочника),tags,description, внешние референсы и бизнес-связи (dealId/invoiceId/orderId/settlementId/obligationId). Каждое изменение инкрементируетversion.
Не путайте две вещи: плоское поле category в метаданных конкретной операции — это ссылка на код из версионируемого справочника категорий, а не сама категория.
Связи операций
Операции можно явно связывать друг с другом, чтобы отразить экономическую связь:
POST /api/v1/vaults/{code}/operation-relations—refund,reversal,correction,replacement. Встречный платёж не считается возвратом автоматически — связь указывается явно; частичный возврат — черезrelatedAmountRaw.
Как эти связи сочетаются с неизменяемостью журнала — на странице Журнал (двойная запись).