Модули
Статусы
Версия: 1.0
Дата: 2025-11-27
Статус: Реализован
Общее описание
Текущая реализация
Права доступа
Описание полей
UI/UX
Бизнес-логика
Выявленные проблемы
Рекомендации
Модуль "Статусы" — это ключевой модуль управления жизненным циклом заказов . Он определяет:
Какие статусы существуют в системе
Разрешённые переходы между статусами
Кто может переключать статусы
Какие поля обязательны при смене статуса
Кого оповещать при смене статуса
Основные функции:
Создание и редактирование статусов заказов
Настройка переходов между статусами (State Machine)
Гибкая система прав на переключение
Обязательные поля при переходе
Оповещения участников
Модуль Связь Заказы order.status_id → текущий статус заказаИстория заказов Фиксация всех переходов Уведомления Оповещения при смене статуса Все роли Права на переключение статусов
Метрика Значение Всего статусов 10 Переходов 17 Политик статусов 9
ID Ключ Название 1 newНовый 2 applyОжидает подписания 3 paymentОжидает оплаты 4 paidНа проверке 5 productionВ производстве 6 deliveryДоставка 10 pickupОжидает самовывоза 7 installМонтаж 8 completedЗавершен 9 canceledОтменен
┌─────────────────────────────────────────────────────────────────────────────┐
│ МОДУЛЬ "СТАТУСЫ" │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ РОУТЫ (routes/web.php) │
│ ├── GET /statuses → StatusController@index → Список │
│ ├── GET /status/add → StatusController@create → Создание │
│ └── GET /status/edit/{id} → StatusController@show → Редактирование │
│ │
│ КОНТРОЛЛЕР (StatusController.php) │
│ └── Проверка прав: status_can_view │
│ │
│ LIVEWIRE КОМПОНЕНТЫ │
│ ├── Status/Listing.php — Таблица статусов с drag&drop │
│ ├── Status/Add.php — Форма создания │
│ ├── Status/Edit.php — Форма с 4 вкладками │
│ └── Status/Policies.php — Политики статуса │
│ │
│ МОДЕЛИ │
│ ├── Status — Статус заказа │
│ ├── StatusTransition — Переход между статусами │
│ ├── StatusPolicy — Типы политик статусов │
│ └── PolicyStatus — Значения политик для статуса │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Поле Тип Описание idbigint PK indexint Порядок сортировки status_keystring Уникальный ключ (new, paid, etc.) namestring Название для отображения colorstring Цвет статуса (hex) descriptionstring Описание notify_managerboolean Оповещать менеджера notify_adminboolean Оповещать админов notify_dealerboolean Оповещать дилера notify_makeboolean Оповещать производство created_attimestamp — updated_attimestamp —
Поле Тип Описание idbigint PK parent_status_idFK Исходный статус child_status_idFK Целевой статус dealer_canboolean Дилер заказа может manager_canboolean Менеджер заказа может production_canboolean Производство заказа может dealers_canboolean Все дилеры могут managers_canboolean Все менеджеры могут productions_canboolean Всё производство может required_fieldsjson Обязательные поля forced_fieldsjson Принудительные поля
Поле Тип Описание idbigint PK keystring Ключ политики namestring Название
Поле Тип Описание idbigint PK status_idFK Статус status_policy_idFK Политика valueboolean Значение
app/
├── Http/Controllers/
│ └── StatusController.php
├── Livewire/Status/
│ ├── Add.php — Форма создания
│ ├── Edit.php — Форма редактирования (4 вкладки)
│ ├── Listing.php — Таблица списка
│ └── Policies.php — Политики статуса
└── Models/
├── Status.php
├── StatusTransition.php
├── StatusPolicy.php
└── PolicyStatus.php
database/migrations/
├── 2024_03_22_143058_create_statuses_table.php
├── 2024_03_30_123459_create_status_transitions_table.php
├── 2024_03_31_170227_create_status_policies_table.php
├── 2024_03_31_170848_create_policy_status_table.php
├── 2025_07_14_170317_add_field_notify_to_statuses_table.php
└── 2025_07_14_184808_add_field_forced_fields_to_status_transitions_table.php
Политика Описание status_can_viewПросмотр, создание и редактирование статусов
⚠️ Одна политика для всех действий! Нет отдельных прав на создание/редактирование/удаление.
// StatusController.php — везде одна и та же проверка
if ( ! $user -> check_access ( 'status_can_view' ))
abort ( 403 );
Роль Просмотр Создание Редактир. Удаление Администратор ✅* ✅* ✅* ✅* Менеджер ❌ ❌ ❌ ❌ Производство ❌ ❌ ❌ ❌ Дилер ❌ ❌ ❌ ❌
*Зависит от политики status_can_view
Поле Тип Обязательное Описание status_keyTextInput ✅ Уникальный ключ nameTextInput ✅ Название colorColorPicker ❌ Цвет статуса descriptionTextInput ❌ Описание
Поле Тип Описание status_keyTextInput Ключ (unique) nameTextInput Название colorColorPicker Цвет descriptionTextInput Описание
Поле Тип Описание notify_managerToggle Оповещать менеджера notify_adminToggle Оповещать админов notify_dealerToggle Оповещать дилера notify_makeToggle Оповещать производство
Repeater со следующими полями:
Поле Тип Описание child_status_idSelect Целевой статус required_fieldsSelect (multiple) Обязательные поля forced_fieldsSelect (multiple) Принудительные поля dealer_canToggle Дилер заказа может manager_canToggle Менеджер заказа может production_canToggle Производство заказа может dealers_canToggle Все дилеры могут managers_canToggle Все менеджеры могут productions_canToggle Всё производство может
Доступные обязательные поля:
Ключ Название snСерийный номер specificationСпецификация payment_orderПодтверждение оплаты invoiceСчет date_makeДата производства date_deliveryДата доставки date_paymentДата оплаты paymentТип оплаты receiverФИО Клиента phoneТелефон emailEmail deliveryСпособ доставки addressАдрес
Таблица с политиками статуса.
Колонка Описание Особенности status_keyКлюч Поиск nameНазвание Поиск colorЦвет ColorColumn
┌─────────────────────────────────────────────────────────────────────────────┐
│ Статусы [Изменить порядок] [+ Создать] │
├─────────────────────────────────────────────────────────────────────────────┤
│ [Поиск...] [Столбцы ▾] │
├──────────────────┬────────────────────────┬─────────────┬───────────────────┤
│ ☐ Ключ │ Название │ Цвет │ │
├──────────────────┼────────────────────────┼─────────────┼───────────────────┤
│ ☐ new │ Новый │ ● │ [Удалить] │
│ ☐ apply │ Ожидает подписания │ ● │ [Удалить] │
│ ☐ payment │ Ожидает оплаты │ ● │ [Удалить] │
│ ☐ paid │ На проверке │ ● │ [Удалить] │
│ ☐ production │ В производстве │ ● │ [Удалить] │
│ ☐ delivery │ Доставка │ ● │ [Удалить] │
│ ☐ pickup │ Ожидает самовывоза │ ● │ [Удалить] │
│ ☐ install │ Монтаж │ ● │ [Удалить] │
│ ☐ completed │ Завершен │ ● │ [Удалить] │
│ ☐ canceled │ Отменен │ ● │ [Удалить] │
└──────────────────┴────────────────────────┴─────────────┴───────────────────┘
Особенности:
✅ Drag & Drop для изменения порядка (reorderable)
✅ Кнопка "Изменить порядок" для активации режима
✅ Массовое удаление
┌─────────────────────────────────────────────────────────────────────────────┐
│ [← Назад] Редактирование статуса [Удалить] [Сохранить] │
├─────────────────────────────────────────────────────────────────────────────┤
│ [Данные] [Оповещения] [Переходы] [Политики] │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Ключ* Название* │
│ [new ] [Новый ] │
│ │
│ Цвет Описание │
│ [#070807 ] ● [ ] │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Система статусов реализует State Machine для заказов:
┌─────────────┐
│ new │ (Новый)
└──────┬──────┘
│
┌──────▼──────┐
│ apply │ (Ожидает подписания)
└──────┬──────┘
│
┌──────▼──────┐
│ payment │ (Ожидает оплаты)
└──────┬──────┘
│
┌──────▼──────┐
│ paid │ (На проверке)
└──────┬──────┘
│
┌──────▼──────┐
│ production │ (В производстве)
└──────┬──────┘
│
┌────────────┼────────────┐
│ │ │
┌──────▼──────┐ │ ┌──────▼──────┐
│ delivery │ │ │ pickup │
│ (Доставка) │ │ │ (Самовывоз) │
└──────┬──────┘ │ └──────┬──────┘
│ │ │
└────────────┼────────────┘
│
┌──────▼──────┐
│ install │ (Монтаж)
└──────┬──────┘
│
┌──────▼──────┐
│ completed │ (Завершен)
└─────────────┘
┌─────────────┐
│ canceled │ (Отменен) — из любого статуса
└─────────────┘
// Status.php — availableTransitions()
public function availableTransitions ($order, $user) : array
{
$out = [];
switch ($user -> group_id) {
case '1' : // admin — все переходы
$condition = [ 'check' => 'all' ];
break ;
case '2' : // dealer
if ($order -> dealer_id == $user -> id) {
// Свой заказ — dealer_can OR dealers_can
$condition = [ 'check' => 'two' , 'first' => 'dealer_can' , 'second' => 'dealers_can' ];
} else {
// Чужой заказ — только dealers_can
$condition = [ 'check' => 'one' , 'second' => 'dealers_can' ];
}
break ;
case '3' : // manager
$isOwnOrder = ($order -> dealer -> company -> manager_id == $user -> id);
if ($isOwnOrder) {
$condition = [ 'check' => 'two' , 'first' => 'manager_can' , 'second' => 'managers_can' ];
} else {
$condition = [ 'check' => 'one' , 'second' => 'managers_can' ];
}
break ;
case '4' : // production
$condition = [ 'check' => 'two' , 'first' => 'production_can' , 'second' => 'productions_can' ];
break ;
}
// Фильтрация переходов по условиям...
}
Флаг Кто может Описание dealer_canДилер заказа Только если это его заказ manager_canМенеджер заказа Только если это его компания production_canПроизводство заказа Только если это их производство dealers_canВсе дилеры Любой дилер managers_canВсе менеджеры Любой менеджер productions_canВсё производство Любой производственник
При смене статуса система проверяет required_fields:
// Пример: переход в статус "production" требует:
'required_fields' => [ 'date_make' , 'sn' ]
Если поля не заполнены — переход заблокирован.
forced_fields — поля, которые система устанавливает автоматически:
'forced_fields' => [ 'deferred_payment' ] // Отсрочка платежа
При смене статуса система проверяет флаги оповещений:
if ($status -> notify_manager) // Отправить уведомление менеджеру
if ($status -> notify_admin) // Отправить уведомление админам
if ($status -> notify_dealer) // Отправить уведомление дилеру
if ($status -> notify_make) // Отправить уведомление производству
# Проблема Файл Влияние — Критических проблем не обнаружено — —
# Проблема Описание Решение 1 Одна политика на всё status_can_view для просмотра, создания и редактированияРазделить на status_can_add, status_can_edit, status_can_delete 2 Нет проверки прав в Listing Действие удаления доступно всем, кто видит страницу Добавить проверку прав 3 Нет валидации целостности Можно удалить статус, который используется в заказах Добавить soft delete или проверку
# Проблема Описание 4 Redirect по status_key После создания редирект на /status/edit/{status_key}, а не на ID 5 Нет визуализации графа переходов Сложно понять структуру переходов 6 Нет истории изменений Не видно, кто и когда менял настройки статуса
// Создать отдельные политики:
'status_can_view' — просмотр списка
'status_can_add' — создание
'status_can_edit' — редактирование
'status_can_delete' — удаление
// В Listing.php
Action :: make ( 'delete' )
-> hidden ( fn ( Status $record) => Order :: where ( 'status_id' , $record -> id) -> exists ())
-> requiresConfirmation ()
-> action ( fn ( Status $record) => $record -> delete ())
Использовать библиотеку типа Mermaid.js для отображения State Machine.
// Add.php:52 — было:
redirect () -> route ( 'status-edit' , $record -> status_key);
// Стало:
redirect () -> route ( 'status-edit' , $record -> id);
SELECT
ps . name as from_status,
cs . name as to_status,
st . dealer_can ,
st . manager_can ,
st . production_can ,
st . dealers_can ,
st . managers_can ,
st . productions_can ,
st . required_fields
FROM status_transitions st
JOIN statuses ps ON st . parent_status_id = ps . id
JOIN statuses cs ON st . child_status_id = cs . id
ORDER BY ps . index , cs . index ;
SELECT
s . status_key ,
s . name ,
COUNT ( o . id ) as orders_count
FROM statuses s
LEFT JOIN orders o ON s . id = o . status_id
GROUP BY s . id , s . status_key , s . name
ORDER BY s . index ;
SELECT
status_key,
name ,
notify_manager,
notify_admin,
notify_dealer,
notify_make
FROM statuses
ORDER BY `index` ;
Документ подготовлен на основе анализа исходного кода проекта