Files
request-portal/provisioning
gorbenko.pavel ca1d7512d6 feat: форма «Заявление на увольнение» (hr-dismissal)
Новая форма отдела кадров по бумажному шаблону «Заявление на увольнение ШТАТ»:
сотрудник, должность, структурное и самостоятельное подразделение, последний
рабочий день, контактный телефон, комментарий. По умолчанию заявка на себя, но
можно подать за другого — маршрут резолвится по выбранному сотруднику.

Подразделение подтягивается из профиля (SPS-Department, read-only), должность и
организации — из справочника Employee/ByEmail. Последний рабочий день не может
быть в прошлом; срок предупреждения об увольнении форма не проверяет — дату
согласуют с работодателем.

Перекрёстные ссылки с «Обходным листом»: колонки-гиперссылки ClearanceUrl /
DismissalUrl (только в списках, формы их пока не пишут). Для них в провижинере
появился тип колонки Url, а сам скрипт разбит на два прохода — сначала все
списки, потом колонки: иначе Lookup на список другой формы держится на алфавитном
порядке обхода манифестов.

Списки «Заявление на увольнение 1 — данные» / «… — согласование» созданы на
/sites/requests. Тип заявки в админке approval-route ещё не заведён — до этого
форма откроется, но отправить заявку не даст.

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

Провижининг списков SharePoint

Автоматическое создание списков данных для форм портала заявок из манифестов provisioning.json (по одному на форму, лежат в папке каждой формы).

Списки согласования пока не создаются — только данные.

Как это работает

  • Каждая форма описывает свои колонки в src/webparts/requestPortal/forms/<Форма>/provisioning.json.
  • Скрипт Provision-Lists.ps1 читает все такие манифесты и идемпотентно создаёт списки и колонки: перед созданием колонки проверяется, что её ещё нет; повторный запуск ничего не ломает и не дублирует.

Добавить колонку/форму = отредактировать/добавить provisioning.json и перезапустить скрипт.

Поддерживаемые типы колонок (type в манифесте)

type Что это Доп. поля
Text однострочный текст —
Note многострочный текст —
Number число decimals (знаков после запятой)
Choice выбор из вариантов choices (массив)
DateTime дата/время —
Boolean да/нет —
User пользователь —
Url гиперссылка (адрес + подпись) —
Lookup подстановка lookupList (заголовок источника), lookupShowField (по умолч. Title)

Плюс на уровне формы: titleColumnName — переименовать стандартную колонку Title.

Порядок для Lookup: список-источник должен существовать раньше, чем колонка, которая на него ссылается — но следить за этим руками не нужно: скрипт сначала создаёт ВСЕ списки, и только потом колонки, поэтому порядок обхода манифестов не важен (и взаимные ссылки тоже разрешимы).

Разовая подготовка

  1. Установить модуль PnP PowerShell (нужен PowerShell 7+):
    Install-Module PnP.PowerShell -Scope CurrentUser
    
  2. Зарегистрировать приложение с правом Sites.Selected и сертификатом в хранилище:
    Register-PnPEntraIDApp -ApplicationName "PnP-Provisioning-Scoped" -Tenant "<тенант>.onmicrosoft.com" -SharePointApplicationPermissions "Sites.Selected" -Store CurrentUser
    
    Запомнить Client Id из вывода.
  3. Администратор один раз:
    • одобряет запрос на согласие приложения (Admin consent),
    • выдаёт приложению доступ только к нужному сайту:
      Grant-PnPAzureADAppSitePermission -AppId "<client-id>" -DisplayName "PnP-Provisioning-Scoped" -Permissions FullControl -Site "https://<тенант>.sharepoint.com/sites/<сайт>"
      

Запуск

Узнать отпечаток сертификата (Thumbprint):

Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Subject -like "*PnP-Provisioning-Scoped*" } | Select-Object Subject, Thumbprint

Запустить провижининг (вход по сертификату, без пароля в коде):

cd provisioning
./Provision-Lists.ps1 `
  -SiteUrl "https://<тенант>.sharepoint.com/sites/<сайт>" `
  -ClientId "<client-id>" `
  -Tenant "<тенант>.onmicrosoft.com" `
  -Thumbprint "<отпечаток>"

Лог: [+] — создано, [=] — уже существовало, [~] — переименовано, [!] — предупреждение.

Важно про имена колонок

В манифесте у колонки два имени:

  • internalName — латиницей, без пробелов, ≤32 символов (техническое имя в SharePoint);
  • title — отображаемое, любое (рус., с пробелами).

Так мы избегаем проблемы, когда SharePoint кодирует пробелы в _x0020_ и обращения к полю ломаются. Не создавайте колонки с русским internalName.

Проверка на тесте

Сначала прогоните на тестовом сайте, убедитесь, что списки и колонки создались правильно, и только потом — на боевом.