Commit Graph

138 Commits

Author SHA1 Message Date
Тимур Городецкий 1e316a9558 feat: объявление в Teams — открывать портал в браузере
В приложении Teams часть функций портала работает ограниченно. На главной
в Teams теперь показывается объявление со ссылкой на страницу портала,
которая открывается во внешнем браузере. В браузере объявление не показывается.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-02 09:34:51 +05:00
Тимур Городецкий c91d2dbc04 fix: дата подачи — день отправки, а не сохранения черновика
В подборе и реферале черновик хранил дату первого сохранения, и через
несколько дней заявка уходила на согласование со старой датой подачи.
Теперь при отправке дата подачи всегда сегодняшняя, а открытый черновик
сразу показывает сегодня (как уже было в объяснительной по СКУД). В реферале
дату больше нельзя поправить руками. Общая логика — shared/submitDate.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-02 09:34:51 +05:00
Тимур Городецкий 5702939b52 feat: подсветка незаполненных полей и переход к ним в приёме и подборе
Пользователи не понимали, почему кнопка «Отправить на согласование» серая.
Теперь в заявках на приём и подбор кнопки активны: нажатие при незаполненных
или неверных полях ничего не сохраняет, а подсвечивает эти поля с подсказкой
под ними и прокручивает к первому. Над кнопками — список проблем, пункты ведут
к полю. Механизм общий (FieldIssuesProvider + FormField), остальные формы
пока работают по-старому и переводятся по тому же паттерну.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 17:15:16 +05:00
Тимур Городецкий c95118a216 feat: тип приёма «Вместо переведенного сотрудника» 2026-09-30 12:03:20 +05:00
Тимур Городецкий 4f292dde3d feat: печатный вид объяснительной по СКУД с маршрутом согласования
Tests / frontend-test (push) Successful in 1m21s
Вместо линии для подписи под запиской печатается маршрут согласования
и исполнения. Документ больше не вылезает за карточку (box-sizing), а текст
причины «Другое» получает точку, чтобы следующая фраза к нему не прилипала.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 09:56:35 +05:00
Тимур Городецкий a05a336275 fix: пустой квадратик под ФИО на печати
В окне печати у выбранного в PeoplePicker человека оставалась голая кнопка «×»
(иконки скрыты, стилей Fluent там нет). На печати она не нужна — скрываем.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 09:56:35 +05:00
Тимур Городецкий ff7d1f26a7 fix: причины в объяснительной по СКУД
Убрана причина «Забыл(а) пропуск», неисправность турникета/считывателя
обобщена до «Неисправность СКУД» — так просит отдел кадров.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 09:56:35 +05:00
Тимур Городецкий 7e9848e83d feat: форма «Объяснительная по СКУД»
Tests / frontend-test (push) Successful in 1m17s
Сотрудник пишет объяснительную за дни без отметок СКУД, выбирая их кликом
в календаре «Мой СКУД» (перенесён из portal-main-page: те же цвета и
правила, проходы Hikvision текущего пользователя, праздники из
«Производственного календаря»). Текст записки собирается автоматически,
в просмотре печатается бланк объяснительной.

- выбираются прошедшие дни < 8 ч, с одной записью или без отметок и
  сегодня без отметок; только текущий и прошлый месяц;
- дни сохраняются снимком (JSON), т.к. согласующий чужой СКУД не видит;
- защита от повторов: дни из уже поданных объяснительных помечены ✓ и
  не выбираются, перед отправкой список перечитывается;
- маршрут в две фазы: согласование + исполнение (кадры);
- дата подачи ставится автоматически.

