Документация ЛК
Модули

Заказы

Полная документация по работе с заказами

Полная документация по работе с заказами

Версия: 2.0
Дата: декабрь 2025
Протестировано: 4 декабря 2025


Содержание

  1. Список заказов
  2. Карточка заказа
  3. Статусы и переходы
  4. Права доступа по ролям
  5. Бизнес-логика
  6. Вкладки карточки
  7. Уведомления
  8. Ограничения и особенности

1. Список заказов

URL: /orders

1.1 Элементы интерфейса

ЭлементОписание
Кнопка "Создать"Создание нового заказа (/order/add)
Кнопка "Экспорт"Экспорт списка заказов в файл
Фильтр "Дилер"Выбор дилера для фильтрации
Фильтр "Статус"Фильтрация по статусу заказа
Фильтр "Создан с/по"Фильтрация по дате создания
ПоискПолнотекстовый поиск по заказам
Пагинация5/10/25/50/Все записей на странице

1.2 Колонки таблицы

КолонкаОписаниеСортировка
НомерФормат YYYY_MM_N
ТоварНазвание основного товара
ДилерФИО дилера (сокращённо)
Дата производстваПлановая дата изготовления
СуммаИтоговая стоимость в рублях
СтатусТекущий статус заказа
ДействияСкачать бланк, Удалить

1.3 Действия в списке

ДействиеДоступность
Скачать бланкДля всех заказов
УдалитьПо правам роли и статуса

2. Карточка заказа

URL: /order/edit/{id}

Карточка заказа содержит всю информацию о заказе с возможностью редактирования в зависимости от роли пользователя и статуса заказа.


Структура интерфейса

1. Заголовок

┌─────────────────────────────────────────────────────────────────┐
│ Заказ №2025_10_14 на сумму 204 700 руб         ОАО БухТех       │
│                                                (ссылка на дилера)│
└─────────────────────────────────────────────────────────────────┘

Элементы:

  • Номер заказа — формат YYYY_MM_DD или порядковый номер
  • Сумма — итоговая стоимость заказа в рублях
  • Компания дилера — кликабельная ссылка на карточку дилера (скрыта для дилеров)

2. Статусы заказа

[Новый] [Ожидает подписания] [Ожидает оплаты] [На проверке] [В производстве] ...

Все статусы системы:

СтатусОписание
НовыйЗаказ только создан
Ожидает подписанияОжидается подпись спецификации
Ожидает оплатыОжидается оплата заказа
На проверкеЗаказ на проверке у руководства
В производствеСтанция изготавливается
ДоставкаЗаказ в процессе доставки
Ожидает самовывозаГотов к самовывозу
МонтажМонтаж на объекте
ЗавершенЗаказ выполнен
ОтмененЗаказ отменен

Логика переходов:

  • Активные кнопки — доступные переходы для текущего пользователя
  • Disabled кнопки — недоступные переходы
  • Переходы зависят от роли и матрицы в /statuses

3. Вкладки

Карточка содержит 3 вкладки:

ВкладкаСодержание
Общая информацияВсе поля заказа, файлы, чаты
СоставПозиции заказа, опции, цены
ИсторияЛог всех изменений заказа

Вкладка "Общая информация"

Левая часть — Основные поля

Блок дат и номеров

ПолеОписаниеРедактируемость
Предполагаемая датаЖелаемая дата готовностиМенеджер, Админ
Номер спецификацииНомер для документовМенеджер, Админ (скрыто для дилера)
НомерАвтоматический номер заказаТолько чтение
Дата изготовленияФактическая дата производстваМенеджер, Админ
Дата доставкиДата доставки клиентуМенеджер, Админ
Заказ созданДата/время созданияТолько чтение
Дата оплатыДата получения оплатыВсе (кроме disabled)

Блок оплаты и доставки

