Перейти к основному содержимому

Wallet API — реестр операций и общие контрактные модели

Индекс всех HTTP-операций контекста wallet и единственный дом общих контрактных моделей API (балансы, транзакции, paging). Файлы операций описывают только свою дельту и ссылаются сюда. Дом полей сущностей — ../domain/wallet-account.md и ../domain/ledger-transaction.md.

Metadata

ПолеЗначение
Сервис/контекстwallet
Статусdraft
Owning teamPIN Platform (backend)
Область действияAPI areas: user (мои балансы и история), agency (балансы агентов агентства), platform (реестр счетов, ручные корректировки)
AssumptionsКонверт ответа/ошибок — общий для платформы, дом — identity/api/README.md; permissions — каталог identity/domain/permission.md
Зависимости../README.md, ../domain/wallet-account.md, ../domain/ledger-transaction.md

Все операции — read-only поверх счетов и журнала, кроме ручной корректировки (Adjustment) и постановки асинхронных выгрузок-выписок (statement-exports — создают внутреннюю задачу выгрузки, не меняют финансовое состояние; конвейер — ADR-0041). wallet не порождает денежных обязательств: источник сумм — события rewards (ADR-0065); API лишь показывает проведённое состояние и допускает корректировку ПИН-админом.

Реестр операций (12)

User — мой кошелёк (my-wallet)

#ОперацияHTTPRoutePermissionДокумент
1getMyWalletGET/api/v1/my/walletwallet.balance.view-ownget-my-wallet.md
2listMyWalletTransactionsGET/api/v1/my/wallet/transactionswallet.transactions.view-ownlist-my-wallet-transactions.md
3createWalletStatementExportPOST/api/v1/my/wallet/statement-exportswallet.transactions.view-owncreate-wallet-statement-export.md
4getWalletStatementExportJobGET/api/v1/my/wallet/statement-exports/{jobId}wallet.transactions.view-ownget-wallet-statement-export-job.md

Agency — балансы команды (agency-wallet)

#ОперацияHTTPRoutePermissionДокумент
5listAgencyAgentBalancesGET/api/v1/agency/wallet/agent-balanceswallet.team.viewlist-agency-agent-balances.md
6createWalletStatementExportPOST/api/v1/agency/wallet/statement-exportswallet.team.viewcreate-wallet-statement-export.md
7getWalletStatementExportJobGET/api/v1/agency/wallet/statement-exports/{jobId}wallet.team.viewget-wallet-statement-export-job.md

Platform — реестр счетов, корректировки и выписки (platform-wallet)

#ОперацияHTTPRoutePermissionДокумент
8listWalletAccountsGET/api/v1/platform/wallet/accountswallet.accounts.view-alllist-wallet-accounts.md
9listAccountLedgerGET/api/v1/platform/wallet/accounts/{accountId}/ledgerwallet.accounts.view-alllist-account-ledger.md
10createWalletAdjustmentPOST/api/v1/platform/wallet/adjustmentswallet.adjustments.managecreate-wallet-adjustment.md
11createWalletStatementExportPOST/api/v1/platform/wallet/statement-exportswallet.accounts.view-allcreate-wallet-statement-export.md
12getWalletStatementExportJobGET/api/v1/platform/wallet/statement-exports/{jobId}wallet.accounts.view-allget-wallet-statement-export-job.md

Общие контрактные модели

WalletBalanceModel (баланс счёта; проекция WalletAccountEntity — дом: ../domain/wallet-account.md)

ПолеТипОбязательностьИсточникОписание
AccountIdGuidДаWalletAccountEntity.IdИдентификатор счёта.
AccountKindstring (enum WalletAccountKind)ДаAccountKindВид счёта: AgentCommission / ReferralCommission / AgencyCommission / PlatformSettlement / PlatformRevenue.
BalancedecimalДаBalance (хранимый, сверяемый с журналом)Текущий баланс; scale 2. У холдерских счетов >= 0; системные могут быть отрицательными (контрсчёт).
CurrencyIdshortДаCurrencyIdВалюта счёта — ссылка на справочник (handbook/domain/snapshots.md); RUB-only (ADR-0048).