Плитка пока только для тестировщиков (comingSoon): списки SP
провизионированы, тип и маршрут заведены, осталась проверка e2e.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 17:27:46 +05:00
Тимур Городецкий 1dda76caae test: разбор автора вынесен в модуль без SharePoint
Тест parseAuthorOwsUser падал: он импортировал myRequests.service, а тот
тянет PnPjs (ESM), который Jest проекта не разбирает. Функция вынесена в
parseAuthorOwsUser.ts без SharePoint-импортов, сервис берёт её оттуда.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 12:55:40 +05:00
Тимур Городецкий 182c497139 fix: служебный хвост в ФИО автора и исполнителя
Поисковое свойство AuthorOWSUSER хранит «почта | ФИО | служебный id и
claims-логин», а parseAuthorOwsUser брал как ФИО всё после первого
разделителя. Пока ФИО бралось из свойства Author, это было не видно;
после 13ba9c9 (ФИО из AuthorOWSUSER) хвост вылез в колонках «Автор» и
«Исполнитель». Теперь ФИО — ровно вторая часть строки.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 12:51:57 +05:00
Тимур Городецкий b12fcd0939 chore: скрипт проверки индексов в списках согласования
Только чтение: по каждому списку «… — согласование» показывает число
строк и проиндексированы ли Ticket, ApprovalStatus и TansuSiteApprover —
без индекса фильтр по колонке в списке больше 5000 строк падает.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 12:42:42 +05:00
Тимур Городецкий e9702a53d4 feat: «Скачать все» для вложений заявки
Над списком вложений (от двух файлов) — кнопка «Скачать все»: файлы
скачиваются по очереди, без архива, через download.aspx SharePoint, чтобы
PDF и картинки не открывались в просмотре. Обёртка над AttachmentList
из ui-kit подменена в shared/ui, поэтому кнопка появилась во всех формах
и карточках без правок в них; в чате выключена.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 12:42:42 +05:00
Тимур Городецкий ab3593c170 feat: история согласования по кнопке в строке таблиц заявок
В каждой строке таблиц заявок — кнопка «История согласования»: окно с
той же лентой, что в карточке, без открытия самой заявки. Колонка
действий теперь есть всегда (история у всех строк, корзина — у своих
черновиков).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 12:42:42 +05:00
Тимур Городецкий 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
Тимур Городецкий 5b1e94bf42 feat: подсказка о недопустимой дате увольнения
Если последний рабочий день раньше, чем через месяц от сегодня, под полем
показывается причина и минимальная дата. Раньше кнопки отправки просто
становились неактивными без объяснения — это случалось у заявлений,
пролежавших на доработке: дата, допустимая при подаче, переставала
подходить. Правило и текст вынесены в lastWorkingDay.ts и общие для
подсказки и проверки перед отправкой.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 12:42:13 +05:00
Тимур Городецкий 7ad5f79cdf style: поле «Организация» в заявке на рабочее место
Подпись «Организация заявителя» заменена на «Организация» — в форме,
в подсказке незаполненных полей и в манифесте колонки (как у остальных
форм; на существующую колонку SharePoint манифест не влияет).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 12:41:40 +05:00
Тимур Городецкий 27b3c8de2a fix: новый шаг в матрице не копирует решение согласующего
После возврата заявки с одним согласующим каждый добавленный на доработке
шаг показывался «Возвращена на доработку»: statusForNewRow копировал общий
статус строк. Решения (согласовано/возвращено/отклонено/выполнено) больше
не копируются — новый шаг показывается с «—». В SharePoint это не
попадало: writeRoute и раньше писал всем строкам «Ждёт очереди».

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 12:41:25 +05:00
Тимур Городецкий b82008943f style: иконка «Все заявки» — список вместо людей
Tests / frontend-test (push) Successful in 1m20s
Иконка людей совпадала с иконкой категории «Отдел рекрутинга» и плитки
«Заявка на прием» и не говорила, что за кнопкой список заявок. Заменена
на menu на плитке, на кнопке формы и в боковом меню.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:29:29 +05:00
Тимур Городецкий e3f4bcf9bd docs: реестр особых прав портала
Все места, где права выданы сверх обычных (по email, должности, группе
SharePoint или в админке approval-route), собраны в одну таблицу с
файлами проверок — чтобы не потерять их при переезде на группы
SharePoint или смене сотрудника. Ссылка добавлена в docs/forms.md.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:29:29 +05:00
Тимур Городецкий 1b1a783c98 fix: поиск сотрудника в маршруте без учёта регистра
Фильтр SharePoint substringof по Title пользователей сайта для кириллицы
чувствителен к регистру: «тимур» не находил «Тимур Городецкий». Теперь
ищутся сразу несколько написаний (как введено, строчными, с заглавной
каждого слова) и по email. Касается всех полей выбора сотрудника в
маршруте: делегирование, добавление согласующего, замена исполнителя.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:29:29 +05:00
Тимур Городецкий 247f614885 feat: замена и удаление исполнителей в заявке на подбор
Начальник отдела подбора (routeEditRights) назначает исполнителей, но
сама в исполнении не стоит. В матрице «Исполнение» заявки на подбор у
шагов «Ждёт очереди» и «На исполнении» появились кнопки «Заменить» и
«Удалить»:
- замена меняет только человека в шаге, активный шаг сразу переходит
  к новому исполнителю, ему уходит оповещение;