ПолеОписаниеВарианты
Отсрочка платежаФлаг отсрочкиВкл/Выкл (скрыто для дилера)
Форма оплатыСпособ оплатыБезналичный по счету, Безналичный по ссылке, Наличными (бригадиру), Наличными (перевод)
Способ доставкиТип полученияСамовывоз, Доставка по адресу
СкладСклад отгрузкиВертек, Склад СПБ, Базис
ПроизводствоМесто изготовленияПроизводство Верховье, Производство Елкино (только чтение)
Адрес изготовленияАдрес производстваТекстовое поле

Блок "Данные заказа"

ПолеОписание
ФИО клиентаПолное имя конечного покупателя
ТелефонКонтактный телефон клиента
EmailЭлектронная почта клиента
АдресАдрес доставки или монтажа
Нужен монтажФлаг необходимости монтажа
Комментарий к заказуПроизвольный комментарий

Блок "Контактное лицо на объекте"

ПолеОписание
ФИОИмя лица, принимающего товар
ТелефонТелефон контактного лица

Блок "Файлы"

ПолеКто видитКто редактирует
ФайлыВсеПо правам
Документы от менеджераМенеджер, АдминМенеджер, Админ
Документы от дилераВсеДилер

Правая часть — Документы и чаты

Генерация документов

КнопкаОписаниеДоступность
БланкСкачать бланк заказа (Excel)Менеджер, Админ
СпецификацияСкачать спецификацию (Excel)Все

Требования для генерации спецификации:

  • Заполнена компания дилера
  • Указан склад и его адрес
  • Указан способ доставки
  • Заполнен заказчик (ФИО)
  • Указан телефон

Прикрепление документов

ПолеОписаниеРедактор
СпецификацияПодписанная спецификацияМенеджер
СчетСчет на оплатуМенеджер
Подтверждение оплатыПлатежное поручениеВсе
Доверенность на получениеДоверенностьВсе

Чаты

ЧатУчастники
Внутренний чатМенеджеры, Админы (дилер не видит)
Чат с дилеромВсе участники

Вкладка "Состав"

Управление позициями заказа.

Режимы отображения:

  • Основные товары — станции, кессоны и т.д.
  • Дополнительные товары — компрессоры, насосы и т.д.

Функции для каждой позиции:

ДействиеОписание
+/- КоличествоИзменить количество единиц товара
+/- Высота горловиныНаращивание (шаг 100мм, макс 500мм)
Опции входовТорцевой, Левый, Правый (110мм)
Одиночные опцииДополнительное оборудование
Индивидуальная скидкаПроцент скидки на позицию (0-100%)
Серийный номерSN станции (для производства)

Расчет цен:

Стоимость позиции = (Цена × Количество) + Наращивание + Опции
Итого дилеру = Сумма всех позиций с дилерской скидкой
Итого клиенту = Сумма всех позиций по розничной цене

Вкладка "История"

Таблица всех изменений заказа.

КолонкаОписание
Дата и времяКогда произошло изменение
ПользовательКто сделал изменение
СтатусНовый статус заказа
ДействиеОписание действия

Фиксируются:

  • Смена статуса заказа
  • Изменения полей (если реализовано)
  • Загрузка файлов

3. Статусы и переходы

3.1 Все статусы системы

IDКлючНазваниеПорядок
1newНовый1
2applyОжидает подписания2
3paymentОжидает оплаты3
4paidНа проверке4
5productionВ производстве5
6deliveryДоставка6
10pickupОжидает самовывоза7
7installМонтаж8
8completedЗавершен9
9canceledОтменен10

3.2 Матрица переходов между статусами

Новый ──────────────────► Ожидает подписания [менеджер]


                          Ожидает оплаты [менеджер]


                            На проверке [менеджер]


                          В производстве [производство]
                           /        │        \
                          ▼         ▼         ▼
              Ожидает самовывоза  Доставка   Монтаж [производство]
                    │               │          │
                    └───────────────┼──────────┘

                               Завершен [менеджер/производство]

