Double-entry ledger¶
Раздел 05 · Редакционный стандарт
Тип материала — референсная архитектура. HYPOTHETICAL — схемы и операции. INFERENCE — инженерные рекомендации и критерии выбора. Внешние контракты ограничены источниками ниже.
Бизнес-задача¶
Сохранить воспроизводимую историю финансовых обязательств и движений.
Требования¶
Балансировать signed legs по journal и валюте. Использовать minor units с версией currency scale. Закрывать период по утверждённому cut.
Поток данных и владение состоянием¶
flowchart LR
A["Command"] --> B["Posting service"]
B --> C["Ledger DB"]
C --> D["Balance view"]
D --> E["Reconciliation"]
Posted journal и legs авторитетны. План счетов и правила версионируются.
Транзакционные границы¶
Одна транзакция фиксирует journal, все legs и operation identity. Межвалютный перевод требует сбалансированной группы на каждую валюту через FX accounts.
Порядок и идемпотентность¶
Unique business ID и payload comparison. Не использовать sequence как доказательство полноты commit.
Нормальная последовательность¶
sequenceDiagram
participant A as Command
participant B as Posting service
participant C as Ledger DB
participant D as Balance view
A->>B: Request posting by operation ID
B->>C: Validate and commit all journal legs
C-->>B: Return journal identity
B->>D: Apply committed account revision
Отказ и восстановление¶
sequenceDiagram
participant B as Posting service
participant C as Ledger DB
participant E as Recovery operator
B->>C: Commit balanced journal but lose ACK
Note over B,C: Outcome becomes uncertain
E->>C: Find journal by original operation ID
E->>B: Resume from verified boundary
Crash до commit убирает обе legs. Lost ACK разрешается lookup того же ID. При restore проверить coverage перед публикацией.
Сверка¶
Нулевая сумма пропускает сбалансированный дубль. Дополнительно сравнить source facts и операции.
Контракт хранения. Journal header содержит tenant, operation ID, request fingerprint, effective date и rule version. Legs содержат account, currency и signed amount. Guard scope включает юридическое лицо и валюту. Проверку суммы legs на commit можно обеспечить контролируемой процедурой и deferred validation. Уникальность journal ID и replay-safe operation identity проверяются независимо. Фиксируйте момент posting отдельно от даты хозяйственной операции.
Наблюдаемость¶
Unbalanced journals, missing source IDs, расхождение балансов.
Безопасность и применимость требований¶
Разделить доступ к posting и corrections. Сохранить основание reversal.
Альтернативы и trade-offs¶
Relational DB облегчает атомарность. Межшардовый перевод требует модели обязательств.
Вопросы на собеседовании¶
Может ли balanced journal быть неверным? Да, например при повторной проводке или неправильном счёте.