Alexander Musikhin 2 недель назад
Родитель
Сommit
931f18458a
4 измененных файлов с 110 добавлено и 50 удалено
  1. 2 2
      docs/refactor/menu.md
  2. 11 10
      docs/refactor/plan.md
  3. 93 34
      docs/refactor/tz-reclamations.md
  4. 4 4
      docs/refactor/tz-schedules.md

+ 2 - 2
docs/refactor/menu.md

@@ -96,9 +96,9 @@ Manager
 | Пункт | Статус | Текущий маршрут | Комментарий |
 |---|---|---|---|
 | Все | Есть | `reclamations.index` | Общий список всех рекламаций. |
-| ДКР | Частично | `reclamations.index` | Отдельная вкладка текущего списка с обязательным фильтром по источнику `ДКР`; только здесь доступны рекламации для формирования платежных документов. |
+| ДКР | Частично | `reclamations.index` | Отдельная вкладка текущего списка с обязательным фильтром по типу `dkr` (`ДКР`); только здесь доступны рекламации для формирования платежных документов. |
 
-Рекламации из `График заказов` создаются из карточки заказа после выбора одного или нескольких МАФ. Открывается текущая форма создания, источник устанавливается `Прочее`; такие рекламации не выводятся во вкладке `ДКР`, и для них недоступна документация для оплаты.
+Рекламации из `График заказов` создаются из карточки заказа после выбора одного или нескольких МАФ. Открывается текущая форма создания, назначается тип `other` (`Прочее`) из справочника `reclamation_types`; такие рекламации не выводятся во вкладке `ДКР`, и для них недоступна документация для оплаты.
 
 ### Запчасти
 

+ 11 - 10
docs/refactor/plan.md

@@ -38,11 +38,11 @@
 - [x] На новые модули выбранный год не влияет.
 - [x] `Технич. описание` встроено в модуль `Каталог общий`; готовый Laravel-модуль используем как источник экспорта.
 - [x] `Калькуляции` работают через внешний API: запрос по артикулу, возврат калькуляции при наличии.
-- [x] `Рекламации -> ДКР` реализуется как отдельная вкладка на основе текущего списка с обязательным фильтром по источнику.
-- [x] Источник рекламации хранится отдельным полем: при создании из площадки — `ДКР`, иначе `Прочее`.
+- [x] `Рекламации -> ДКР` реализуется как отдельная вкладка на основе текущего списка с обязательным фильтром по типу `dkr`.
+- [x] Тип рекламации хранится через обязательную связь со справочником `reclamation_types`; начальные типы `ДКР` и `Прочее` создаются сидером.
 - [x] В интерфейсе рекламаций обязательны отдельные вкладки `Все` и `ДКР`.
-- [x] Из графика заказов рекламация создается по выбранным МАФ через текущую форму и получает источник `Прочее`.
-- [x] Документация для оплаты доступна только для рекламаций источника `ДКР`.
+- [x] Из графика заказов рекламация создается по выбранным МАФ через текущую форму и получает тип `other` (`Прочее`).
+- [x] Документация для оплаты доступна только для рекламаций типа `ДКР`.
 - [x] Маршруты `Каталог общий` используют префикс `common-catalog/...`.
 - [x] Таблицы и права `Каталог общий` используют техническое имя `common-catalog`.
 - [x] Техническое имя модуля `Склад наличие`: `stock`.
@@ -71,7 +71,7 @@
 |---|---|---|
 | 1. Реорганизация меню и заглушки | Реализован и проверен | Новое меню и заглушки приняты по результатам пользовательской проверки. |
 | 2. Адаптация существующих разделов после переноса | Реализован, ожидает пользовательской проверки | Рабочие разделы проверены, навигация запчастей и доступ к справочнику уточнены, регрессионные тесты проходят. |
-| 3. Рекламации: вкладки и источник | Готов к реализации | Решены вкладки `Все`/`ДКР`, поле источника и запрет платежных документов для `Прочее`. |
+| 3. Рекламации: вкладки и тип | Готов к реализации | Решены вкладки `Все`/`ДКР`, справочник типов, начальные значения и запрет платежных документов для `Прочее`. |
 | 4. Общий каталог: ядро | Готов к реализации | Есть маршрутный префикс, техническое имя, шаблон Excel, состав колонок и предварительные типы данных. |
 | 5. Документация | Готов к реализации | Решены дерево папок, наследование прав, версии и хранение файлов. |
 | 6. Склад наличие: ядро | Готов после ядра общего каталога | Логика берется из `Запчасти`, но позиции должны браться из `Каталог общий`. PDF-экспорт остается отдельным открытым подпунктом. |
