Система
Обзор системы
Дата: ноябрь 2025
Версия: Laravel 10 + Livewire 3 + Filament 3
Продакшен: https://lk.septiki-tver.ru
Staging: https://lkstage.ncgroup-it.ru
Общее описание
Технический стек
Архитектура данных
Функциональность по ролям
Ключевые бизнес-процессы
Интеграции
Карта модулей системы
Статистика системы
Выявленные проблемы
Нереализованный функционал
Рекомендации по развитию
Структура файлов
Окружения
Контакты
История изменений
Система представляет собой B2B личный кабинет для управления заказами септиков и очистного оборудования. Основные пользователи:
Дилеры - создают заказы от имени своих клиентов
Менеджеры - курируют работу дилеров своих компаний
Производство - получает заказы и управляет изготовлением
Администраторы - полный доступ ко всем функциям
Компонент Технология Backend Laravel 10 (PHP 8.4) Frontend Livewire 3, Alpine.js, TailwindCSS UI компоненты Filament 3.2 База данных MariaDB 11 Кэширование Redis Real-time Laravel Reverb Уведомления Telegram Bot API Документы PhpSpreadsheet (Excel) Локальная среда Laravel Sail (Docker) CI/CD GitHub Actions → Docker на сервере
# Модель Таблица Описание 1 UserusersВсе пользователи системы (дилеры, менеджеры, производство, админы). Разделяются по group_id 2 GroupgroupsГруппы пользователей: Admin (1), Dealer (2), Manager (3), Production (4) 3 CompanycompaniesДилерские компании: юр. данные, договор, ИНН, ОГРН, скидки по категориям 4 PolicypoliciesСправочник политик доступа (57 политик). Ключ key используется в check_access() 5 UserPolicyuser_policiesПерсональные права пользователя (переопределяют групповые) 6 GroupPolicygroup_policiesПрава группы по умолчанию 7 CategoryUsercategory_userСвязь пользователя с категориями (для индивидуальных скидок) 8 CategoryCompanycategory_companyСкидки компании по категориям товаров
# Модель Таблица Описание 9 CategorycategoriesИерархические категории (дерево). Флаг additional — дополнительные товары 10 ProductproductsТовары: цена, дилерская цена, наращивание горловины, время производства 11 OptionoptionsОпции товаров. Группы: enter (входы), single (одиночные). Типы входов: end, left, right 12 PropertypropertiesСправочник характеристик (Объём, Глубина, Залповый сброс и др.) 13 PropertyProductproperty_productСвязь характеристика ↔ товар со значением 14 TypetypesТипы товаров: Септик, Погреб, Кессон
# Модель Таблица Описание 15 OrderordersОсновная сущность заказа. Связи: dealer, status, stock, manufacture 16 OrderItemorder_itemsПозиции заказа (основные товары). Количество, наращивание, SN 17 OrderItemOptionorder_item_optionsОпции позиции заказа (входы, доп. опции). Копия из options 18 OrderOptionorder_optionsУстаревшая таблица опций заказа (legacy) 19 OrderProductorder_productДополнительные товары в заказе (насосы, компрессоры) 20 OrderHistoryorder_historiesЛог изменений: смена статуса, действия пользователей 21 StatusstatusesСтатусы заказа: new, apply, payment, paid, production, delivery, pickup, install, completed, canceled 22 StatusTransitionstatus_transitionsМатрица переходов между статусами с правами по ролям 23 StatusPolicystatus_policiesСвязь статуса с политиками (кто видит заказы в статусе)
# Модель Таблица Описание 24 StockstocksСклады: Вертек, Склад СПБ, Базис. Адрес, привязка к производству 25 ProductStockproduct_stocksТовары на складе с серийными номерами (SN). Флаг in_stock 26 ManufacturemanufacturesПроизводственные площадки: Верховье, Елкино 27 ReservationreservationsБронирование слотов в календаре производства 28 PolicyStatuspolicy_statusСвязь политик со статусами для контроля видимости
# Модель Таблица Описание 29 MessagemessagesВнутренний чат заказа (менеджеры + админы, без дилера) 30 DealerMessagedealer_messagesЧат с дилером по заказу 31 TelegramNotificationtelegram_notificationsОчередь Telegram-уведомлений о смене статусов
# Модель Таблица Описание 32 NewsnewsНовости и объявления для дилеров. Публикация, автор, прикрепления
┌─────────────────────────────────────────────────────────────────────────────┐
│ СТРУКТУРА ДАННЫХ │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌───────────┐ │
│ │ Group │◄───│ User │───►│ Company │ │
│ │ (4 типа)│ │ │ │ │ │
│ └────┬────┘ └────┬────┘ └─────┬─────┘ │
│ │ │ │ │
│ ▼ │ ▼ │
│ ┌─────────┐ │ ┌─────────────┐ │
│ │ Group │ │ │ Category │ │
│ │ Policy │ │ │ Company │ │
│ └─────────┘ │ │ (скидки) │ │
│ │ └─────────────┘ │
│ ┌──────────────┼──────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Policy │ │ Order │ │ Category│──► Product ──► Option │
│ │ │ │ │ │ (дерево)│ │ │
│ └────┬────┘ └────┬────┘ └─────────┘ ▼ │
│ │ │ PropertyProduct │
│ ▼ ▼ │
│ ┌─────────┐ ┌───────────┐ ┌─────────┐ │
│ │ User │ │ OrderItem │───►│OrderItem│ │
│ │ Policy │ │ │ │ Option │ │
│ └─────────┘ └─────┬─────┘ └─────────┘ │
│ │ │
│ ▼ │
│ ┌───────────┐ ┌─────────┐ ┌───────────┐ │
│ │ Status │───►│ Status │───►│Manufacture│ │
│ │ │ │Transition│ │ │ │
│ └─────┬─────┘ └─────────┘ └─────┬─────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌───────────┐ ┌───────────┐ │
│ │ Order │ │ Stock │ │
│ │ History │ │ │ │
│ └───────────┘ └─────┬─────┘ │
│ │ │
│ ▼ │
│ ┌───────────┐ │
│ │ Product │ │
│ │ Stock │ │
│ │ (SN) │ │
│ └───────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
✅ Создание заказов (пошаговый мастер)
✅ Просмотр своих заказов
✅ Изменение статусов (согласно правам)
✅ Загрузка файлов к заказам
✅ Просмотр каталога с дилерскими ценами
✅ Telegram-уведомления о статусах
✅ Календарь своих заказов
✅ Всё что могут дилеры
✅ Просмотр заказов своих дилеров
✅ Управление дилерами своей компании
✅ Расширенные права на изменение статусов
✅ Общий календарь заказов
✅ Просмотр заказов в производстве
✅ Изменение статусов производства
✅ Календарь производства
✅ Полный доступ ко всем функциям
✅ Управление пользователями
✅ Управление каталогом
✅ Управление статусами и переходами
✅ Настройка политик доступа
✅ Управление складами и производствами
✅ Impersonation - вход под другим пользователем для просмотра системы от его лица
Кнопка "Авторизоваться" в списках пользователей
При выходе возврат к администратору (не logout)
Контролируется правами can_impersonate + *_can_auth
Шаг 1: Выбор товара
├── Выбор основного товара (септика)
├── Выбор количества
├── Настройка опций (входы: 110мм, 160мм)
├── Наращивание горловины (мм)
└── Добавление доп. основных товаров
Шаг 2: Дополнительные товары
├── Компрессоры
├── Насосы
├── Кессоны
└── Раскладки
Шаг 3: Данные получателя
├── ФИО получателя
├── Контакты
├── Адрес доставки
├── Способ доставки/оплаты
└── Выбор склада/производства
Шаг 4: Подтверждение
└── Создание заказа
Статусы настраиваются динамически с матрицей переходов:
Каждый переход имеет права для каждой роли
Переходы могут требовать заполнения определенных полей
При смене статуса отправляются Telegram-уведомления
Для основных товаров:
Дилерская цена = Базовая цена × (1 - Скидка дилера%)
+ Стоимость опций
+ Стоимость наращивания
+ Индивидуальная скидка (если есть)
Для дополнительных товаров:
Дилерская цена = dealer_price (фиксированная)
Скидки дилера настраиваются:
На уровне компании (общая скидка)
На уровне категории товара (CategoryCompany)
Привязка пользователя по номеру телефона
Уведомления о смене статуса заказа
Уведомления о загрузке файлов дилером
Спецификация заказа (Excel)
Бланк заказа
Автонумерация спецификаций по компании
Детальная документация каждого модуля находится в папке /docs
Модуль Документация Описание Администраторы Администраторы Управление администраторами системы (group_id=1) Менеджеры Менеджеры Управление менеджерами компаний (group_id=3) Дилеры (менеджеры) Дилеры Управление дилерами компаний (group_id=2) Производство Производство Сотрудники производства (group_id=4) Дилеры (компании) Компании Управление дилерскими компаниями Группы пользователей Группы 4 группы: Admin, Dealer, Manager, Production Политики доступа Политики RBAC-система (57 политик)
Модуль Документация Описание Каталог Каталог Иерархический каталог категорий и товаров Товары списком Товары списком Управление товарами в табличном виде Характеристики Характеристики Справочник характеристик товаров Типы Типы Классификация товаров (Септик, Погреб, Кессон)
Модуль Документация Описание Карточка заказа Карточка заказа Полное руководство по работе с заказами Статусы Статусы Управление статусами и переходами
Модуль Документация Описание Склады Склады Управление складами и остатками Места производства Производства Управление производственными площадками
Модуль Документация Описание Главная Главная Дашборд с виджетами и статистикой Новости Новости Новости и объявления для дилеров Календарь Календарь Календарь заказов по датам
┌─────────────────┐
│ ПОЛИТИКИ │
│ ДОСТУПА │
│ (57 политик) │
└────────┬────────┘
│
┌──────────────────────────┼──────────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ ГРУППЫ │ │ ПОЛЬЗОВАТЕЛИ │ │ СТАТУСЫ │
│ (4 группы) │◄──────│ (User) │───────►│ (переходы) │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │
│ ┌────────────┼────────────┐ │
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌────────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ КОМПАНИИ │ │ ЗАКАЗЫ │ │ КАТАЛОГ │ │ СКЛАДЫ │ │ПРОИЗВОД- │
│ │ │ │ │ │ │ │ │ СТВА │
└──────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌──────────┐ │ │
│ └─────►│ ТОВАРЫ │◄──────┘ │
│ │ (Product)│ │
│ └────┬─────┘ │
│ │ │
│ ┌────┴────┐ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ │
│ │ХАРАКТЕР- │ │ ТИПЫ │ │
│ │ ИСТИКИ │ │ │ │
│ └──────────┘ └──────────┘ │
│ │
└────────────────────┬───────────────────────────────┘
│
▼
┌──────────────┐
│ ДИЛЕРЫ │
│ (менеджеры) │
└──────────────┘
На основе анализа модулей (ноябрь 2025)
Группа Количество Описание Администраторы 2 group_id = 1 Дилеры 35 group_id = 2 Менеджеры 9 group_id = 3 Производство 7 group_id = 4 Всего 53
Метрика Значение Категорий 9 Товаров 145 Характеристик 4 Типов товаров 4
Метрика Значение Компаний 14 Складов 9 Мест производства 5 Статусов 12 Политик доступа 57
Сводка проблем собрана из анализа всех модулей системы
# Проблема Модуль Файл Влияние 1 Захардкоженные секреты Общее Telegram.php:19-20Безопасность 2 URL захардкожен Заказы Order.php:113,321Некорректные ссылки на staging 3 $guarded = false ВСЕ модели Все модели Mass assignment уязвимость 4 Типы товаров — строковая связь Типы Product.typeПри переименовании типа связи разрываются
# Проблема Модуль Файл 5 Неправильные права manager_can_* вместо production_can_* Производство Productions/Listing.php6 Неправильный view livewire.news.listing Группы, Политики, Статусы Listing.php7 $disableEdit не используетсяТипы, Характеристики, Склады Listing.php8 Некорректный redirect после удаления Характеристики Property/Control.php
# Модуль Проблема 9 Компании Нет проверки прав в контроллере 10 Характеристики Нет проверки прав в контроллере 11 Дилеры Нет проверки dealer_can_view в контроллере 12 Группы Нет проверки прав в контроллере
# Проблема Описание 13 Большие Livewire компоненты Order/Add.php — 2498 строк14 Смешение старой/новой структуры заказов Order.product_id vs OrderItem15 Дублирование логики расчёта цен В нескольких местах 16 Дилеры без индивидуальных прав Только групповые политики
# Проблема Описание 17 Нет CRUD для политик Нельзя создать политику через UI 18 Нет аудита изменений прав Не логируется кто менял права 19 Нет unit-тестов Критические процессы не покрыты 20 Нет API документации Отсутствует Swagger/OpenAPI 21 Неиспользуемое поле index В Types, Properties
Источник: Документы из папки /docs, особенно Список_проблем_и_задач_по_системе_ЛК_дилеров.docx
Роль Описание из ТЗ Статус Руководитель Расширенные права, одобрение заявок на дилерство ❌ Нет (есть только Админ) Логист Планирование монтажей, контроль отгрузок ❌ Нет Инженер График выездов, сдача документации ❌ Нет
Функция Описание Статус Заказы для частных клиентов Заказ без дилера с отдельным прайсом ❌ Нет История изменений Фиксация всех изменений в заказе ⚠️ Не работает Входы 160мм Отдельная цена за вход 160мм ❓ Проверить Патрубки кессонов 4 бесплатно, 5-12 по 1500₽ ❓ Проверить
Статичность цен - завершенные заказы должны хранить снапшот цен
Серийные номера - каждая станция в заказе должна иметь свой номер
Ограничения производства - не может менять конфигурацию, только добавлять номер
Задача Файл Сложность Вынести Telegram API ключ в .env Telegram.phpЛёгкая Заменить захардкоженный URL Order.phpЛёгкая Исправить права manager_can_* → production_can_* Productions/Listing.phpЛёгкая Исправить view livewire.news.listing Groups/Listing.php, Policies/Listing.phpЛёгкая
Задача Описание Добавить проверки прав в контроллеры Компании, Характеристики, Дилеры, Группы Рефакторинг связи Types → Products Заменить строку на FK Добавить защиту от удаления используемых Типы, Характеристики, Статусы
Задача Описание Рефакторинг Order/Add.php Разбить на подкомпоненты Создать PriceCalculatorService Вынести логику расчёта цен Миграция структуры заказов Удалить старую структуру Добавить индивидуальные права для дилеров Расширить check_access()
app/
├── Events/ # События (MakeTelegramNotify)
├── Http/
│ ├── Controllers/ # Контроллеры (18 шт)
│ └── Middleware/ # Middleware
├── Livewire/ # Livewire компоненты (59 шт)
│ ├── Order/ # Заказы (Add, Edit, Listing, etc.)
│ ├── Dealers/ # Дилеры
│ ├── Managers/ # Менеджеры
│ ├── Category/ # Каталог
│ ├── Calendar/ # Календарь
│ └── ...
├── Models/ # Модели (32 шт)
├── Services/ # Сервисы
│ ├── Telegram.php
│ ├── OrderSpecification.php
│ ├── OrderBlank.php
│ └── OptimizeImage/
└── Providers/
Дата Изменения Ноябрь-Декабрь 2025 Первоначальная версия Ноябрь-Декабрь 2025 Актуализация: добавлена карта модулей, статистика, сводка проблем из анализа 20 модулей