Files
request-portal/src/webparts/requestPortal/forms/EmployeeTransfer
Тимур Городецкий 153c966f0b feat: история согласования — маршрут пересохраняется патчем
При доработке и повторной отправке writeRoute раньше удалял все строки
маршрута и создавал заново — кто вернул или отклонил заявку и с каким
комментарием, терялось. Теперь маршрут пересохраняется патчем
(planRoutePatch + ApprovalListService.patchSteps): строки, что остаются в
маршруте, обновляются на месте, и их прошлые решения лежат в истории
версий; недостающие шаги создаются, выпавшие и строки делегатов уходят в
корзину. Всё одним пакетом. Проверено пилотами на увольнении и рабочем
месте (обе фазы, уход в корзину). Аварийный откат для всех форм —
ROUTE_PATCH_ENABLED = false.

Из версий строк маршрута и заявки собирается лента «История
согласования» (shared/approval/history): отправки, решения с
комментариями и временем на шаге, делегирование, замена исполнителя,
у кого заявка сейчас. Свёрнутый раздел в карточке и в форме доработки
всех форм, грузится только при раскрытии.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 12:42:42 +05:00
..

Заявка на перемещение сотрудника (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)
  • «Создать на основе»: нет