@@ -119,17 +119,18 @@
 - [x] Проверить доступы для пользователей, ролей и настроек.
 - [x] Проверить необходимость новых прав: на этом этапе новые права не потребовались.
 
-## Этап 3. Рекламации: вкладки и источник
+## Этап 3. Рекламации: вкладки и тип
 
 Статус: **готов к реализации для текущих рекламаций**.
 
 Создание рекламации из графика заказов вынесено в отдельный этап, потому что зависит от реализации графика заказов.
 
 - [ ] Реализовать отдельные вкладки `Все` и `ДКР`.
-- [ ] Реализовать вкладку `ДКР` на текущем списке с обязательным фильтром по источнику.
-- [ ] Добавить отдельное поле источника рекламации: `ДКР` / `Прочее`.
+- [ ] Создать справочник `reclamation_types` и заполнить его типами `ДКР` / `Прочее` через сидер.
+- [ ] Добавить обязательную связь `reclamations.reclamation_type_id` и перенести существующие записи на тип `ДКР`.
+- [ ] Реализовать вкладку `ДКР` на текущем списке с обязательным фильтром по типу `dkr`.
 - [ ] Проверить создание рекламаций по площадкам ДКР.
-- [ ] Запретить формирование документации для оплаты для рекламаций источника `Прочее`.
+- [ ] Запретить формирование документации для оплаты для рекламаций типа `Прочее`.
 - [ ] Проверить формирование запросов на запчасти из рекламации.
 - [ ] Сохранить текущую рабочую логику рекламаций.
 
@@ -232,7 +233,7 @@
 
 Статус: **готово после этапа 9**.
 
-- [ ] Реализовать создание рекламации из графика заказов по выбранным МАФ с источником `Прочее`.
+- [ ] Реализовать создание рекламации из графика заказов по выбранным МАФ с типом `other` (`Прочее`).
 - [ ] В карточке заказа дать выбор одного или нескольких МАФ.
 - [ ] Открывать текущую форму создания рекламации с предзаполненными данными.
 - [ ] Проверить, что рекламация попадает во вкладку `Все` и не попадает во вкладку `ДКР`.

+ 93 - 34
docs/refactor/tz-reclamations.md

@@ -62,7 +62,7 @@
 - внутри раздела реализовать отдельные вкладки `Все` и `ДКР`;
 - текущий маршрут `reclamations.index` оставить без переименования;
 - текущий маршрут `reclamations.show` оставить без переименования;
-- вкладку `ДКР` реализовать на текущем списке с обязательным фильтром по источнику `ДКР`;
+- вкладку `ДКР` реализовать на текущем списке с обязательным фильтром по типу рекламации `ДКР`;
 - реорганизация меню выполняется в общем этапе Manager 2.0.
 
 ## 4. Права доступа
@@ -81,7 +81,58 @@
 - пользователи с текущим доступом к рекламациям должны сохранить доступ;
 - верхний пункт `Рекламации` показывать, если доступен хотя бы один дочерний пункт.
 
