Task #6130
openПользователи: пакетная загрузка из Excel с ролями и выгрузкой паролей
0%
Description
Страница для суперпользователя: загрузка пользователей пачкой из Excel через существующий эндпоинт создания пользователя, с возвратом файла сгенерированных паролей.
Столбцы файла: № | Фамилия | Имя | Отчество | Организация | Роль | Телефон | Почта
Реализовано (6a8a048), маршрут /users/batch:
-
users/common/roles.ts— справочник ролей (Исполнитель, Заявитель, ЦИК, ultra) и нормализация значения из файла с поддержкой синонимов. Раньше роли были зашиты инлайном вselectформы редактирования. -
users/batch/passwords.ts— генерация паролей черезcrypto.getRandomValues, алфавит без похожих символов (0/O, 1/l/I), гарантированно есть строчная, заглавная и цифра. -
users/batch/UsersBatchUploadPage.tsx— скачивание шаблона (с отдельным листом-справочником организаций), предпросмотр с построчной валидацией, последовательное создание с прогрессом «N из M», экран результата и выгрузка файла с паролями.
Валидация до отправки: обязательные Фамилия / Имя / Почта, формат почты, роль строго из справочника, организация должна находиться в справочнике по названию (сопоставление без учёта регистра, кавычек и лишних пробелов). Отдельно показываются дубли почты внутри файла. Некорректные строки можно удалить из предпросмотра, загружаются только валидные.
Доступ: страница и кнопка входа на неё видны только при role === "ultra".
Связь с ролями. Валидация роли закрывает тот же класс проблем, из-за которого появлялись пользователи с ролью user без прав: значение вне справочника не пройдёт импорт.
На согласование / доработку:
- Пароли отдаются файлом в открытом виде — на экране результата есть предупреждение сохранить его в защищённом месте и удалить. Повторно получить пароли нельзя, только сбросить.
- Эндпоинт создания пользователя вызывается по одному в цикле, отката нет: если часть строк упала, созданные остаются созданными. В файле результата у каждой строки проставлен статус и текст ошибки.
- Письма с доступами не отправляются — рассылка на стороне оператора.