WisePerformer: мультитенантная SaaS ERP для цехового производства. Техкарты, QR-корзины, таймер операций, пооперационная зарплата, себестоимость изделия и прогноз закупки. Идея проверена тремя прототипами июля 2024, продукт 2026 построен соло по инженерной методике. Инженерная планка: 272 автотеста бэкенда + 11 фронтенда, все зелёные.
Вся концепция продукта записана ещё в июле 2024: QR-учёт операций, пооперационная зарплата, мониторинг загрузки, статистика. Три прототипа проверили идею. Через полтора года она стала боевым мультитенантным SaaS.
17 моделей БД в одном файле. README уже описывает весь продукт: QR-учёт времени, пооперационная оплата, прогноз загрузки.
Однодневный спайк по auth, затем настоящий SPA-split: Django + DRF + JWT в httpOnly cookie, React + MUI. Меню менеджера из 6 плиток. Работала 1 из 6.
Идея ждала. Шесть плиток прототипа оставались письменным обещанием.
Сначала бренд и лендинг, затем ERP: 8 Django-приложений, schema-per-tenant, React 19 SPA, Grafana, Traefik.
272 зелёных автотеста, дизайн-токены лендинга, тёмная тема, runbook make demo. Продукт готов показывать себя.
Меню руководителя, нарисованное в прототипе ProductERP 13 июля 2024, оказалось роадмапом. Пять из шести плиток тогда были заглушками. В 2026 работают все шесть.
У каждой компании-клиента свой поддомен и своя схема PostgreSQL.
Traefik маршрутизирует поддомен, middleware Django переключает
search_path на каждый запрос, а в public-схеме живут только
auth и реестр компаний. Аналитика собрана в отдельных SQL-view, которые читает Grafana.
Главный сценарий продукта. Корзина с деталями идёт по цеху, и каждый шаг пишет в одну базу: выпуск, склад, зарплату, аналитику.
ERP для цехов, которые шьют или собирают партиями: цех работает с корзинами и таймером, менеджер с заказами, себестоимостью и зарплатой, владелец смотрит дашборды.
На каждой корзине напечатан QR. Рабочий сканирует его камерой и получает точную следующую операцию из техкарты, с видеоинструкцией и нормативом времени. Старт, пауза, стоп, брак с фото. Констрейнт БД: одна активная операция на корзину. Продолжения переносят время без двойного счёта.
Чистые отработанные секунды на ставку сотрудника, сверхурочные по дням с настраиваемым округлением. Расчётные периоды: draft, calculated, approved, paid, с корректировками и вычисляемым балансом. В расшифровке выплаты виден каждый запуск операции.
Материалы по нормам техкарты на закупочную цену, плюс работа: нормативы операций на часовую ставку, с индивидуальными ставками операций. Неполные данные превращаются в предупреждение, а не в тихий ноль. Демо-изделие: 425 материалы + 152.50 работа = 577.50 за единицу.
Остатки через движения, резервы под заказы, автосписание при выпуске корзины. Выпуск фиксируется один раз, на финальной операции техкарты. Прогноз расхода отвечает на настоящий вопрос: через сколько дней закончится материал и сколько закупить на горизонт.
Отделы, роли и права на модули, статусы сотрудников, рабочие расписания. У каждого сотрудника история работы: какие операции, сколько времени, с каким качеством. Права раздаются по модулям: view, edit, delete.
Аналитические view живут в PostgreSQL внутри схемы каждого тенанта. Grafana показывает выработку по отделам, эффективность сотрудников и план-факт; iframe переключает тему вместе с приложением.
Продукт в развитии держится не на героизме, а на дисциплине. Каждая гарантия записана кодом: тестом, констрейнтом БД или дефолтом конфигурации.
Полный прогон pytest на PostgreSQL и Vitest + MSW на фронте. У логики зарплаты, склада и производственного факта отдельные тестовые файлы на изолированных базах.
Интеграционный тест ведёт корзину через API таймера от скана до выпуска и проверяет, что склад списан, а зарплата начислена. Плюс чистый makemigrations check.
TypeScript на всём фронте, прод-сборка с проверкой типов, 0 ошибок в консоли браузера на всех экранах в обеих темах.
Мультитенантная изоляция fail-closed: middleware не пускает запрос без явной схемы тенанта. IsAuthenticated по умолчанию для API, права на модули для каждого сотрудника.
Одна активная операция на корзину как partial unique index. Выпуск фиксируется один раз, на финальной операции. Списание склада идемпотентно: повторный вызов не спишет дважды.
Одна команда поднимает PostgreSQL, Django, Grafana и демо-данные с 346 запусками операций. Стек разворачивается за минуты на чистой машине.
Продукт написан одним человеком по инженерной методике: ТЗ на каждую задачу, автотесты, runbook и документация. Человек ставит задачу, проверяет результат и держит планку. Тесты и типизация - это контракт, который делает такую скорость безопасной.
Один файл токенов питает и тему antd, и CSS-переменные самодельных таблиц. Тот же неоновый синий, тот же DM Sans, та же монограмма WP, что на сайте продукта. Эта страница выдержана в том же стиле.
tokens.ts из лендинга: акцент #3D7CFF, тёмно-синяя шкала, радиус 12, самохостящийся DM Sans. Питает ConfigProvider antd и CSS-переменные самодельных таблиц одновременно.
Светлая и тёмная темы с переключателем в шапке. Сайдбар фирменно-тёмный в обеих. Iframe Grafana переключает тему вместе с приложением, kiosk-режим без лишней рамки.
Монограмма WP и фавикон, сгруппированное меню, хлебные крошки с названием компании, русская локаль. Экран статистики встраивает запровижиненные дашборды: пользователь не вводит никакие UID.
Смысл кейса не только в фичах. Смысл в конвейере, который держит скорость прототипа и планку продукта одновременно.
Настоящий домен: цех, деньги, склад. Техкарты, QR-поток, пооперационная зарплата и себестоимость собраны в один контур данных, где каждый час работы виден и посчитан.
Три прототипа проверили идею. Боевая мультитенантная ERP построена соло: 8 приложений, ~110 API-операций, 10 экранов.
272 + 11 зелёных автотестов, типизированная сборка, безопасные дефолты, дизайн-система и runbook make demo. Цифры вместо прилагательных.
WisePerformer - мой собственный продукт в развитии. Этот кейс показывает мой почерк: продуктовое мышление, скорость и инженерная дисциплина в одном контуре. Если вашему проекту нужен такой же подход, напишите.