- при удалении активного очередь переходит к следующему исполнителю;
- выполненные шаги не трогаются, последнего невыполненного исполнителя
  можно только заменить — иначе заявка закрылась бы без исполнения.

Остальные формы не затронуты: кнопки включаются пропсами ApprovalMatrix
(canReplaceRow/onReplaceRow) только в RecruitingSelectionView.
notifyActiveStep получил необязательный rowId, чтобы на параллельном
шаге письмо ушло именно новому исполнителю.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:29:15 +05:00
Тимур Городецкий be8177e8ae feat: столбец «Исполнитель» в таблицах заявок
Показывает, у кого заявка сейчас: ФИО и почта согласующего или
исполнителя текущего шага (несколько — параллельный шаг, при
делегировании — делегат), при доработке — инициатор. Есть в
«Инициированных», «Согласованных», «Выполненных мной» и «Все заявки»;
в очередях и «Доработке» держатель всегда сам пользователь.

Дочитывается только для видимой страницы, одним запросом на список
согласования. Группировка по партициям вынесена в approvalPartitionsFor
и общая с комментарием к решению.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:28:48 +05:00
Тимур Городецкий 13ba9c9e37 fix: в колонке «Автор» только создатель заявки
В «Все заявки», «Моих заявках» и «Поиске» ФИО бралось из поискового
свойства Author, где SharePoint перечисляет через «;» всех, кто правил
элемент. У заявки, которую поправил согласующий, в «Авторе» оказывалось
«Инициатор;Согласующий». Теперь ФИО берётся из AuthorOWSUSER — того же
поля «Создано», откуда и почта.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:28:37 +05:00
Тимур Городецкий d749bfae26 feat: фильтры и сортировка в таблицах заявок
Tests / frontend-test (push) Successful in 1m16s
Во всех разделах со списками заявок (На согласовании, На исполнении,
Доработка, Мои заявки, Все заявки):
- фильтры по типу, статусу и периоду даты создания, кнопка «Сбросить»;
- сортировка по клику на заголовок: номер (по числам), тип, дата, статус.

