Пример организации баланса пользователей и операций с ним. В репозитории пример решения прикладной задачи связанной с хранением баланса клиентов абстрактного веб-сайта.
Целевая аудитория — разработчики, которым малый бизнес поставил задачу сделать на сайте или в мобильном приложении простую бонусную программу или внутренние счета, но не захотел покупать готовые отраслевые решения или экспертизу команд специализирующихся на финтехе.
Для бизнеса требуется хранить баланс своих клиентов. Для каждого аккаунта возможны операции списания и начисления бонусов. У пользователя может быть только один счёт. В зависимости от настроек начисленные бонусы могут сгорать через N дней. Вопросы пополнения \ списания в данном примере не расматриваются. Граница пролегает по API сервиса к которому поступают команды на управление балансом.
- Описание предметной области.
- Теоретическая часть про учёт денег.
- Термины предметной области.
- Требования к функциональности примера.
- Описание подхода к реализации сервиса.
- Схема базы данных с демонстрационными данными и характерными SQL-запросами.
- Пример реализации функционала на фреймворке Symfony в виде API-first сервиса. (А надо????)
Совет от Phil Delgyado, [16 Nov 2023 at 01:10:16]
Основное - хранить не только балансы, но и первичку, использовать транзакции, не использовать float для хранения денег, внимательно читать документацию по СУБД, в особенности про те же самые транзакции.
Ну и совещаться с юристами, там больше всего рисков )
- Увлекательная бухгалтерия для программистов
- 📺 Как правильно считать деньги в базе данных / Роман Друзягин (404 Group)
- 📺 Платежная система за год / Филипп Дельгядо (Информационные технологии и системы)
- 📺 Филипп Дельгядо — СУБД: индивидуальный пошив и подгонка по фигуре
- 📺 Кошелек с нуля в 2020 году: технологии, вызовы, решения / Филипп Дельгядо (OpenWay Group)
- 📺 Архитектура платежной системы: почти enterprise / Филипп Дельгядо
Сущность, которая хранит монетарный баланс и имеет уникальный идентифиатор.
Классифиатор, который позволяет указать для чего конкретный счёт может быть использован: счет пользователя, виртуальный счёт системы, условный счёт предназначенный для «ввода\вывода» денежных средств из или в систему.
Под владельцем счёта может выступать как конкретный пользователь, система, так и юр.лицо, например.
Классифиатор, который позволяет указать по ккакому признаку объеденены владельцы счетов, например, это юр.лица или физ-лица.
транзакции с точки зрения бизнеса (начисления, списания, сгорание бонусов, ручное пополнение, ручное списание и т.д) которые требуется различать для отчётности и по разному обрабатывать.
период, за который данныне могут быть проверены на консистентность или выгружены в виде отчётов, обычно выбирается сутки
Журнал проводок для фиксации в виде двойной бухгалтерской записи.
Список задач с т.з. бизнеса которыми меняется состояние счетов. Пример: начисление по счёту за успешно выполненный заказ.
В этом разделе собираем требования к системе сгруппированные по сущностям и функциональным блокам.
- Счёт может быть в состоянии: активный или заблокирован, если счёт заблокирован, то операции по нему невозможны
- Счёт обслуживает поступления и списания только в одной валюте.
- По счёту возможен овердрафт: можно уйти в минус.
- Под пользователем понимается его уникальный идентификатор uuid
- У организации может быть до 10 000 000 пользователей.
- Пользователи могут создаваться и блокироваться в процессе операционной деятельности организации, блокирование пользователя приводит к блокированию связанного с ним счёта.
- Операция начисления производит начисление указанной суммы на счёт пользователя
- Операция списания производит списание указанной суммы со счёта пользователя
- Предполагаемая нагрузка составит менее 100 операций в секунду.
- Общая сумма денежных средств на активных и заблокированных счетах
- Баланс по конкретному счёту
- История операций по конкретному счёту
- Оборот начислений и списаний с группировкой по дням
- Оборот начислений и списаний с группировкой по неделям
- Оборот начислений и списаний с группировкой по месяцам
- Количество созданных и заблокированных счетов с группировкой по дням
- Количество созданных и заблокированных счетов с группировкой по неделям
- Количество созданных и заблокированных счетов с группировкой по месяцам
- Использование двойной бухгалтерской записи
- Использование реляционной СУБД