Счета создаются lazy — при первой кредитующей проводке; отсутствие счёта в ответе означает нулевой баланс (проводок не было).

Подписи холдеров (HolderDisplayName). ФИО холдера-пользователя и название холдера-агентства в ответах (my/wallet, agency/agent-balances, platform/accounts) резолвятся из локальной display-реплики холдеров (../domain/user-display-replica.md, консюмер ../consumers/identity-users.md) — без синхронного вызова identity. Реплика eventual: отсутствие строки → подпись null (клиент показывает id / имя из своего профиля), это не ошибка. Ростер агентов агентства (agency/agent-balances) резолвится по той же реплике (CompanyId).

WalletTransactionModel (строка истории транзакций счёта; проекция журнала — дом: ../domain/ledger-transaction.md)

Строка истории — транзакция журнала в разрезе одного счёта (проекция проводки этого счёта).

ПолеТипОбязательностьИсточникОписание
TransactionIdGuidДаLedgerTransactionEntity.IdТранзакция журнала.
AccountIdGuidДапроводка (LedgerEntryEntity.AccountId)Счёт, к которому относится строка.
AccountKindstring (enum WalletAccountKind)Дасчёт проводкиВид счёта строки (различает историю при выборке по нескольким счетам).
OperationKindstring (enum WalletOperationKind)ДаOperationKindCommissionCredit / ReferralCredit / PayoutDebit / Adjustment / Correction.
AmountdecimalДапроводка счёта (Direction + Amount)Сумма со знаком относительно счёта: положительная — Credit (баланс вырос), отрицательная — Debit; scale 2.
BalanceAfterdecimalДапроводка счётаБаланс счёта после применения транзакции (BalanceAfter проводки, фиксируется при проведении).
CurrencyIdshortДасчётВалюта сумм строки (handbook/domain/snapshots.md); RUB-only.
SourceIdGuidДаSourceIdСсылка-основание: id начисления / реферального начисления / позиции поручения / исходной транзакции (Correction) / ключ корректировки (Adjustment) — карта по видам операций в ../domain/ledger-transaction.md.
OccurredAtDateTimeOffsetДаOccurredAtМомент бизнес-факта операции (получение денег / выплата / корректировка).

Paging (все list-операции)

ПолеИсточникТипОграничения
Pagequeryint>= 1, default 1
PageSizequeryint1..100, default 20

Ответ — страница: Items : IReadOnlyList<TItem>, Page : int, PageSize : int, TotalCount : long.

Masking и безопасность (все операции)

ПравилоЗначение
Балансы и суммыSensitive: в логи не пишутся (в logs — только AccountId/OperationKind/counts); доступ строго по permissions
Record-leveluser-area — только счета с HolderUserId = текущий пользователь; agency-area — только AgentCommission-счета агентов своего агентства
SourceIdОтдаётся как непрозрачная ссылка; расшифровка (начисление/поручение) — в rewards по своим permissions
РеквизитыБанковские реквизиты в wallet отсутствуют (ADR-0065 п.5)

Общие ошибки (все операции; коды не дублируются в файлах операций)

КодHTTP statusУсловие
ValidationError400Вход отклонён (формат/диапазоны/enum/paging)
UNAUTHORIZED401Нет/просрочен JWT
FORBIDDEN403Нет permission / чужой holder / чужой tenant

Свежесть данных (общее для read-операций)

Балансы и история обновляются асинхронно consumer-ами событий rewards (../consumers/rewards-commission-money-received.md, ../consumers/rewards-referral-accrual-status-changed.md, ../consumers/rewards-payout-order-status-changed.md): после смены статуса в rewards баланс догоняет за секунды (окно eventual-consistency). В этом окне пользователь может видеть статус «деньги получены» в rewards при ещё не пополненном балансе — это штатно и не является рассинхроном (детекторы рассинхрона — ADR-0021).

Связанные документы