Files
request-portal/docs/forms.md
T
gorbenko.pavel c174eb8688 feat: согласованное заявление на увольнение само создаёт обходной лист
Как только маршрут заявления пройден целиком (статус «Согласовано»), портал
заводит обходной лист по нему: форма не открывается — маршрут резолвится через
approval-route (обе фазы, по Employee и Position заявления), элемент пишется в
текущую партицию списка «Обходной лист … — данные» и сразу уходит на согласование
с оповещением активного шага.

Поля выводятся из заявления (сотрудник, должность, подразделение, организация,
последний рабочий день → дата расторжения договора); отметки парковки/СКУД/обучения
остаются профильным согласующим. Пара связывается перекрёстными гиперссылками
ClearanceUrl / DismissalUrl — для них добавлен requestLinkUrl: абсолютная ссылка на
заявку без посторонних параметров страницы, в отличие от routeUrl.

Повторное создание отсекается непустой ClearanceUrl: заявление можно согласовать
второй раз после возврата на доработку, и без этой проверки на каждый цикл
появлялся бы новый обходной лист. Создание идёт в браузере последнего согласующего —
если оно упало, согласование не отменяется, а портал показывает предупреждение
«заведите вручную».

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 12:56:50 +05:00

6.2 KiB
Raw Blame History

Формы портала заявок — индекс

Каждая форма живёт в своей папке src/webparts/requestPortal/forms/<Форма>/ и имеет рядом README.md — карточку с её бизнес-поведением (то, что не видно из кода с первого взгляда). Здесь — общий индекс.

Правило (при добавлении формы)

  1. Папка forms/<Форма>/ + README.md по шаблону.
  2. Строка в индексе ниже.
  3. Строка в forms/registry.ts (ленивая форма) и, если есть режим согласующего, в forms/viewRegistry.ts.
  4. Плитка в data/requests.ts.

Формы больше не хардкодят RequestTypeId

Числовой id типа заявки во внешнем approval-route API (GET /api/request-types) выдаётся сервером при регистрации типа в админке и непредсказуем заранее (в старой pto-tracker у «отпуска» было 1, при заведении типа в новой админке он получил id 11). Раньше каждая форма хардкодила это число константой вида VACATION_REQUEST_TYPE_ID = 11; теперь — резолвит его в рантайме по своему pageUrl (тот же rptype, что и id в data/requests.ts) через useRequestTypeId(context, pageUrl) (shared/approval). Результат кешируется на уровне модуля на время сессии (см. getRequestTypeIdByPageUrl в approvalRoute.service.ts) — повторный вызов из другой формы не бьёт по сети заново.

  • Форма подачи знает свой pageUrl из пропа requestType.id.
  • Режим согласующего (<Форма>View) получает его пропом formKey (см. IApprovalViewProps в forms/viewRegistry.ts и ApproveFeature.tsx).

Что НЕ дублируем в карточке (лежит в других местах)

  • Колонки списков → forms/<Форма>/provisioning.json.
  • Параметры ссылок (rptype/rpmode/rpid/rpsource) → routing.md.
  • Как обращаться к спискам SP из кода → sp-lists-frontend.md.
  • Общий жизненный цикл (черновик/upsert/блокировка/статусы), согласование, исполнение, печать — одинаковы для всех форм (общие примитивы shared/ui и shared/approval).

Карточка — только про то, чем эта форма отличается.


Индекс форм

Ключ (rptype) Форма Категория Согл. Исп. Просмотр Фишки Готово
recruiting-selection Заявка на подбор Рекрутинг нет нет нет много полей (~42), поля-люди (в т.ч. мульти) ✅
recruiting-hire Заявка на прием Рекрутинг да да да маска телефона, деньги, условное «взамен кого», источник для орг. места ✅
recruiting-referral Реферальная рекомендация Рекрутинг да да да кандидат — внешний (текстовые поля, не People); маршрут по рекомендателю; исполнитель переназначает на реального; условное уточнение «откуда знаете» ✅
it-workplace-setup Организация рабочего места IT да да да префилл из «прием», поля ПО/доступы правит руководитель ✅
it-1c-ticket Заявка в отдел 1С IT да нет да контакты предзаполняются из Graph (/me); вместо фазы исполнения — карточка в Microsoft Planner (согласовано/сразу без согласования — рабочий бакет, отклонено — отдельный бакет) ✅
clearance-form Обходной лист Отдел кадров да нет да подаётся HR за увольняемого (People-picker); условие «IsManager» резолвится по должности из самой заявки; да/нет-поля (парковка, СКУД), сумма обучения ✅
hr-dismissal Заявление на увольнение Отдел кадров да нет да по умолчанию на себя, но можно за другого; подразделение из профиля (read-only), должность/организация из справочника; последний рабочий день не в прошлом; после согласования сам создаёт обходной лист и связывает пару ссылками ⏳ тип заявки не заведён в админке approval-route
hr-transfer Перемещение сотрудников Отдел кадров — — — — ⏳ заглушка (плитка есть, форма не сделана)

Легенда: Согл. — есть фаза согласования; Исп. — есть фаза исполнения; Просмотр — есть режим согласующего (<Форма>View).