3.3 Подробные переходы

Из статусаВ статусКто может
НовыйОжидает подписанияМенеджер
Ожидает подписанияОжидает оплатыМенеджер
Ожидает подписанияНовыйМенеджер (откат)
Ожидает оплатыНа проверкеМенеджер
Ожидает оплатыОжидает подписанияМенеджер (откат)
На проверкеВ производствеПроизводство
На проверкеНа проверкеМенеджер (пересмотр)
В производствеДоставкаПроизводство
В производствеОжидает самовывозаПроизводство
В производствеМонтажПроизводство
В производствеНа проверкеПроизводство (откат)
ДоставкаОжидает самовывозаПроизводство
ДоставкаМонтажПроизводство
ДоставкаЗавершенМенеджер, Производство
Ожидает самовывозаМонтажМенеджер, Производство
Ожидает самовывозаЗавершенМенеджер, Производство
МонтажЗавершенМенеджер

4. Права доступа по ролям

4.1 Матрица прав по статусам

СтатусМенеджерДилерПроизводство
Новый👁️✏️🗑️👁️✏️👁️
Ожидает подписания👁️✏️👁️✏️
Ожидает оплаты👁️✏️👁️👁️
На проверке👁️🗑️👁️👁️✏️
В производстве👁️👁️👁️✏️
Доставка👁️👁️👁️✏️
Ожидает самовывоза👁️✏️👁️👁️
Монтаж👁️👁️👁️
Завершен👁️👁️👁️
Отменен👁️✏️👁️

Легенда: 👁️ просмотр, ✏️ редактирование, 🗑️ удаление

4.2 Администратор (group_id = 1)

  • Полный доступ ко всем заказам и полям
  • ✅ Любые переходы между статусами
  • ✅ Генерация всех документов
  • ✅ Просмотр внутреннего чата
  • ✅ Просмотр удалённых заказов (SoftDeletes)
  • ✅ Impersonation (авторизация под другим пользователем)

4.3 Менеджер (group_id = 3)

  • ✅ Просмотр/редактирование заказов своих дилеров (привязка через company_id)
  • ✅ Переходы: Новый → Ожидает подписания → Ожидает оплаты → На проверке
  • ✅ Завершение заказов из статусов Доставка/Самовывоз
  • ✅ Генерация документов (Бланк, Спецификация)
  • ✅ Внутренний чат + чат с дилером
  • ❌ Заказы чужих дилеров

4.4 Дилер (group_id = 2)

  • ✅ Просмотр только своих заказов
  • ✅ Редактирование в статусах: Новый, Ожидает подписания
  • ✅ Загрузка файлов: Подтверждение оплаты, Доверенность, Документы от дилера
  • ✅ Чат с менеджером
  • ❌ Внутренний чат (не видит)
  • ❌ Поле "Номер спецификации"
  • ❌ Поле "Отсрочка платежа"
  • ❌ Кнопка "Бланк"
  • ❌ Заказы в статусе "Отменен"

4.5 Производство (group_id = 4)

  • ✅ Просмотр заказов в статусах: Новый, Ожидает оплаты, На проверке, В производстве, Доставка, Завершен, Отменен
  • ✅ Редактирование в статусах: На проверке, В производстве, Доставка
  • ✅ Переходы: На проверке → В производстве → Доставка/Самовывоз/Монтаж → Завершен
  • ✅ Добавление серийного номера
  • ❌ Чат с дилером
  • ❌ Изменение конфигурации товара

Пошаговая работа с заказом

Сценарий: Обработка нового заказа (Менеджер)

  1. Открыть заказ из списка /orders
  2. Проверить данные на вкладке "Общая информация"
  3. Скачать спецификацию → кнопка "Спецификация"
  4. Отправить дилеру на подпись
  5. Получить подписанную → загрузить в "Спецификация"
  6. Сменить статус → "Ожидает подписания"
  7. Получить оплату → загрузить в "Подтверждение оплаты"
  8. Сменить статус → "Ожидает оплаты" → "На проверке"
  9. Передать в производство → "В производстве"

