При доработке и повторной отправке writeRoute раньше удалял все строки
маршрута и создавал заново — кто вернул или отклонил заявку и с каким
комментарием, терялось. Теперь маршрут пересохраняется патчем
(planRoutePatch + ApprovalListService.patchSteps): строки, что остаются в
маршруте, обновляются на месте, и их прошлые решения лежат в истории
версий; недостающие шаги создаются, выпавшие и строки делегатов уходят в
корзину. Всё одним пакетом. Проверено пилотами на увольнении и рабочем
месте (обе фазы, уход в корзину). Аварийный откат для всех форм —
ROUTE_PATCH_ENABLED = false.
Из версий строк маршрута и заявки собирается лента «История
согласования» (shared/approval/history): отправки, решения с
комментариями и временем на шаге, делегирование, замена исполнителя,
у кого заявка сейчас. Свёрнутый раздел в карточке и в форме доработки
всех форм, грузится только при раскрытии.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Если последний рабочий день раньше, чем через месяц от сегодня, под полем
показывается причина и минимальная дата. Раньше кнопки отправки просто
становились неактивными без объяснения — это случалось у заявлений,
пролежавших на доработке: дата, допустимая при подаче, переставала
подходить. Правило и текст вынесены в lastWorkingDay.ts и общие для
подсказки и проверки перед отправкой.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Подпись «Организация заявителя» заменена на «Организация» — в форме,
в подсказке незаполненных полей и в манифесте колонки (как у остальных
форм; на существующую колонку SharePoint манифест не влияет).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
После возврата заявки с одним согласующим каждый добавленный на доработке
шаг показывался «Возвращена на доработку»: statusForNewRow копировал общий
статус строк. Решения (согласовано/возвращено/отклонено/выполнено) больше
не копируются — новый шаг показывается с «—». В SharePoint это не
попадало: writeRoute и раньше писал всем строкам «Ждёт очереди».
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Иконка людей совпадала с иконкой категории «Отдел рекрутинга» и плитки
«Заявка на прием» и не говорила, что за кнопкой список заявок. Заменена
на menu на плитке, на кнопке формы и в боковом меню.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Все места, где права выданы сверх обычных (по email, должности, группе
SharePoint или в админке approval-route), собраны в одну таблицу с
файлами проверок — чтобы не потерять их при переезде на группы
SharePoint или смене сотрудника. Ссылка добавлена в docs/forms.md.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Фильтр SharePoint substringof по Title пользователей сайта для кириллицы
чувствителен к регистру: «тимур» не находил «Тимур Городецкий». Теперь
ищутся сразу несколько написаний (как введено, строчными, с заглавной
каждого слова) и по email. Касается всех полей выбора сотрудника в
маршруте: делегирование, добавление согласующего, замена исполнителя.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Начальник отдела подбора (routeEditRights) назначает исполнителей, но
сама в исполнении не стоит. В матрице «Исполнение» заявки на подбор у
шагов «Ждёт очереди» и «На исполнении» появились кнопки «Заменить» и
«Удалить»:
- замена меняет только человека в шаге, активный шаг сразу переходит
к новому исполнителю, ему уходит оповещение;
- при удалении активного очередь переходит к следующему исполнителю;
- выполненные шаги не трогаются, последнего невыполненного исполнителя
можно только заменить — иначе заявка закрылась бы без исполнения.
Остальные формы не затронуты: кнопки включаются пропсами ApprovalMatrix
(canReplaceRow/onReplaceRow) только в RecruitingSelectionView.
notifyActiveStep получил необязательный rowId, чтобы на параллельном
шаге письмо ушло именно новому исполнителю.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Показывает, у кого заявка сейчас: ФИО и почта согласующего или
исполнителя текущего шага (несколько — параллельный шаг, при
делегировании — делегат), при доработке — инициатор. Есть в
«Инициированных», «Согласованных», «Выполненных мной» и «Все заявки»;
в очередях и «Доработке» держатель всегда сам пользователь.
Дочитывается только для видимой страницы, одним запросом на список
согласования. Группировка по партициям вынесена в approvalPartitionsFor
и общая с комментарием к решению.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
В «Все заявки», «Моих заявках» и «Поиске» ФИО бралось из поискового
свойства Author, где SharePoint перечисляет через «;» всех, кто правил
элемент. У заявки, которую поправил согласующий, в «Авторе» оказывалось
«Инициатор;Согласующий». Теперь ФИО берётся из AuthorOWSUSER — того же
поля «Создано», откуда и почта.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Во всех разделах со списками заявок (На согласовании, На исполнении,
Доработка, Мои заявки, Все заявки):
- фильтры по типу, статусу и периоду даты создания, кнопка «Сбросить»;
- сортировка по клику на заголовок: номер (по числам), тип, дата, статус.
Без фильтров загрузка прежняя, постраничная. При активном фильтре или
сортировке загружается полный список раздела и обрабатывается в памяти,
иначе отсортировалась бы только текущая страница.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Тип заявки и так виден в колонке «Тип», префикс в названии только
удлинял его:
- подбор: «Должность — Проект»;
- приём: «ФИО — Должность — Проект».
Уже созданные заявки сохраняют старое название до пересохранения.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Поле было только для чтения и не позволяло поправить организации. Теперь
это CompanyPickerMulti, как в подборе: предзаполняется по заявителю и
редактируется, обязательное. Компании хранятся в WorkplaceCompaniesJson,
Organization пересобирается текстом для печати и старых заявок.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
employeeCompanies() нужен теперь не только подбору, но и заявке на рабочее
место — одна реализация вместо копий в каждой форме.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
После согласования подбор сразу уходит в «Выполнение», поэтому фильтр
только по «Согласовано» почти всегда давал пустой список. Теперь берутся
все утверждённые статусы, как в isApprovedStatus.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Если нужной базы нет в списке, заявитель отмечает «Другое» и вписывает
название в обязательное поле. Текст хранится в отдельной колонке DB1COther,
показывается в просмотре и попадает в карточку Planner.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Название вкладки и подпись в шапке форм категории — чтобы было видно,
что заявки в отдел 1С лежат здесь же.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
«Виды работ», «Организация» и «База 1С» теперь читаются из колонок списка
(общий хук shared/fieldChoices), а не из констант: новый пункт добавляется
в параметрах столбца без правки кода и деплоя. Пилот — на форме 1С, при
успехе переводим остальные формы. В стартовые варианты provisioning.json
добавлен «Маршруты в ДО».
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- СЗ на перемещение ТМЦ: поле «Куда» предзаполняется проектом-получателем
по строке-источнику Dataverse (cree9_demandline -> lzk position -> LZK ->
project id), см. shared/dataverse/lzkPosition.service.ts
- Заявка 1С досрочно разморожена для всех пользователей (UNFROZEN_FORMS
в SubmitActions), остальные формы остаются замороженными
- Поле «Отдел» в заявке 1С сделано read-only
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Провижининг (Provision-Lists.ps1 читает эти манифесты) теперь заводит колонку
«Автосогласование» (AutoApprove, Да/Нет) в каждом из 12 списков согласования —
рядом с уже существующими SLAhours/AskOverdueReason.
Значение приходит из resolve (approval-route API, шаг маршрута настраивается
только в админке — портал само значение не выбирает, только переносит его в
строку списка при отправке заявки/сохранении черновика, тем же путём, что и
slaHours/askOverdueReason). Фактическое автосогласование по истечении SLA
делает фоновая задача бэкенда (Hangfire), не портал.
В ApprovalMatrix добавлена пометка «(авто)» рядом со значением SLA — чисто
информативно, чтобы участник видел, что решение по шагу может принять не
только человек.
Примечание: ServiceRequest и TmcTransfer не передают ни slaHours/
askOverdueReason, ни (теперь) autoApprove из resolve в строку — это
существовавший пробел (SLA на уровне шага у этих двух форм и раньше не
работал), автосогласование для них наследует только это же ограничение.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
---------
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/20