Перейти к содержанию

08. Глоссарий: внутренняя бухгалтерия (общий ledger)

Этот документ объясняет простыми словами, как устроена внутренняя бухгалтерия OneWallet — без технических деталей и без кода. Здесь нет ничего о конкретных типах счетов, флагах или связанных операциях — это бизнес-описание, а не руководство разработчика.

Что такое ledger простыми словами

Ledger (по-русски — «общий ledger», «общая бухгалтерская книга») — это место, где система записывает каждое движение денег. Главный принцип — двойная запись:

На каждый «приход» обязательно есть «уход» в точно такой же сумме.

Если на одном счёте деньги прибавились, значит, на другом счёте они в этот же момент уменьшились — ровно на ту же сумму. Не бывает «деньги появились из ниоткуда» или «деньги пропали без следа».

Это не отчёт, который собирается раз в день. Это бухгалтерия в реальном времени: каждая операция мгновенно фиксируется как пара записей «откуда» — «куда». Каждый перевод, каждое пополнение, каждая комиссия, каждая выплата мерчанту — это две взаимосвязанные записи в общем ledger.

Какие счета бывают

Внутри ledger есть несколько типов счетов — все они с точки зрения бизнеса одинаково равноправны и подчиняются одним и тем же правилам.

  • Счета пользователей — личные кошельки клиентов. Здесь хранится «их собственный» баланс — то, что клиент видит в приложении.
  • Счета мерчантов и агентов — отдельные «карманы» для бизнес-партнёров (магазинов, поставщиков услуг, агентских сетей). Каждому мерчанту и агенту принадлежит свой счёт, и средства на нём принадлежат именно ему.
  • Транзитные счета (transit) — служебные сквозные счета, через которые проходят деньги во время операций. Например, во время приёма платежа через внешний банк или во время выплаты на банковскую карту.
  • Системные счета комиссий и фондов — сюда оседают сборы (комиссия за перевод, комиссия мерчанта) и резервы (страховой фонд, фонд возвратов).

Все они живут в одной книге и подчиняются одному правилу — двойной записи. Не существует «привилегированных» счетов, для которых правила бухгалтерии можно было бы обойти.

Что такое «операция» с точки зрения ledger

Любое движение денег в OneWallet — это операция. С точки зрения ledger операция всегда отвечает на три вопроса:

  1. Откуда ушли деньги (счёт-источник).
  2. Куда пришли деньги (счёт-получатель).
  3. Сколько именно — точная сумма до копейки (сатанга).

Если хотя бы на один из этих трёх вопросов нет ответа — операция не может быть проведена. Это не ограничение реализации, а свойство самой бухгалтерии: «приход без ухода» или «уход без прихода» не существует.

Сложные сценарии (например, «клиент платит мерчанту, и комиссия уходит в фонд») с точки зрения 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 на уровне реализации.