Кейс WisePerformer
ENRU
WisePerformer
Собственный продукт · SaaS ERP
Кейс - собственный продукт в развитии

SaaS ERP цехового производства.
Каждый час работы виден и посчитан.

WisePerformer: мультитенантная SaaS ERP для цехового производства. Техкарты, QR-корзины, таймер операций, пооперационная зарплата, себестоимость изделия и прогноз закупки. Идея проверена тремя прототипами июля 2024, продукт 2026 построен соло по инженерной методике. Инженерная планка: 272 автотеста бэкенда + 11 фронтенда, все зелёные.

Django 5.2 + DRFPostgreSQL 16 · schema-per-tenantReact 19 + Ant Design 6 GrafanaTraefik v3pytest · Vitest + MSW
8 / 45+
Django-приложений / моделей БД
~110
API-операций за React SPA
10
экранов SPA: от цеха до зарплаты
~40K
строк кода: ~25K Python + ~15K TS
3
прототипа июля 2024 проверили идею
272 + 11
автотестов backend + frontend, все зелёные
01 Линейка 2024 - 2026

Идея пережила три прототипа и паузу в 17 месяцев

Вся концепция продукта записана ещё в июле 2024: QR-учёт операций, пооперационная зарплата, мониторинг загрузки, статистика. Три прототипа проверили идею. Через полтора года она стала боевым мультитенантным SaaS.

8-12 июля 2024

SewingERP

17 моделей БД в одном файле. README уже описывает весь продукт: QR-учёт времени, пооперационная оплата, прогноз загрузки.

12-19 июля 2024

basketerp + ProductERP

Однодневный спайк по auth, затем настоящий SPA-split: Django + DRF + JWT в httpOnly cookie, React + MUI. Меню менеджера из 6 плиток. Работала 1 из 6.

Пауза

~17 месяцев

Идея ждала. Шесть плиток прототипа оставались письменным обещанием.

Дек 2025 - фев 2026

WisePerformer

Сначала бренд и лендинг, затем ERP: 8 Django-приложений, schema-per-tenant, React 19 SPA, Grafana, Traefik.

Июль 2026

Инженерная полировка

272 зелёных автотеста, дизайн-токены лендинга, тёмная тема, runbook make demo. Продукт готов показывать себя.

6 плиток меню 2024 = 6 рабочих модулей 2026

Меню руководителя, нарисованное в прототипе ProductERP 13 июля 2024, оказалось роадмапом. Пять из шести плиток тогда были заглушками. В 2026 работают все шесть.

Управление сотрудниками (плитка, 2024)
Модуль HR: отделы, роли, права на модули, статусы
Управление производством (заглушка)
Заказы и QR-корзины: планирование, печать, распределение
Распределение загрузки (заглушка)
Планы производства + таймер операций в цеху
Технические карты (заглушка)
Изделия, операции с нормативами и видео, материалы
Статистика (заглушка)
Аналитические view в PostgreSQL + 2 дашборда Grafana
Склад (заглушка)
Остатки, движения, резервы, прогноз закупки
3прототипа, июль 2024
17моделей в первый день SewingERP
~17 меспауза между поколениями
8Django-приложений в боевой ERP
1автор всей линейки
02 Архитектура

Мультитенантность по схемам: одна платформа, изолированная схема на компанию

У каждой компании-клиента свой поддомен и своя схема PostgreSQL. Traefik маршрутизирует поддомен, middleware Django переключает search_path на каждый запрос, а в public-схеме живут только auth и реестр компаний. Аналитика собрана в отдельных SQL-view, которые читает Grafana.

ОДНА ПЛАТФОРМА · ПОДДОМЕН И СХЕМА НА КОМПАНИЮ React 19 SPA 10 экранов · Ant Design 6 TanStack Query · Vite QR-сканер: html5-qrcode company.wiseperformer.com session auth + CSRF Traefik v3 TLS-терминация роутинг поддоменов auth-стек + стек компании на одном VPS Django 5.2 + DRF 8 приложений · ~110 API TenantSchemaMiddleware: SET search_path на запрос изоляция fail-closed PostgreSQL 16 public: auth, компании схема на тенанта: 45+ моделей, 43 миграции analytics: 3 MV + 5 view опционально отдельная auth-БД Grafana OSS 2 дашборда: выработка, эффективность, план-факт iframe в тон темы дашборды встроены в экран статистики аналитические view в схеме тенанта
Клиентская часть Сервисы платформы Данные

Контур цеха: от напечатанного QR до зарплаты