-## 5. Подраздел `Все`
+## 5. Справочник типов рекламаций
+
+Тип рекламации должен храниться не строковым полем, а ссылкой на отдельный системный справочник.
+
+### 5.1. Таблица типов
+
+Создать таблицу `reclamation_types` со следующими полями:
+
+| Поле | Тип | Требование |
+|---|---|---|
+| `id` | `bigint` | Первичный ключ. |
+| `code` | `string` | Уникальный стабильный код типа. |
+| `name` | `string` | Отображаемое название типа. |
+| `created_at`, `updated_at` | `timestamps` | Служебные даты. |
+
+Начальные записи справочника:
+
+| `code` | `name` |
+|---|---|
+| `dkr` | `ДКР` |
+| `other` | `Прочее` |
+
+Требования:
+
+- создать модель `ReclamationType`;
+- определить в модели константы кодов `CODE_DKR = 'dkr'` и `CODE_OTHER = 'other'`;
+- создать сидер `ReclamationTypeSeeder`;
+- сидер должен идемпотентно создавать или обновлять типы по полю `code`;
+- зарегистрировать `ReclamationTypeSeeder` в общем процессе заполнения БД;
+- системные коды `dkr` и `other` использовать в бизнес-логике вместо сравнения отображаемых названий;
+- на текущем этапе отдельный интерфейс управления справочником не требуется;
+- удаление используемого типа рекламации должно быть запрещено внешним ключом (`restrictOnDelete`).
+
+### 5.2. Связь с рекламацией
+
+В таблицу `reclamations` добавить обязательное поле `reclamation_type_id`:
+
+- внешний ключ на `reclamation_types.id`;
+- индекс для фильтрации списков;
+- связь `Reclamation::reclamationType()`;
+- обратная связь `ReclamationType::reclamations()`;
+- существующим рекламациям при переносе данных назначить тип с кодом `dkr`;
+- после заполнения существующих записей поле не должно допускать `null`.
+
+Тип назначается сервером по сценарию создания:
+
+- рекламация, созданная из площадки ДКР, получает тип `dkr`;
+- рекламация, созданная не из площадки, включая график заказов, получает тип `other`;
+- клиентская форма не должна позволять подменить автоматически определенный тип;
+- если в будущем потребуется ручной выбор типа, это оформляется отдельным изменением требований и прав доступа.
+
+## 6. Подраздел `Все`
 
 Назначение:
 
@@ -94,15 +145,15 @@
 - экспорт;
 - переход в карточку;
 - отображение статусов;
-- отображение рекламаций по ДКР и прочих рекламаций.
-- вкладка содержит все рекламации независимо от источника;
-- наличие рекламации во вкладке `Все` не дает права формировать платежные документы, если источник не `ДКР`.
+- отображение рекламаций по ДКР и прочих рекламаций;
+- вкладка содержит все рекламации независимо от типа;
+- наличие рекламации во вкладке `Все` не дает права формировать платежные документы, если тип не `ДКР`.
 
 Текущая основа:
 
 - `reclamations.index`.
 
-## 6. Подраздел `ДКР`
+## 7. Подраздел `ДКР`
 
 Назначение:
 
@@ -112,25 +163,25 @@
 Функционал:
 
 - отображение только рекламаций типа `ДКР`;
-- отдельная вкладка интерфейса на основе текущего списка с обязательным фильтром по источнику;
+- отдельная вкладка интерфейса на основе текущего списка с обязательным фильтром по типу рекламации;
 - создание рекламации с привязкой к площадке ДКР;
 - сохранение текущей карточки рекламации;
 - связь с графиком монтажей;
 - формирование запросов на запчасти;
-- формирование документации для оплаты только по рекламациям источника `ДКР`.
+- формирование документации для оплаты только по рекламациям типа `ДКР`.
 
 Принятое решение:
 
 - отдельный URL для списка `ДКР` не обязателен;
 - в интерфейсе обязательно отдельное разделение на вкладки `Все` и `ДКР`;
-- вкладка `ДКР` использует текущий список с обязательным фильтром по источнику рекламации;
-- для определения источника рекламации добавляется отдельное поле;
-- при создании рекламации из площадки источник устанавливается `ДКР`;
-- при создании рекламации не из площадки, включая создание из графика заказов, источник устанавливается `Прочее`;
-- рекламации источника `Прочее` не выводятся во вкладке `ДКР`;
-- формирование документации для оплаты разрешено только для рекламаций источника `ДКР`.
+- вкладка `ДКР` использует текущий список с обязательным фильтром по `reclamation_type_id` типа с кодом `dkr`;
+- тип рекламации определяется через справочник `reclamation_types`;
+- при создании рекламации из площадки назначается тип `dkr` (`ДКР`);
+- при создании рекламации не из площадки, включая создание из графика заказов, назначается тип `other` (`Прочее`);
+- рекламации типа `Прочее` не выводятся во вкладке `ДКР`;
+- формирование документации для оплаты разрешено только для рекламаций типа `ДКР`.
 
-## 7. Карточка рекламации
+## 8. Карточка рекламации
 
 Карточка должна сохранить текущий функционал:
 
@@ -150,12 +201,12 @@
 Изменения на первом этапе:
 
 - не менять структуру карточки;