Сценарий: Добавление серийного номера (Производство)

  1. Открыть заказ в статусе "В производстве"
  2. Перейти на вкладку "Состав"
  3. Нажать на поле SN у позиции
  4. Ввести серийный номер
  5. Сохранить
  6. Сменить статус → "Доставка" или "Ожидает самовывоза"

Автосохранение

Все изменения полей сохраняются автоматически при:

  • Потере фокуса поля (onBlur)
  • Изменении toggle-переключателей (live)

Статус изменяется сразу при клике на кнопку статуса с перезагрузкой страницы.


5. Бизнес-логика

5.1 Создание заказа

При создании заказа автоматически:

  1. Генерируется номер в формате YYYY_MM_N (год_месяц_порядковый номер)
  2. Генерируется номер спецификации на основе компании дилера:
    • Берётся specification_start_number из компании
    • Прибавляется количество существующих заказов компании

5.2 Система скидок дилера

Источник скидок

Скидки хранятся в таблице category_company:

ПолеОписание
category_idID категории верхнего уровня
company_idID компании дилера
discountПроцент скидки (0-100)

Пример скидок для компании:

ТВЕРЬ LITE    → 25%
ТВЕРЬ CLASSIC → 30%
ТВЕРЬ AERO    → 35%
КЕССОНЫ       → 20%
ПОГРЕБА       → 20%
ТВЕРЬ PRO     → 35%

Применение скидки

// Метод calculateDealerPrice() в Compound.php:

// 1. Для ОСНОВНЫХ товаров — скидка компании по категории:
$category = $product->categories->first()->getTopLevelParent();
$discount = $dealer->discount($category->id);  // из category_company
$priceDealer = $price * (1 - $discount / 100);

// 2. Для ДОПОЛНИТЕЛЬНЫХ товаров — фиксированная дилерская цена:
$priceDealer = $product->dealer_price;  // из справочника products

Индивидуальная скидка

Дополнительная скидка на конкретную позицию заказа (0-100%):

// Применяется ПОСЛЕ скидки компании:
$finalPrice = $priceDealer * (1 - $individualDiscount / 100);

Доступность: только для Менеджера и Администратора (дилер не видит поле).

5.3 Расчёт стоимости

Стоимость позиции = (Цена товара × Количество) + Наращивание + Опции
Дилерская цена = Розничная цена × (1 - Скидка компании) × (1 - Инд. скидка)
Итого заказа = Сумма всех позиций + Дополнительные товары

Наращивание горловины:

  • Шаг: 100мм
  • Максимум: 500мм (50см)
  • Цена за шаг: указана в товаре (step_price, step_price_dealer)

Опции входов:

  • Первый вход — бесплатно
  • Каждый последующий — по цене опции
  • Типы: Торцевой, Левый, Правый (110мм)

5.4 Удаление заказа

При удалении заказа:

  1. Статус меняется на canceled
  2. Срабатывает SoftDelete (запись не удаляется физически)
  3. Товары со склада освобождаются (in_stock = true)
  4. Pivot-связи с ProductStock отвязываются

5.5 Отмена заказа

При переходе в статус canceled:

  • Вызывается метод releaseStocks()
  • Все привязанные товары со склада возвращаются в наличие
  • Серийные номера обнуляются

6. Вкладки карточки (детально)

6.1 Вкладка "Общая информация"

Левая колонка — основные поля:

