Аналитическая панель поверх ERP
Панель, которая читает выгрузку из ERP, чистит её и позволяет собрать новый отчёт без разработчика. Внедрена в двух дистрибьюторских компаниях.
- 2
- внедрения
- 291
- коммитов
- 338
- файла кода
- 0
- ручных отчётов в Excel
Проблема
Из ERP данные выходили только сырой выгрузкой. Руководство каждую неделю по несколько часов вручную собирало отчёт в Excel, каждый отдел просил свой разрез, и под каждый новый разрез снова требовался разработчик. Формулы копировались из файла в файл, и цифры переставали сходиться.
Решение
Построил конвейер импорта, который загружает файл выгрузки, валидирует его и хранит историю. Сверху — конструктор отчётов с drag & drop: пользователь сам перетаскивает измерения и метрики, собирает новый разрез и выгружает его в оформленный Excel. Один раз построенный продукт был адаптирован для второй компании на уровне настроек.
Ключевые возможности
- Импорт .xlsx и .csv — валидация, поиск дубликатов, хранение истории загрузок
- Конструктор отчётов drag & drop: новый разрез создаётся и сохраняется без разработчика
- Экспорт в оформленный Excel — отчёт уходит руководству в готовом виде
- Интерактивные графики и панели показателей
- Отметка присутствия сотрудников по QR-коду
- Две схемы аутентификации: сессия для веба и отдельный JWT API для мобильного приложения
- Тёмная и светлая тема, полная адаптация под мобильные
- CI/CD: push в `main` → GitHub Actions → автоматическая сборка и рестарт на сервере, параллельно деплой на Vercel
- Один продукт в двух компаниях — дистрибуция косметики и игрушек
Архитектура
Всё внутри Next.js App Router: страницы, route handlers и база через Prisma. Мобильное приложение получает те же данные через отдельный JWT API, веб — через сессию.
Источники данных
Конвейер импорта
Проверка по схемам Zod
Приложение
Доступ
Данные
Технологии
Веб
Backend
Работа с данными
Инфраструктура
Моя роль
Продукт целиком: модель данных, конвейер импорта, конструктор отчётов, аутентификация, мобильный API и CI/CD.
Имена клиентов, домены и адреса серверов не раскрываются из соображений конфиденциальности.