ADR-0005: Financial Ledger И Double-Entry Accounting
Статус
Accepted
Контекст
Финансовые и учетные изменения требуют полной воспроизводимости, аудируемости и защиты от частичных ошибок. Простое хранение текущего итога в одном mutable поле не позволяет корректно объяснить происхождение изменений, безопасно восстанавливать состояние и проводить reconciliation.
Решение
Использовать immutable ledger-модель:
LedgerTransactionописывает бизнес-операцию;LedgerEntryфиксирует проводку;- одна бизнес-операция может содержать несколько связанных entries;
- исправления выполняются компенсирующими проводками, а не
UPDATEсуществующих записей; - итоговые суммы вычисляются из ledger или из документированной materialized projection.
Последствия
- Любое финансовое изменение получает audit trail и reason.
- Прямое редактирование итоговых сумм запрещено.
- Reconciliation и расследование расхождений становятся стандартной частью эксплуатации.
- API, jobs и consumers обязаны работать с idempotency и transaction boundary.
Обратные ссылки
Автоссылки: где используется этот документ.
- Домен (CQRS) (2): Entity / Aggregate: LedgerTransactionEntity (+ LedgerEntryEntity), Entity / Aggregate: WalletAccountEntity
- API (1): Wallet API — реестр операций и общие контрактные модели
- Use Cases (1): UC-WLT-005. Оператор ПИН смотрит журнал проводок счёта (сверка)
- adr (2): ADR-0065 — контекст wallet (внутренние балансы и ledger), ADR-0066 — удержание ПИН и реферальные ставки
- index.md (1): Wallet Service