ПолеТипОписаниеРедактируемость
Предполагаемая датаtextЖелаемая дата готовностиМенеджер, Админ
Номер спецификацииnumberНомер для документовМенеджер, Админ (скрыто для дилера)
НомерtextАвтоматический номер заказаТолько чтение
Дата изготовленияdatetimeФактическая дата производстваМенеджер, Админ
Дата доставкиdatetimeДата доставки клиентуМенеджер, Админ
Заказ созданdatetimeДата/время созданияТолько чтение
Дата оплатыdatetimeДата получения оплатыПо правам
Отсрочка платежаtoggleФлаг отсрочкиМенеджер, Админ (скрыто для дилера)
Форма оплатыselectСпособ оплатыПо правам
Способ доставкиselectСамовывоз / ДоставкаПо правам
СкладselectСклад отгрузкиПо правам
ПроизводствоselectМесто изготовленияТолько чтение
Адрес изготовленияtextАдрес производстваПо правам

Блок "Данные заказа":

ПолеОбязательноеОписание
ФИО клиента✅ для спецификацииПолное имя покупателя
Телефон✅ для спецификацииКонтактный телефон
EmailЭлектронная почта
Адрес✅ при доставкеАдрес доставки/монтажа
Нужен монтажФлаг необходимости монтажа
КомментарийПроизвольный комментарий

Правая колонка:

  • Генерация документов: Бланк (Excel), Спецификация (Excel)
  • Прикрепление: Спецификация, Счёт, Подтверждение оплаты, Доверенность
  • Чаты: Внутренний (без дилера), С дилером

6.2 Вкладка "Состав" — Подвкладка "Основные товары"

Компонент: App\Livewire\Order\Compound (режим mode = 'main')
Blade: resources/views/livewire/order/compound.blade.php

Источники данных

ДанныеТаблица/МодельСвязь
Позиции заказаorder_items / OrderItemorder_id, is_main = true
Опции позицийorder_item_options / OrderItemOptionorder_item_id
Справочник опцийoptions / Optionproduct_id
Товарыproducts / Productproduct_id

Структура позиции основного товара

┌─────────────────────────────────────────────────────────────────┐
│ [Фото] Тверь CLASSIC 0,8НПН    Серийный №: —                    │
│        Септик                   [Прикрепить серийный номер]     │
├─────────────────────────────────────────────────────────────────┤
│ Количество    Стоимость позиции    Инд. скидка, %   Высота      │
│ [-] 1 [+]     189 300 руб.         [__0___]         [-] 0 М [+] │
├─────────────────────────────────────────────────────────────────┤
│ Итого по товару: 190 800 руб.                                   │
├─────────────────────────────────────────────────────────────────┤
│ ┌─ Входы ─────────────────────────────────────────────────────┐ │
│ │ [✓] Вход торцевой ДУ 110 (+1 500 р.)                        │ │
│ │ [✓] Вход слева ДУ 110 (+1 500 р.)                           │ │
│ │ [ ] Вход справа ДУ 110 (+1 500 р.)                          │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ┌─ Опции ─────────────────────────────────────────────────────┐ │
│ │ [ ] Дополнительный самотечный выход ДУ 110 (+1 500 р.)      │ │
│ │ [ ] Дополнительный самотечный ввод левый (+1 500 р.)        │ │
│ │ [ ] Дополнительный самотечный ввод правый (+1 500 р.)       │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

Кнопки и действия

КнопкаМетодОписаниеВлияние на систему
+ Добавить основной товарaddMainProductAction()Открывает модальное окно выбора товараСоздаёт запись в order_items с is_main=true + копирует опции из options в order_item_options
[-] КоличествоminusMainItem($id)Уменьшает количество на 1 (минимум 1)Обновляет count в order_items, пересчитывает cost
[+] КоличествоplusMainItem($id)Увеличивает количество на 1Обновляет count, пересчитывает стоимость
[-] Высота горловиныstepMinusItem($id)Уменьшает высоту на шаг (100мм)Обновляет step_size, пересчитывает step_price
[+] Высота горловиныstepPlusItem($id)Увеличивает высоту на шаг (макс 500мм)Обновляет step_size, step_price, step_price_dealer
Инд. скидкаupdateItemDiscount($id, $val)Устанавливает индивидуальную скидку 0-100%Обновляет individual_discount, пересчитывает price_dealer
Toggle входовitemGetEntersToggles()Включает/выключает входОбновляет value в order_item_options, первый вход бесплатный
Toggle опцийitemGetSinglesToggles()Включает/выключает опциюОбновляет value, добавляет цену к price_options
Прикрепить SNopenSnModal($id)Открывает модальное окно ввода SNСохраняет sn в order_items

