Files
request-portal/docs/forms.md
T
gorbenko.pavel cd1fd76c76 feat: убрано «Самостоятельное подразделение», суммы к списанию компактно с общим комментарием
Заявление на увольнение: убрано поле «Самостоятельное подразделение»
(StandaloneUnit) — из модели, формы и манифеста провижинера. Колонка на
тенанте остаётся (провижинер их не удаляет), но код её больше не пишет и не
читает.

Обходной лист: убраны 6 отдельных textarea-комментариев под каждой суммой —
сетка сумм теперь компактная (короткие подписи, обычная 2-колоночная сетка
секции, без full). Вместо пары «сумма+комментарий» на категорию — ОДИН общий
комментарий, который появляется и становится обязательным, как только хоть
одна редактируемая сумма заполнена (при сохранении бросает ДО записи, если
сумма есть, а комментарий пуст). Плейсхолдер называет категории, для которых
он сейчас пишется («Введите, за что сумма: ОС, ТМЦ»).

При записи общий текст дублируется в Comment-колонку КАЖДОЙ заполняемой сейчас
категории (SP-схема из 6 пар Amount/Comment не менялась) — так по каждой
категории в списке остаётся свой комментарий, а форма не заставляет писать
одно и то же несколько раз подряд.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 12:37:04 +05:00

6.9 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» резолвится по должности из самой заявки; да/нет-поля (парковка, СКУД); 6 независимых сумм к списанию компактной сеткой (ОС, СИЗ, подотчётная сумма, обучение, НМА, ТМЦ) — вводит любой активный согласующий, блокируется навсегда после первого ввода; заполнил хоть одну — общий комментарий «за что» становится обязательным ✅
hr-dismissal Заявление на увольнение Отдел кадров да нет да совместители — таблица компаний с удалением строки (снимает и согласующего из матрицы); должность/организация из справочника; после согласования сам создаёт обходной лист; печать заблокирована до согласования обходного листа; «Лицо, принимающее ОС/НМА» — заполняет только непосредственный руководитель ✅
hr-transfer Перемещение сотрудников Отдел кадров — — — — ⏳ заглушка (плитка есть, форма не сделана)

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