153c966f0b
При доработке и повторной отправке writeRoute раньше удалял все строки маршрута и создавал заново — кто вернул или отклонил заявку и с каким комментарием, терялось. Теперь маршрут пересохраняется патчем (planRoutePatch + ApprovalListService.patchSteps): строки, что остаются в маршруте, обновляются на месте, и их прошлые решения лежат в истории версий; недостающие шаги создаются, выпавшие и строки делегатов уходят в корзину. Всё одним пакетом. Проверено пилотами на увольнении и рабочем месте (обе фазы, уход в корзину). Аварийный откат для всех форм — ROUTE_PATCH_ENABLED = false. Из версий строк маршрута и заявки собирается лента «История согласования» (shared/approval/history): отправки, решения с комментариями и временем на шаге, делегирование, замена исполнителя, у кого заявка сейчас. Свёрнутый раздел в карточке и в форме доработки всех форм, грузится только при раскрытии. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Заявка на перемещение сотрудника (hr-transfer)
Назначение: заявление сотрудника директору ТОО с просьбой перевести его на
другую должность и/или в другое подразделение. Бумажный первоисточник — типовой
бланк «Заявление» (перевод) с согласованием начальника подразделения.
Категория: Отдел кадров
Списки SP: «Заявка на перемещение сотрудника — данные» / «Заявка на перемещение сотрудника — согласование»
RequestTypeId (внешний API маршрутов): не хардкодится — резолвится в рантайме по
pageUrl («hr-transfer») через useRequestTypeId (см. «Формы больше не хардкодят
RequestTypeId» в docs/forms.md). Тип и маршрут нужно завести в админке approval-route.
Маршрут
- Фазы: только согласование. Фазы исполнения нет — после согласования заявка получает статус «Согласовано» (как «Заявка на отпуск» / «Отпуск без содержания»).
- Матрица редактируема заявителем при новой заявке / черновике / возврате:
useMatrixEditor(editable = !readOnly). - Запланированный шаблон маршрута (approval-route, заводится в админке): шаг 1 —
HeadType.Chief(непосредственный руководитель сотрудника), шаг 2 —HeadType.CompanyDirectors(директор компании сотрудника, как в «Заявлении на увольнение») — по бумажному шаблону заявление адресовано директору ТОО, а согласовывает его начальник подразделения.
Особое поведение
- По умолчанию заявка на себя, но подать можно и за другого: «Сотрудник» —
People-picker (
Employee), маршрут резолвится по e-mail выбранного сотрудника, reloadKey матрицы включаетdata.Employee. - Автоподстановка при выборе сотрудника: текущая должность (
Position, редактируема — справочник не всегда точен) и организации (Organization, read-only,OrganizationField) — изEmployee/ByEmail(shared/dictionary), тот же приём, что у «Заявки на отпуск». - Новая должность (
NewPosition) — свободный текст. - Новое подразделение (
NewDepartment/NewDepartmentId) — справочникDictionary/Departments(shared/dictionary/DepartmentPicker), не влияет на маршрут (справочное поле, как «Подразделение» в «Заявке на отпуск»). - Дата перевода (
TransferDate) — обязательна, ограничений по сроку уведомления (в отличие от отпуска/увольнения) шаблон не задаёт. - Комментарий (
Comment) — необязательный свободный текст. - Заголовок элемента (
Title):Перемещение — {ФИО} — дд.мм.гггг. - Печать (
PrintSplitButton/OrgLetterhead) — как у «Заявки на отпуск»: сотрудник может состоять сразу в нескольких организациях, печатается бланк с шапкой выбранной компании.
Секции формы
RequestSection (сотрудник · текущая должность · организация (read-only) · дата перевода · новая должность · новое подразделение · комментарий)
Точки входа
- rptype:
hr-transfer - Режим согласующего (просмотр): есть (
EmployeeTransferView) - «Создать на основе»: нет