Логика расчёта цен

// Для каждой позиции (recalculateItem):
$price = $product->price;                    // Розничная цена товара
$priceDealer = calculateDealerPrice($product, $indDisc);  // С учётом скидок

// Наращивание (если step_size > 0):
$stepPrice = $product->step_price * ($item->step_size / $product->step_size);
$stepPriceDealer = $product->step_price_dealer * ($item->step_size / $product->step_size);

// Опции:
// - Входы (enter): первый бесплатный, последующие платные
// - Одиночные (single): все платные
$priceOptions = calculateItemOptionsPrice($item) * $count;

// Итого позиции:
$cost = ($price * $count) + $stepPrice + $priceOptions;
$costDealer = ($priceDealer * $count) + $stepPriceDealer + $priceOptions;

Откуда берутся опции (входы и одиночные)

  1. Справочник опций — таблица options:

    • product_id — привязка к товару
    • group — тип: enter (входы) или single (одиночные)
    • type — подтип входа: end (торцевой), left (слева), right (справа)
    • name — название опции
    • price — цена опции
  2. При добавлении товара в заказ (метод addMainProductAction):

    foreach ($product->options as $opt) {
        OrderItemOption::create([
            'order_item_id' => $item->id,
            'option_id' => $opt->id,
            'group' => $opt->group,
            'type' => $opt->type,
            'value' => false,  // изначально выключено
            'price' => $opt->price,
        ]);
    }
  3. Отображение опций — из order_item_options через связь $item->options

Правила входов

ПравилоОписание
Первый вход бесплатныйПри расчёте calculateItemOptionsPrice() первый включённый вход не учитывается
Нельзя снять последнийЕсли выбран только 1 вход — его нельзя отключить
Множественный выборМожно выбрать любую комбинацию входов

Поддержание актуальности данных

  1. Изменение справочника опций (options):

    • Новые опции появятся только для новых заказов
    • Существующие заказы хранят копии опций в order_item_options
  2. Изменение цен товаров (products.price):

    • Влияет только на новые заказы
    • Существующие позиции хранят цену на момент добавления в order_items.price
  3. Пересчёт — вызывается автоматически при любом изменении:

    • recalculateItem()recalculateTotals()$order->update()

6.3 Вкладка "Состав" — Подвкладка "Доп. опции"

Компонент: App\Livewire\Order\Compound (режим mode = 'extras')

Источники данных

ДанныеТаблица/МодельСвязь
Доп. товары заказаorder_product / OrderProductorder_id
Справочник товаровproducts / Productproduct_id
Категорииcategories / Categoryadditional = true

Структура интерфейса

┌─────────────────────────────────────────────────────────────────┐
│                      [+ Добавить]                               │
├─────────────────────────────────────────────────────────────────┤
│ [Фото] Насос Belamos DWP 750   [-] 1 [+]   13 900   [Удалить]   │
│        (фекальный насос)                                        │
├─────────────────────────────────────────────────────────────────┤
│                                     Итого: 13 900 руб.          │
└─────────────────────────────────────────────────────────────────┘

Кнопки и действия

КнопкаМетодОписаниеВлияние на систему
+ ДобавитьaddProductAction()Открывает модальное окно выбора товараСоздаёт запись в order_product + order_items (is_main=false)
[-]minusProduct($id)Уменьшает количество (минимум 1)Обновляет count в order_product
[+]plusProduct($id)Увеличивает количествоОбновляет count, пересчитывает price_products
УдалитьdeleteProduct($id)Удаляет товар из заказаУдаляет запись из order_product