-- добавить/использовать отображение источника рекламации `ДКР` / `Прочее`;
-- для источника `Прочее` скрыть и запретить серверной проверкой формирование документации для оплаты;
-- для источника `ДКР` сохранить текущую возможность формирования документации для оплаты;
+- отображать тип рекламации из справочника `ДКР` / `Прочее`;
+- для типа `Прочее` скрыть и запретить серверной проверкой формирование документации для оплаты;
+- для типа `ДКР` сохранить текущую возможность формирования документации для оплаты;
 - сохранить текущие маршруты и формы.
 
-## 8. Создание из графика заказов
+## 9. Создание из графика заказов
 
 Сценарий:
 
@@ -171,49 +222,53 @@
 - использовать существующую форму создания рекламации;
 - поддержать выбор одного или нескольких МАФ;
 - привязать созданную рекламацию к заказу и выбранным МАФ;
-- источник созданной рекламации установить `Прочее`;
+- назначить созданной рекламации тип `other` (`Прочее`);
 - созданная рекламация отображается во вкладке `Все`;
 - созданная рекламация не отображается во вкладке `ДКР`;
 - для нее недоступно формирование документации для оплаты;
 - остальные функции карточки рекламации работают по текущим правилам.
 
-## 9. Связи
+## 10. Связи
 
 | Модуль | Связь | Требование |
 |---|---|---|
 | ДКР / Площадки | Используется при создании рекламации типа `ДКР` | Сохранить текущую связь. |
 | Каталог общий | Данные по позициям | Использовать общий каталог как источник номенклатуры. |
-| График заказов | Из заказа создается рекламация по одному или нескольким МАФ | Открывать текущую форму создания с предзаполненным заказом и выбранными МАФ; источник `Прочее`. |
+| График заказов | Из заказа создается рекламация по одному или нескольким МАФ | Открывать текущую форму создания с предзаполненным заказом и выбранными МАФ; назначать тип `other` (`Прочее`). |
 | График монтажей | Рекламация может попасть в монтажный график | Сохранить текущую связь. |
 | Запчасти | Из рекламации формируется запрос на запчасть | Сохранить текущую связь и резервы. |
 
-## 10. Что не входит в первый этап
+## 11. Что не входит в первый этап
 
 - изменение текущих маршрутов `reclamations.*`;
-- переработка модели `Reclamation` сверх добавления поля источника и связей с заказом/выбранными МАФ;
+- переработка модели `Reclamation` сверх добавления типа рекламации и связей с заказом/выбранными МАФ;
 - изменение логики резервов запчастей;
 - изменение состава и шаблонов документации для оплаты;
 - разработка графика заказов;
 - внедрение новых прав доступа.
 
-## 11. Этапы реализации
+## 12. Этапы реализации
 
 - [ ] Проверить текущие маршруты `reclamations.*`.
 - [ ] Проверить текущие permissions рекламаций.
 - [ ] Добавить верхнюю группу меню `Рекламации`.
 - [ ] Добавить отдельные вкладки `Все` и `ДКР`.
-- [ ] Реализовать вкладку `ДКР` на текущем списке с обязательным фильтром по источнику.
-- [ ] Добавить отдельное поле источника рекламации `ДКР` / `Прочее`.
+- [ ] Создать таблицу `reclamation_types` и модель `ReclamationType`.
+- [ ] Создать и зарегистрировать `ReclamationTypeSeeder` с типами `dkr` (`ДКР`) и `other` (`Прочее`).
+- [ ] Добавить `reclamations.reclamation_type_id`, внешний ключ, индекс и связи моделей.
+- [ ] Назначить существующим рекламациям тип `dkr` и сделать поле типа обязательным.
+- [ ] Реализовать вкладку `ДКР` на текущем списке с обязательным фильтром по типу `dkr`.
 - [ ] Проверить открытие карточки рекламации.
 - [ ] Проверить создание рекламации по площадке ДКР.
 - [ ] Реализовать создание рекламации из графика заказов с выбором одного или нескольких МАФ.
 - [ ] Передавать заказ и выбранные МАФ в текущую форму создания рекламации.
-- [ ] Запретить формирование документации для оплаты для источника `Прочее`.
+- [ ] Автоматически назначать тип рекламации в зависимости от сценария создания.
+- [ ] Запретить формирование документации для оплаты для типа `Прочее`.
 - [ ] Проверить связь с графиком монтажей.
 - [ ] Проверить блок запчастей и резервов.
 - [ ] Проверить экспорт рекламаций.
 