Главный сценарий продукта. Корзина с деталями идёт по цеху, и каждый шаг пишет в одну базу: выпуск, склад, зарплату, аналитику.

1 · Печать QR у каждой физической корзины свой QR-токен; печатается с экрана производства 2 · Скан на посту рабочий сканирует камерой; контекст: заказ, изделие, следующая операция техкарты 3 · Таймер операции старт, пауза, стоп; журнал событий; констрейнт БД: одна активная операция на корзину 4 · Брак фиксируется с фото; вычитается из выпуска корзины 5 · Выпуск, один раз фиксируется только на финальной операции техкарты: план минус суммарный брак 6 · Списание склада материалы по нормам техкарты; резервы из active в fulfilled; идемпотентно 7 · Зарплата чистое время x ставка; сверхурочные по дням; периоды: расчёт, утверждение, выплата Аналитика выработка по отделам, эффективность сотрудников, план-факт в Grafana каждое событие пишется в схему тенанта; аналитика читает те же строки
Шаги цеха Эффекты: деньги и склад Аналитика
8Django-приложений
45+моделей БД
~110API-операций
3 + 5materialized views + SQL views
2дашборда Grafana
43миграции БД
03 Продукт

Что WisePerformer делает в цеху

ERP для цехов, которые шьют или собирают партиями: цех работает с корзинами и таймером, менеджер с заказами, себестоимостью и зарплатой, владелец смотрит дашборды.

QR-корзины и таймер операций

На каждой корзине напечатан QR. Рабочий сканирует его камерой и получает точную следующую операцию из техкарты, с видеоинструкцией и нормативом времени. Старт, пауза, стоп, брак с фото. Констрейнт БД: одна активная операция на корзину. Продолжения переносят время без двойного счёта.

Пооперационная зарплата

Чистые отработанные секунды на ставку сотрудника, сверхурочные по дням с настраиваемым округлением. Расчётные периоды: draft, calculated, approved, paid, с корректировками и вычисляемым балансом. В расшифровке выплаты виден каждый запуск операции.

Себестоимость изделия

Материалы по нормам техкарты на закупочную цену, плюс работа: нормативы операций на часовую ставку, с индивидуальными ставками операций. Неполные данные превращаются в предупреждение, а не в тихий ноль. Демо-изделие: 425 материалы + 152.50 работа = 577.50 за единицу.

Склад с прогнозом закупки

Остатки через движения, резервы под заказы, автосписание при выпуске корзины. Выпуск фиксируется один раз, на финальной операции техкарты. Прогноз расхода отвечает на настоящий вопрос: через сколько дней закончится материал и сколько закупить на горизонт.

HR с историей работы

Отделы, роли и права на модули, статусы сотрудников, рабочие расписания. У каждого сотрудника история работы: какие операции, сколько времени, с каким качеством. Права раздаются по модулям: view, edit, delete.

Аналитика план/факт в Grafana

Аналитические view живут в PostgreSQL внутри схемы каждого тенанта. Grafana показывает выработку по отделам, эффективность сотрудников и план-факт; iframe переключает тему вместе с приложением.

Главный дашборд с виджетами модулей
Дашборд: 7 живых виджетов, от плана производства до складских алертов, один сводный эндпоинт.
Экран таймера операций со сканированием QR
Таймер операций: скан корзины, видеоинструкция, таймер, фиксация брака.
Экран техкарты с вкладкой себестоимости
Техкарта с вкладкой себестоимости: материалы плюс работа, цена единицы с предупреждениями о пробелах.
Экран расчёта зарплаты менеджером
Зарплата: вкладка менеджера ведёт полный цикл от расчётного периода до выплаты.
Экран HR с сотрудниками и правами
HR: отделы, роли, права по модулям, история работы с честным счётом обработанного.
Экран склада с остатками и прогнозом закупки
Склад: остатки, резервы, прогноз дней до обнуления и рекомендация закупки.
04 Инженерная культура

Тесты, типизация, безопасные дефолты

Продукт в развитии держится не на героизме, а на дисциплине. Каждая гарантия записана кодом: тестом, констрейнтом БД или дефолтом конфигурации.

272 + 11 автотестов, все зелёные

Полный прогон pytest на PostgreSQL и Vitest + MSW на фронте. У логики зарплаты, склада и производственного факта отдельные тестовые файлы на изолированных базах.

Сквозной сценарий как тест

Интеграционный тест ведёт корзину через API таймера от скана до выпуска и проверяет, что склад списан, а зарплата начислена. Плюс чистый makemigrations check.

Типизированная сборка