Откуда берутся дополнительные товары

  1. Категория с флагом additional = true (ID: 55 "Дополнительные товары")

  2. Метод getAdditionalCategoriesWithProducts():

    $categories = Category::where('additional', true)->get();
    foreach ($categories as $category) {
        $products = $products->merge($category->allProducts());
    }
    // Фильтруем только активные (active = 1)
  3. Типы дополнительных товаров:

    • Компрессоры (Hiblow, Secoh)
    • Насосы (фекальные, дренажные)
    • Комплектующие

Расчёт дилерской цены для доп. товаров

// Для дополнительных товаров используется dealer_price из справочника:
if ($product->isAdditionalProduct()) {
    return $product->dealer_price;  // готовая дилерская цена
}

Различие от основных товаров:

  • Основные товары: dealer_price = price * (1 - скидка_дилера%)
  • Дополнительные: dealer_price — фиксированное значение из справочника

Поддержание актуальности

  1. Добавление новых доп. товаров:

    • Добавить товар в таблицу products
    • Привязать к категории с additional = true через category_product
    • Установить active = 1
    • Заполнить price и dealer_price
  2. Изменение цен:

    • Существующие записи в order_product хранят цену на момент добавления
    • Новые добавления используют актуальные цены из справочника

6.4 Блок "Стоимость" (правая панель)

Компонент: resources/views/components/order/costs.blade.php

Отображается на обеих подвкладках (Основные товары и Доп. опции).

Структура блока

┌─ Стоимость ──────────────────────────────┐
│ Цена                      189 300 руб.   │
│ Стоимость опций             1 500 руб.   │
│ Доп. опции                 13 900 руб.   │
│ Цена дилерская            132 510 руб.   │
├──────────────────────────────────────────┤
│ Итого для дилера          147 910 руб.   │
│ Итого для клиента         204 700 руб.   │
└──────────────────────────────────────────┘

Расшифровка полей

ПолеПеременнаяФормула
Цена$price * $countСумма розничных цен основных товаров
Стоимость монтажа$price_installЕсли install = true
Стоимость опций$price_optionsСумма включённых входов + опций
Наращивание (дилер)$total_step_price_dealerСумма step_price_dealer всех позиций
Наращивание (клиент)$total_step_priceСумма step_price всех позиций
Доп. опции$price_productsСумма дополнительных товаров
Цена дилерская$price_dealer * $countЦена с учётом скидки компании
Итого для дилера$cost_dealer(price_dealer * count) + step_price_dealer + price_options + price_products
Итого для клиента$cost(price * count) + step_price + price_options + price_products

6.5 Вкладка "История"

Таблица order_histories через компонент Order/History.php.

КолонкаИсточник
Дата и времяcreated_at
Пользовательuser_id → User
Статусstatus_key
Действиеaction

7. Уведомления

7.1 Telegram-уведомления

Настраиваются в таблице statuses для каждого статуса:

ФлагКому отправляется
notify_managerМенеджеру компании дилера
notify_dealerДилеру заказа
notify_adminВсем администраторам с tg_id
notify_makeВсем пользователям производства с tg_id

Формат сообщения:

Заказ - №2025_10_14.
В статусе - В производстве
Ссылка - https://lk.septiki-tver.ru/order/edit/282

7.2 Уведомление при загрузке файла дилером

Когда дилер загружает файл (files_dealer, payment_order, letter_attorney):

  • Менеджер компании получает Telegram-уведомление
  • Текст: "К заказу №... дилер прикрепил файл"

8. Ограничения и особенности

8.1 Технические ограничения

ОграничениеЗначение
Максимум наращивания500мм (50см)
Максимум входов3 (торец + лево + право)
Индивидуальная скидка0-100%
Формат номера заказаYYYY_MM_N

8.2 Валидация спецификации

