Мультитенантная ERP-платформа
ERP из одной кодовой базы для множества компаний: продажи, дебиторка, счета и надёжная передача заказов в складскую систему.
- 584
- файла кода
- 23
- миграции БД
- 4
- уровня доступа
- 2
- режима тенанта
Проблема
Строить отдельную систему для каждой компании — дорого и неподдерживаемо. Но посадить всех в одну общую базу — риск, что одна компания увидит данные другой. Плюс дебиторка велась в Excel: не было единого источника правды по тому, кто сколько должен и когда оплачен счёт.
Решение
Контекст тенанта передаётся в JWT, а компания может работать в режиме `shared` или `dedicated` — без переписывания доменного слоя. Доступ двумерный: роль определяет, что можно делать, data-scope — какие данные видно; один и тот же endpoint возвращает разное руководителю филиала и торговому агенту. Дебиторка смоделирована полностью: жизненный цикл счёта, разнесение платежей по счетам, aging по срокам и акт сверки с клиентом.
Ключевые возможности
- Мультитенантность: компания работает в `shared` или `dedicated` базе, выбор не затрагивает доменный код
- Четыре уровня data-scope: все данные / свой филиал / свой отдел / только свои записи
- Полный жизненный цикл заказа на продажу — от черновика до выполнения
- Дебиторка: счёт черновик → выставлен → оплачен, разнесение платежей и отчёт aging по срокам
- Акт сверки с клиентом: хронологические строки счетов и платежей с примечаниями по разнесению
- Outbox pattern: заказ уходит в складскую систему через очередь, `FOR UPDATE SKIP LOCKED` разводит параллельные воркеры
- Восстановление после сбоя: зависшие задачи автоматически возвращаются в очередь по таймауту
- 23 миграции Alembic — история схемы полностью версионирована и обратима
- Админ-панель на Next.js и мобильное приложение на Flutter для полевых продаж
Архитектура
Запрос достаёт из JWT тенанта и границы доступа, доменные сервисы работают внутри этого контекста. Каждое исходящее событие сначала пишется в таблицу-очередь в базе — поэтому при обрыве сети заказ не теряется.
Клиенты
API и контроль доступа
ALL_DATA / OWN_BRANCH / OWN_DEPARTMENT / OWN_RECORDS
Доменные модули
Интеграция
SKIP LOCKED, повторы, восстановление задач
Данные
Технологии
Backend
Веб
Мобильные
Инфраструктура
Моя роль
Архитектура backend и весь доменный слой, модель RBAC и data-scope, интеграционный воркер, админ-панель, мобильное приложение на Flutter.
Имена клиентов, домены и адреса серверов не раскрываются из соображений конфиденциальности.