# ТЗ: Подрядчики и формирование спецификаций на монтаж ## 1. Цель Добавить в систему учёт подрядчиков с индивидуальными прайсами на монтаж МАФ и возможность формировать Excel-спецификации на монтаж по площадке. --- ## 2. Раздел «Подрядчики» в Администрировании ### 2.1. Список подрядчиков - В меню **Администрирование** добавить пункт **«Подрядчики»**. - Страница представляет собой таблицу со списком всех подрядчиков. - Кнопка **«Добавить подрядчика»** — открывает форму создания. - Клик по строке — открывает карточку подрядчика на редактирование. - Удаление подрядчиков не предусмотрено. - Для подрядчика нужна возможность скрытия из выпадающих списков без удаления из справочника. ### 2.2. Карточка подрядчика (создание/редактирование) Поля (все редактируемые в режиме просмотра): | # | Поле | Тип | Примечание | |---|------|-----|------------| | 1 | Наименование подрядчика | текст | короткое имя для выпадающих списков | | 2 | Юридическое имя | текст | полное юр. наименование | | 3 | № договора | текст | | | 4 | Дата договора | дата | | | 5 | ФИО руководителя | текст | | | 6 | Форма организации | select | ИП / ООО / Самозанятый | | 7 | Налог | select | Без НДС / 5% / 7% / 15% / 22% | | 8 | Шапка в договоре | textarea (большое поле) | используется в шаблоне спецификации | Все 8 полей обязательны для создания и сохранения подрядчика. --- ## 3. Вкладка «Цены монтажа» в карточке подрядчика Вкладка **«Цены монтажа»** доступна ролям **Администратор** и **Помощник руководителя**. Эти же роли могут редактировать цены монтажа и наименования для спецификации. ### 3.1. Таблица цен Внутри карточки подрядчика — вкладка **«Цены монтажа»**. Таблица формируется на основе **каталога МАФ текущего года**. Для каждого нового года прайс подрядчика начинается пустым: каталог текущего года выводится, а поля «Наименование по спецификации» и «Цена монтажа» изначально пустые. Колонки: | # | Колонка | Источник | |---|---------|----------| | 1 | Картинка МАФ | каталог МАФ текущего года | | 2 | Артикул МАФ | каталог МАФ текущего года | | 3 | Номер номенклатуры | каталог МАФ текущего года | | 4 | Наименование по спецификации | заполняется импортом или руками (уникально для подрядчика) | | 5 | Цена монтажа | заполняется импортом или руками (уникально для подрядчика) | У каждого подрядчика — **собственный набор значений** для колонок 4 и 5. Редактирование прямо в строке таблицы не требуется. Редактирование значений колонок 4 и 5 выполняется через модальное окно редактирования строки либо через импорт. Если МАФ убран из каталога, его цена у подрядчика сохраняется и строка остаётся в списке с пометкой **«МАФ недоступен»**. ### 3.2. Формат файла импорта/экспорта Импорт и экспорт используют **единый набор колонок** (5 колонок), полностью совпадающий с отображением в таблице «Цены монтажа»: 1. Картинка МАФ 2. Артикул МАФ 3. Номер номенклатуры 4. Наименование по спецификации 5. Цена монтажа Редактируемые при импорте: только **«Наименование по спецификации»** и **«Цена монтажа»**. Остальные колонки (картинка, артикул, номер номенклатуры) — справочные; берутся из каталога МАФ и при импорте игнорируются (используются только для идентификации строки по артикулу). Пустые значения при импорте: - пустая ячейка «Наименование по спецификации» очищает поле у подрядчика; - пустая ячейка «Цена монтажа» очищает цену и сохраняет значение `0`. ### 3.3. Импорт цен Кнопка **«Импортировать/обновить цены»**. **Логика:** - По **артикулу МАФ** (колонка 2) находим строку в таблице подрядчика. - Сравниваем значения «Наименование по спецификации» и «Цена монтажа». - Если значения отличаются — обновляем. - Если совпадают — пропускаем. - Если артикула в каталоге подрядчика нет — пишем в **лог ошибок** и продолжаем. - По окончании показываем сводку: обновлено / без изменений / ошибки. ### 3.4. Экспорт цен Кнопка **«Экспортировать»** — выгружает таблицу цен в Excel в формате, описанном в п. 3.2. Файл полностью совместим с импортом: можно поправить значения в редактируемых колонках и загрузить обратно. --- ## 4. Формирование спецификации на площадке ### 4.1. Кнопка «Спецификация» - В карточке площадки добавить кнопку **«Спецификация»** сразу после кнопки **«ТН»**. - **Видимость:** только роли **Администратор** и **Помощник руководителя**. - **Условие активации:** в площадке выбран как минимум **1 МАФ**. Иначе — сообщение «Выберите хотя бы один МАФ». ### 4.2. Модальное окно формирования Поля (каждое с подписью сверху): | # | Поле | Тип | Поведение | |---|------|-----|-----------| | 1 | Подрядчик | select | список из «Наименование подрядчика» | | 2 | № спецификации | текст | ручной ввод | | 3 | Дата спецификации | date | по умолчанию — сегодня, редактируемо | | 4 | Начало работ | date | пусто по умолчанию | | 5 | Окончание работ | date | авто = «Начало работ» + 4 календарных дня при заполнении п.4, редактируемо | | 6 | Кнопка «Сформировать» | — | генерирует Excel | ### 4.3. Агрегация МАФ для спецификации - В площадке МАФ может быть расписан построчно. В спецификации **одинаковые артикулы суммируются** в одну строку с указанием количества. - Стоимость позиции = Цена монтажа × Количество. - Если у выбранного подрядчика для одного или нескольких МАФ не указана цена монтажа, формирование спецификации блокируется. Пользователю показывается ошибка со списком проблемных артикулов. Документ не формируется. --- ## 5. Заполнение Excel-шаблона спецификации Заказчиком предоставлен шаблон (Приложение «Форма Спецификации»). Привязка полей: | Строка | Содержимое | Источник | |--------|------------|----------| | 2 | № договора и дата договора | карточка подрядчика | | 5 | № спецификации | модальное окно | | 9 | «Шапка в договоре» | карточка подрядчика | | 12 | `г. Москва, <Название площадки>` | площадка | | 14+ | Таблица позиций (см. ниже) | каталог подрядчика + площадка | | 21 | Итого = сумма колонки «Стоимость» | расчёт | | 22 | НДС (только если налог ≠ «Без НДС») | расчёт по формуле | | 23 | Итого суммой + прописью | расчёт + пропись | | 24 | «Без НДС» или «В т.ч. НДС X%» + сумма | карточка подрядчика | | 25, 26 | Начало работ / Окончание работ | модальное окно | | 27 | № договора и дата | карточка подрядчика | | 30 | Юридическое имя | карточка подрядчика | | 31 | Должность подписанта (см. маппинг) | карточка подрядчика | | 34 | ФИО руководителя | карточка подрядчика | > В исходном ТЗ п. xiii была указана «Строка 21». Подтверждено, что это опечатка: верная строка для должности подписанта — **строка 31**. ### 5.1. Таблица позиций (начиная со строки 14) Колонки: 1. **№ п/п** — автонумерация 2. **Наименование МАФ** — «Наименование по спецификации» из цен подрядчика 3. **Цена** — «Цена монтажа» из цен подрядчика 4. **Ед. изм** — из каталога МАФ 5. **Кол-во** — сумма одинаковых артикулов по площадке 6. **Стоимость** — Цена × Кол-во ### 5.2. Расчёт НДС (строка 22) Только если в карточке подрядчика выбран налог ≠ «Без НДС»: | Ставка | Формула | |--------|---------| | 5% | ИТОГО / 1,05 × 0,05 | | 7% | ИТОГО / 1,07 × 0,07 | | 15% | ИТОГО / 1,15 × 0,15 | | 22% | ИТОГО / 1,22 × 0,22 | Если «Без НДС» — **строка 22 оставляется пустой полностью** (не формируется). Строка 24 при этом содержит пометку **«Без НДС»**. Для ставок НДС строка 24 содержит текст **«В т.ч. НДС X%»** и рассчитанную сумму НДС. ### 5.3. Формат суммы прописью (строка 23) Формат: `157 300 рублей 00 копеек (Сто пятьдесят семь тысяч триста рублей 00 копеек)`. Правила: - сначала сумма цифрами; - затем в скобках сумма прописью; - копейки указываются цифрами в обеих частях. ### 5.4. Маппинг «Форма организации» → подпись (строка 31) | Форма | Текст | |-------|-------| | ИП | Индивидуальный предприниматель | | ООО | Генеральный директор | | Самозанятый | Самозанятый | --- ## 6. Модель данных (предварительно) Новые сущности: - `contractors` — карточка подрядчика (8 полей + признак скрытия из выпадающих списков + timestamps). - `contractor_installation_prices` — цены монтажа: `contractor_id`, `product_sku_id`, `catalog_year`, `name_in_spec`, `price`. История сформированных спецификаций не хранится. Документ формируется и скачивается «на лету»; дальнейшее хранение выполняется вне CRM. **Мультигодовая структура:** цены монтажа привязаны к году каталога. При наступлении нового года прайс подрядчика не копируется из прошлого года; значения для нового каталога заполняются заново вручную или импортом. --- ## 7. Роли и права - Раздел «Подрядчики»: **Администратор** (полный доступ). - Кнопка «Спецификация» на площадке: **Администратор**, **Помощник руководителя**. - Вкладка «Цены монтажа»: просмотр и редактирование — **Администратор**, **Помощник руководителя**. --- ## 8. Открытые вопросы Часть вопросов закрыта ответами заказчика и перенесена в это ТЗ. Остаются открытыми: - формат вывода дат в Excel-шаблоне; - точное расположение кнопки «Спецификация» в интерфейсе карточки площадки; - нужны ли поиск, фильтрация, сортировка и пагинация в таблице «Цены монтажа». Развёрнутый список вопросов к заказчику: [contractors-questions.md](./contractors-questions.md). Ответы заказчика: [contractors-answers.md](./contractors-answers.md).