Для генерации спецификации обязательны:

  • Компания дилера
  • Склад и его адрес
  • Способ доставки
  • ФИО заказчика
  • Телефон
  • Адрес (если доставка)

8.3 Особенности интерфейса

  1. Автосохранение — все поля сохраняются при потере фокуса
  2. Производство disabled — выбирается автоматически по складу
  3. Статусы как radio — доступные подсвечены, недоступные disabled
  4. Вкладки Filament — переключение через Alpine.js
  5. Чаты — real-time через Laravel Reverb/WebSocket

8.4 Известные проблемы

ПроблемаСтатусОписание
История изменений⚠️Фиксируются только смены статуса, не все поля
Статичность ценЗавершённые заказы не хранят снапшот цен
Серийные номера⚠️Нет полной интеграции со складом

Приложение: SQL-структура ключевых таблиц

Таблица orders

- id, number, specification_number
- product_id, dealer_id, status_key
- manufacture_id, stock_id
- date_make, date_made, date_delivery, date_payment
- receiver, phone, email, address
- payment, delivery, install, deferred_payment
- comment, contact_name, contact_phone, address_make
- price, price_dealer, price_options, price_products, price_install
- cost, cost_dealer, count
- step_size, step_price, step_price_dealer
- sn, product_stock_id
- files, files_dealer, files_manager (JSON)
- specification, invoice, payment_order, letter_attorney
- created_at, updated_at, deleted_at

Таблица status_transitions

- id, parent_status_id, child_status_id
- required_fields, forced_fields (JSON)
- dealer_can, dealers_can
- manager_can, managers_can
- production_can, productions_can

On this page

Полная документация по работе с заказамиСодержание1. Список заказов1.1 Элементы интерфейса1.2 Колонки таблицы1.3 Действия в списке2. Карточка заказаСтруктура интерфейса1. Заголовок2. Статусы заказа3. ВкладкиВкладка "Общая информация"Левая часть — Основные поляБлок дат и номеровБлок оплаты и доставкиБлок "Данные заказа"Блок "Контактное лицо на объекте"Блок "Файлы"Правая часть — Документы и чатыГенерация документовПрикрепление документовЧатыВкладка "Состав"Режимы отображения:Функции для каждой позиции:Расчет цен:Вкладка "История"3. Статусы и переходы3.1 Все статусы системы3.2 Матрица переходов между статусами3.3 Подробные переходы4. Права доступа по ролям4.1 Матрица прав по статусам4.2 Администратор (group_id = 1)4.3 Менеджер (group_id = 3)4.4 Дилер (group_id = 2)4.5 Производство (group_id = 4)Пошаговая работа с заказомСценарий: Обработка нового заказа (Менеджер)Сценарий: Добавление серийного номера (Производство)Автосохранение5. Бизнес-логика5.1 Создание заказа5.2 Система скидок дилераИсточник скидокПрименение скидкиИндивидуальная скидка5.3 Расчёт стоимости5.4 Удаление заказа5.5 Отмена заказа6. Вкладки карточки (детально)6.1 Вкладка "Общая информация"6.2 Вкладка "Состав" — Подвкладка "Основные товары"Источники данныхСтруктура позиции основного товараКнопки и действияЛогика расчёта ценОткуда берутся опции (входы и одиночные)Правила входовПоддержание актуальности данных6.3 Вкладка "Состав" — Подвкладка "Доп. опции"Источники данныхСтруктура интерфейсаКнопки и действияОткуда берутся дополнительные товарыРасчёт дилерской цены для доп. товаровПоддержание актуальности6.4 Блок "Стоимость" (правая панель)Структура блокаРасшифровка полей6.5 Вкладка "История"7. Уведомления7.1 Telegram-уведомления7.2 Уведомление при загрузке файла дилером8. Ограничения и особенности8.1 Технические ограничения8.2 Валидация спецификации8.3 Особенности интерфейса8.4 Известные проблемыПриложение: SQL-структура ключевых таблицТаблица ordersТаблица status_transitions