Jaloliddin Musayev
К проектам
В активной разработке2025 — 2026ERP и финансы

Мультитенантная 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 тенанта и границы доступа, доменные сервисы работают внутри этого контекста. Каждое исходящее событие сначала пишется в таблицу-очередь в базе — поэтому при обрыве сети заказ не теряется.

Клиенты

Next.js admin panelFlutter mobile app

API и контроль доступа

ALL_DATA / OWN_BRANCH / OWN_DEPARTMENT / OWN_RECORDS

FastAPIJWT tenant contextRBACData scope

Доменные модули

Sales ordersInvoices & ARPaymentsCatalog & clients

Интеграция

SKIP LOCKED, повторы, восстановление задач

Outbox tableIntegration workerWMS adapter

Данные

PostgreSQLAlembic (23 revisions)

Технологии

Backend

Python 3.12FastAPISQLAlchemy 2.xPostgreSQLAlembicPydantic v2JWT / bcryptpytest

Веб

Next.jsReact 19TypeScriptTanStack QueryTanStack TableZustandRadix UI

Мобильные

FlutterDartDioSecure storage

Инфраструктура

Outbox workerAlembic migrationsCron / long-running worker

Моя роль

Архитектура backend и весь доменный слой, модель RBAC и data-scope, интеграционный воркер, админ-панель, мобильное приложение на Flutter.

Имена клиентов, домены и адреса серверов не раскрываются из соображений конфиденциальности.