Без фильтров загрузка прежняя, постраничная. При активном фильтре или
сортировке загружается полный список раздела и обрабатывается в памяти,
иначе отсортировалась бы только текущая страница.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 14:45:02 +05:00
Тимур Городецкий fa27e8d918 feat: названия заявок на подбор и приём без префикса типа
Тип заявки и так виден в колонке «Тип», префикс в названии только
удлинял его:
- подбор: «Должность — Проект»;
- приём: «ФИО — Должность — Проект».
Уже созданные заявки сохраняют старое название до пересохранения.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 14:45:01 +05:00
Тимур Городецкий bfe0b95f26 fix: в «Моих заявках» только заявки с сайта портала
Tests / frontend-test (push) Successful in 1m13s
2026-09-28 11:27:30 +05:00
Тимур Городецкий 36922af942 fix: в «Моих заявках» исключены типы заявок с чужих сайтов (ct-forms-portal /sites/sed)
Tests / frontend-test (push) Successful in 1m15s
2026-09-28 09:53:29 +05:00
Тимур Городецкий cef8d51378 feat: мультивыбор «Организации заявителя» в заявке на рабочее место
Tests / frontend-test (push) Successful in 1m16s
Поле было только для чтения и не позволяло поправить организации. Теперь
это CompanyPickerMulti, как в подборе: предзаполняется по заявителю и
редактируется, обязательное. Компании хранятся в WorkplaceCompaniesJson,
Organization пересобирается текстом для печати и старых заявок.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 17:38:50 +05:00
Тимур Городецкий 0989168476 refactor: преобразование организаций сотрудника в компании вынесено в shared/dictionary
employeeCompanies() нужен теперь не только подбору, но и заявке на рабочее
место — одна реализация вместо копий в каждой форме.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 17:38:50 +05:00
Тимур Городецкий 05b1163484 Merge branch 'main' of http://git.tnsu.kz/timur.gorodetskiy/request-portal 2026-09-25 17:09:03 +05:00
Тимур Городецкий 45e79d5401 fix: в приёме можно выбрать подбор в статусе «Выполнение» и «Закрыта»
После согласования подбор сразу уходит в «Выполнение», поэтому фильтр
только по «Согласовано» почти всегда давал пустой список. Теперь берутся
все утверждённые статусы, как в isApprovedStatus.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 17:08:29 +05:00
Тимур Городецкий 8a6edf9d35 feat: ручной ввод базы 1С при выборе варианта «Другое»
Если нужной базы нет в списке, заявитель отмечает «Другое» и вписывает
название в обязательное поле. Текст хранится в отдельной колонке DB1COther,
показывается в просмотре и попадает в карточку Planner.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 17:08:29 +05:00
gorbenko.pavel 98be3980cb Feature/request type access all requests (#22)
Tests / frontend-test (push) Successful in 1m24s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/22
2026-09-25 11:48:09 +00:00
Тимур Городецкий ebc74dc46d feat: подразделения в подборе и приёме фильтруются по организации
Tests / frontend-test (push) Successful in 1m14s
2026-09-25 15:24:33 +05:00
Тимур Городецкий 06044bbce9 refactor: категория IT переименована в IT/1C
Tests / frontend-test (push) Successful in 1m17s
Название вкладки и подпись в шапке форм категории — чтобы было видно,
что заявки в отдел 1С лежат здесь же.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 14:37:43 +05:00
Тимур Городецкий e9b0df4822 feat: варианты полей заявки 1С из колонок SP + вид работ «Маршруты в ДО»
«Виды работ», «Организация» и «База 1С» теперь читаются из колонок списка
(общий хук shared/fieldChoices), а не из констант: новый пункт добавляется
в параметрах столбца без правки кода и деплоя. Пилот — на форме 1С, при
успехе переводим остальные формы. В стартовые варианты provisioning.json
добавлен «Маршруты в ДО».

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 14:37:42 +05:00
Тимур Городецкий d539cdbfd2 refactor: причины открытия вакансии перенесены под количество вакансий (п. 2.3)
Tests / frontend-test (push) Successful in 1m16s
2026-09-25 11:39:00 +05:00
Тимур Городецкий 7959d91025 feat: несколько причин и сотрудников в заявке на подбор при 2+ вакансиях
Tests / frontend-test (push) Successful in 1m14s
2026-09-25 10:33:05 +05:00
Тимур Городецкий 1b36813a07 fix: колонка «Номер» вместо «Код» в таблицах заявок
Tests / frontend-test (push) Successful in 1m13s
2026-09-25 10:16:04 +05:00
Тимур Городецкий 6712d050a5 feat: вебхук-подписка новых списков в провизионере
Tests / frontend-test (push) Successful in 1m13s
2026-09-25 10:08:08 +05:00
gorbenko.pavel ec94de3c1b Feat/selection title reports access (#21)
Tests / frontend-test (push) Successful in 1m19s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/21
2026-09-25 04:43:37 +00:00
Тимур Городецкий ab21683377 fix: нейтральный текст при пустом маршруте в заявке 1С
Tests / frontend-test (push) Successful in 1m19s
2026-09-25 09:33:38 +05:00
Тимур Городецкий 1884007161 feat: название заявки на подбор «Подбор — Должность — Проект»
Tests / frontend-test (push) Successful in 1m14s
2026-09-24 17:58:34 +05:00
Тимур Городецкий 286b449099 feat: подсветка полей, изменённых согласующим, с прежними значениями
Tests / frontend-test (push) Successful in 1m15s
2026-09-24 17:36:39 +05:00
Тимур Городецкий 8cfb364f9c feat: Алтынай Бултурукова правит все поля заявок на подбор и приём на своём шаге
Tests / frontend-test (push) Successful in 1m14s
2026-09-24 17:02:57 +05:00
Тимур Городецкий 9b83c54491 feat: удаление своих заявок в статусе Черновик
Tests / frontend-test (push) Successful in 1m15s
2026-09-24 16:52:53 +05:00
Тимур Городецкий 852b16c327 feat: причина «Декрет» в подборе и приёме, тип приёма подтягивается из подбора
Tests / frontend-test (push) Successful in 1m13s
2026-09-24 16:38:06 +05:00
Тимур Городецкий 17e7c634d5 feat: испытательный срок в подборе, дата приёма по приезду, HR-формы для тестировщиков
Tests / frontend-test (push) Successful in 1m19s
2026-09-24 16:10:54 +05:00
Тимур Городецкий b7bd8537a4 feat: добавил инструкцию пользователя в боковую панел
Tests / frontend-test (push) Successful in 1m16s
2026-09-24 12:21:43 +05:00
Тимур Городецкий c623d93b56 открыл заявки рекрутинга, сделал поле предполагаемый наставник необязательным
Tests / frontend-test (push) Successful in 1m15s
2026-09-24 09:51:26 +05:00