TypeScript на всём фронте, прод-сборка с проверкой типов, 0 ошибок в консоли браузера на всех экранах в обеих темах.

Безопасные дефолты

Мультитенантная изоляция fail-closed: middleware не пускает запрос без явной схемы тенанта. IsAuthenticated по умолчанию для API, права на модули для каждого сотрудника.

Инварианты живут в БД

Одна активная операция на корзину как partial unique index. Выпуск фиксируется один раз, на финальной операции. Списание склада идемпотентно: повторный вызов не спишет дважды.

Runbook: make demo

Одна команда поднимает PostgreSQL, Django, Grafana и демо-данные с 346 запусками операций. Стек разворачивается за минуты на чистой машине.

Как это строилось

Соло, по инженерной методике

Продукт написан одним человеком по инженерной методике: ТЗ на каждую задачу, автотесты, runbook и документация. Человек ставит задачу, проверяет результат и держит планку. Тесты и типизация - это контракт, который делает такую скорость безопасной.

272теста pytest, все зелёные
11тестов Vitest + MSW
0ошибок в консоли браузера
346запусков операций в демо-сиде
05 Дизайн-система

ERP продолжает лендинг: токены, тёмная тема, монограмма

Один файл токенов питает и тему antd, и CSS-переменные самодельных таблиц. Тот же неоновый синий, тот же DM Sans, та же монограмма WP, что на сайте продукта. Эта страница выдержана в том же стиле.

Один источник токенов

tokens.ts из лендинга: акцент #3D7CFF, тёмно-синяя шкала, радиус 12, самохостящийся DM Sans. Питает ConfigProvider antd и CSS-переменные самодельных таблиц одновременно.

Тёмная тема в обе стороны

Светлая и тёмная темы с переключателем в шапке. Сайдбар фирменно-тёмный в обеих. Iframe Grafana переключает тему вместе с приложением, kiosk-режим без лишней рамки.

Детали, из которых складывается продукт

Монограмма WP и фавикон, сгруппированное меню, хлебные крошки с названием компании, русская локаль. Экран статистики встраивает запровижиненные дашборды: пользователь не вводит никакие UID.

1файл токенов на antd и CSS
2темы: светлая и тёмная
2дашборда Grafana из коробки
0ошибок и предупреждений в консоли
Экран статистики в тёмной теме со встроенными дашбордами Grafana
Статистика в тёмной теме: запровижиненные дашборды Grafana в iframe с синхронизацией темы, kiosk-режим.
06 Методика и стек

Как ведётся собственный продукт

Смысл кейса не только в фичах. Смысл в конвейере, который держит скорость прототипа и планку продукта одновременно.

  1. Сначала прототип, потом стройка. Идея проверена тремя прототипами июля 2024. Мультитенантная архитектура строилась только после того, как README 2024 года зафиксировал сценарии и сущности.
  2. Инварианты живут в БД. Одна активная операция на корзину, транзакции и блокировки строк, идемпотентное списание. То, что должно быть верным всегда, записано констрейнтом, а не комментарием.
  3. Тесты как контракт. 272 + 11 автотестов, отдельные файлы у логики денег, изолированные тестовые базы, сквозной сценарий корзины. Зелёный прогон - условие любого мержа.
  4. Финал глазами. После зелёных тестов живой проход по всем экранам в обеих темах, скриншоты и демо-данные. Продукт должен выглядеть как продукт, а не как стенд.

Стек

Python 3.12Django 5.2DRFPostgreSQL 16 psycopg 3schema-per-tenantpytest React 19TypeScriptVite 7Ant Design 6 TanStack Queryhtml5-qrcodeVitest + MSW

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

Docker ComposeTraefik v3Grafana OSS Let's Encryptподдомен на компанию

Темп

3 прототипа ERP: 8 Django-приложений по инженерной методике, проверено человеком
07 Итог

Что показывает этот кейс

Продукт

Настоящий домен: цех, деньги, склад. Техкарты, QR-поток, пооперационная зарплата и себестоимость собраны в один контур данных, где каждый час работы виден и посчитан.

Скорость

Три прототипа проверили идею. Боевая мультитенантная ERP построена соло: 8 приложений, ~110 API-операций, 10 экранов.

Культура

272 + 11 зелёных автотестов, типизированная сборка, безопасные дефолты, дизайн-система и runbook make demo. Цифры вместо прилагательных.

Kirill Sedov

WisePerformer - мой собственный продукт в развитии. Этот кейс показывает мой почерк: продуктовое мышление, скорость и инженерная дисциплина в одном контуре. Если вашему проекту нужен такой же подход, напишите.

Написать в LinkedIn