08. Глоссарий: внутренняя бухгалтерия (общий ledger)¶
Этот документ объясняет простыми словами, как устроена внутренняя бухгалтерия OneWallet — без технических деталей и без кода. Здесь нет ничего о конкретных типах счетов, флагах или связанных операциях — это бизнес-описание, а не руководство разработчика.
Что такое ledger простыми словами¶
Ledger (по-русски — «общий ledger», «общая бухгалтерская книга») — это место, где система записывает каждое движение денег. Главный принцип — двойная запись:
На каждый «приход» обязательно есть «уход» в точно такой же сумме.
Если на одном счёте деньги прибавились, значит, на другом счёте они в этот же момент уменьшились — ровно на ту же сумму. Не бывает «деньги появились из ниоткуда» или «деньги пропали без следа».
Это не отчёт, который собирается раз в день. Это бухгалтерия в реальном времени: каждая операция мгновенно фиксируется как пара записей «откуда» — «куда». Каждый перевод, каждое пополнение, каждая комиссия, каждая выплата мерчанту — это две взаимосвязанные записи в общем ledger.
Какие счета бывают¶
Внутри ledger есть несколько типов счетов — все они с точки зрения бизнеса одинаково равноправны и подчиняются одним и тем же правилам.
- Счета пользователей — личные кошельки клиентов. Здесь хранится «их собственный» баланс — то, что клиент видит в приложении.
- Счета мерчантов и агентов — отдельные «карманы» для бизнес-партнёров (магазинов, поставщиков услуг, агентских сетей). Каждому мерчанту и агенту принадлежит свой счёт, и средства на нём принадлежат именно ему.
- Транзитные счета (transit) — служебные сквозные счета, через которые проходят деньги во время операций. Например, во время приёма платежа через внешний банк или во время выплаты на банковскую карту.
- Системные счета комиссий и фондов — сюда оседают сборы (комиссия за перевод, комиссия мерчанта) и резервы (страховой фонд, фонд возвратов).
Все они живут в одной книге и подчиняются одному правилу — двойной записи. Не существует «привилегированных» счетов, для которых правила бухгалтерии можно было бы обойти.
Что такое «операция» с точки зрения ledger¶
Любое движение денег в OneWallet — это операция. С точки зрения ledger операция всегда отвечает на три вопроса:
- Откуда ушли деньги (счёт-источник).
- Куда пришли деньги (счёт-получатель).
- Сколько именно — точная сумма до копейки (сатанга).
Если хотя бы на один из этих трёх вопросов нет ответа — операция не может быть проведена. Это не ограничение реализации, а свойство самой бухгалтерии: «приход без ухода» или «уход без прихода» не существует.
Сложные сценарии (например, «клиент платит мерчанту, и комиссия уходит в фонд») с точки зрения ledger — это несколько простых операций, выполняемых одновременно и неразрывно. Если хотя бы одна из них не может пройти, не проходит ни одна.
Почему сумма по транзитным счетам всегда 0¶
Транзитные счета — это сквозные счета. Деньги через них проходят, но не задерживаются. Так устроена бизнес-логика: транзит — это «коридор», а не «комната».
Что это значит на практике:
- Когда клиент пополняет кошелёк, деньги сначала «приходят» на транзитный счёт от внешнего банка, а затем «уходят» с него на личный счёт клиента.
- Когда клиент платит мерчанту, сумма проходит через транзит от клиента к мерчанту.
- Что ушло с одного транзитного счёта — обязательно пришло на счёт пользователя, мерчанта или другого транзита.
Сумма по всем транзитным счётам в любой момент времени равна нулю. Это не цель и не желаемое состояние — это гарантия, которую обеспечивает сама конструкция ledger. Если эта сумма хоть на копейку отклонится от нуля — это значит, что где-то деньги «зависли», «потерялись» или «удвоились». Такого в системе случиться не может: правило двойной записи делает это математически невозможным.
Поэтому фраза «transit = 0» — это не пожелание, а главный финансовый инвариант OneWallet.
Почему это важно для бизнеса¶
Использование строгой двойной записи в реальном времени даёт три ключевые гарантии для бизнеса.
1. Гарантия целостности¶
В любой момент времени баланс системы сходится. Сумма «активов» (того, что должны клиентам, мерчантам, агентам) всегда равна сумме «обязательств и резервов». Нет ситуаций, когда бухгалтерия «съехала» и приходится искать ошибку вручную.
2. Возможность аудита¶
Каждая операция оставляет полный след: видно, откуда деньги пришли, куда ушли, в каком порядке, в какой момент. Аудитор, регулятор или служба поддержки может восстановить всю историю любого платежа по записям ledger — без догадок и без обращения к «исходным» системам.
3. Невозможно «потерять» или «удвоить» деньги¶
Двойная запись + правило transit = 0 означают, что:
- ни один рубль (бат) не может «исчезнуть» — он либо на счёте клиента, либо на счёте мерчанта, либо в фонде комиссий;
- ни один рубль (бат) не может «удвоиться» — нельзя записать «приход» без соответствующего «ухода» в той же сумме.
С точки зрения комплаенса и регулятора это означает: система по построению не допускает класса ошибок, ради борьбы с которыми обычно строят сложные сверки и ночные джобы.
Простые примеры из жизни¶
Чтобы стало понятнее, как работает двойная запись на практике — несколько типичных сценариев OneWallet, переведённых на язык ledger.
Пример 1. Перевод между двумя клиентами¶
Клиент А переводит клиенту Б 1 000 батов.
- На счёте клиента А — «уход» 1 000 батов.
- На счёте клиента Б — «приход» 1 000 батов.
Сумма «приход – уход» по всем затронутым счетам равна нулю. Деньги не появились и не исчезли — они переместились.
Пример 2. Пополнение кошелька через внешний банк¶
Клиент пополняет кошелёк на 500 батов через банк-партнёр.
- На транзитном счёте — «приход» 500 батов (со стороны внешнего банка).
- С транзитного счёта — «уход» 500 батов на личный счёт клиента.
В итоге: на счёте клиента стало на 500 больше; на транзитном счёте — снова ровно ноль. Транзит выполнил свою роль «коридора» и вернулся в исходное состояние.
Пример 3. Платёж мерчанту с комиссией¶
Клиент платит мерчанту 1 000 батов; комиссия системы — 20 батов.
- Со счёта клиента уходит 1 000 батов.
- На счёт мерчанта приходит 980 батов.
- На счёт фонда комиссий приходит 20 батов.
Сумма «приходов» (980 + 20 = 1 000) точно равна «уходу» (1 000). Никаких «комиссий из воздуха» и «недостающих» батов.
Что это значит для команды¶
- Для продакта: любую новую операцию (новый тип платежа, новая комиссия, новый сценарий выплаты) можно описать в терминах «откуда» — «куда» — «сколько». Если в бизнес-описании не получается ответить на эти три вопроса — операцию ещё рано отдавать в разработку.
- Для поддержки: на любой вопрос «куда делись мои деньги?» можно дать ответ по записям ledger. История не теряется.
- Для финансов: отчётность строится непосредственно из ledger, без промежуточных сверок.
- Для безопасности и комплаенса: инвариант «
transit = 0» можно проверять автоматически в любой момент — это встроенный индикатор здоровья системы.
Где это в коде¶
Техническое устройство счетов, типов транзакций и инвариантов ledger описано в документации для разработчиков:
- ../dev/architecture/05-tigerbeetle-accounts.md — устройство счетов внутренней бухгалтерии: какие бывают, как именуются, как обеспечивается инвариант
transit = 0на уровне реализации.