-## 12. Критерии приемки
+## 13. Критерии приемки
 
 - В меню есть группа `Рекламации`.
 - Внутри есть отдельные вкладки `Все` и `ДКР`.
@@ -221,13 +276,17 @@
 - Текущие маршруты рекламаций сохранены.
 - Пользователи с прежним доступом сохраняют доступ.
 - Рекламации типа `ДКР` связаны с площадками ДКР.
-- При создании рекламации из площадки источник автоматически устанавливается `ДКР`.
-- При создании рекламации не из площадки источник устанавливается `Прочее`.
-- Вкладка `ДКР` открывает текущий список с обязательным фильтром по источнику `ДКР`.
+- Типы рекламаций хранятся в отдельной таблице `reclamation_types`.
+- Сидер создает типы `dkr` (`ДКР`) и `other` (`Прочее`) без дублирования при повторном запуске.
+- Каждая рекламация имеет обязательную ссылку `reclamation_type_id` на справочник типов.
+- Существующие рекламации после миграции имеют тип `ДКР`.
+- При создании рекламации из площадки автоматически назначается тип `dkr` (`ДКР`).
+- При создании рекламации не из площадки назначается тип `other` (`Прочее`).
+- Вкладка `ДКР` открывает текущий список с обязательным фильтром по типу `dkr`.
 - Рекламации из графика заказов не попадают во вкладку `ДКР`.
 - Из графика заказов можно выбрать один или несколько МАФ и открыть текущую форму создания рекламации.
 - Созданная из графика заказов рекламация привязана к заказу и выбранным МАФ.
-- Документация для оплаты формируется только для рекламаций источника `ДКР`.
-- Для рекламаций источника `Прочее` действие формирования платежных документов отсутствует и блокируется на сервере.
+- Документация для оплаты формируется только для рекламаций типа `ДКР`.
+- Для рекламаций типа `Прочее` действие формирования платежных документов отсутствует и блокируется на сервере.
 - Из рекламации по-прежнему можно работать с запчастями.
 - Перенос рекламации в график монтажей работает как раньше.

+ 4 - 4
docs/refactor/tz-schedules.md

@@ -116,7 +116,7 @@
 - пользователь должен выбрать минимум один МАФ;
 - допускается выбор нескольких МАФ;
 - после нажатия `Добавить рекламацию` открывается текущая форма создания рекламации;
-- источник рекламации устанавливается `Прочее`;
+- рекламации назначается тип `other` (`Прочее`) из справочника типов;
 - рекламация отображается в общей вкладке рекламаций и не отображается во вкладке `ДКР`;
 - для такой рекламации не формируется документация для оплаты.
 
@@ -219,7 +219,7 @@
 - связи не должны ломать автономность ДКР;
 - текущий график монтажей должен работать до реализации графика заказов;
 - новые графики должны опираться на `Каталог общий`, а не на каталог внутри ДКР;
-- рекламация из графика заказов должна получать источник `Прочее`.
+- рекламация из графика заказов должна получать тип `other` (`Прочее`) из справочника типов.
 
 ## 9. Данные и модели
 
@@ -281,7 +281,7 @@
 - [ ] Реализовать карточку заказа с выбором одного или нескольких МАФ.
 - [ ] Добавить действие `Добавить рекламацию`.
 - [ ] Открывать текущую форму рекламации с переданными заказом и выбранными МАФ.
-- [ ] Устанавливать источник созданной рекламации `Прочее`.
+- [ ] Назначать созданной рекламации тип `other` (`Прочее`).
 
 ## 12. Критерии приемки
 
@@ -295,7 +295,7 @@
 - График монтажей продолжает работать с рекламациями.
 - Из карточки заказа можно выбрать один или несколько МАФ и открыть форму создания рекламации.
 - Созданная рекламация связана с заказом и выбранными МАФ.
-- Созданная рекламация имеет источник `Прочее`, не попадает во вкладку `ДКР` и не позволяет формировать документацию для оплаты.
+- Созданная рекламация имеет тип `other` (`Прочее`), не попадает во вкладку `ДКР` и не позволяет формировать документацию для оплаты.
 
 ## 13. Открытые вопросы