Commit Graph

97 Commits

Author SHA1 Message Date
gorbenko.pavel 637e51d7f9 Feature/vacation edo signing (#23)
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/23
2026-10-05 08:53:18 +00:00
Тимур Городецкий f8ab2a1d71 fix: даты «только дата» больше не сдвигаются на день назад
Tests / frontend-test (push) Successful in 2m1s
SharePoint хранит поле «только дата» как полночь по поясу сайта (UTC+5)
в UTC: «05.10» приходит из REST как 2026-10-04T19:00:00Z. Формы брали
первые 10 символов и показывали 04.10, а каждое пересохранение (полное
право, исполнитель, повторная отправка) записывало дату ещё на день раньше.

Чтение всех дат идёт через spDateOnlyToIso (округление до ближайшей
полуночи UTC), «сегодня» — через todayIsoDate вместо toISOString, который
до 05:00 давал вчерашнее число. Уже сдвинутые записи в SP не исправляются.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 12:41:18 +05:00
Тимур Городецкий 9400f8546e feat: параметр source во внешней ссылке ТМЦ сохраняется в заявке
Внешняя система (напр. КПС) передаёт source — пишем его в новую колонку
SourceSystem рядом с SourcePositionId, чтобы по заявке было видно, откуда
она пришла и куда отвечать. Запоминание источника вынесено в отдельный
эффект: positionId/source/склад сохраняются и по ссылке без nomenclatureId.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 12:39:48 +05:00
Тимур Городецкий 7f1e36874a fix: ссылку на заявку ТМЦ писать в колонку cree9_tmctransferurl в Dataverse
Владельцы внешней системы указали другую колонку строки заявки
(cr498_cree9_tmctransferurl) вместо прежней cr498_portalrequesturl.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 12:33:14 +05:00
Тимур Городецкий 2e0c942fe5 fix: права на заявку новому участнику после делегирования и замены исполнителя
Tests / frontend-test (push) Successful in 2m3s
Права на заявку новым участникам маршрута выдаёт бэкенд по вебхуку на
изменение элемента списка данных. Делегирование и замена/удаление
исполнителя меняли только список согласования — вебхук не приходил, и
новый человек видел «Элемент не найден». Теперь после этих действий
заявка перезаписывается с тем же статусом: значение не меняется, но
появляется новая версия элемента и срабатывает вебхук.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 10:21:56 +05:00
Тимур Городецкий 8eb5b13985 feat: форма «Заявка на командировку»
Цифровая версия бумажной заявки на командировку (отдел кадров). Можно
подать за другого сотрудника; маршрут — лентой точек (город + объект из
справочника проектов + даты) с видом транспорта на каждом участке и
вторым видом «Схема» (SVG, как схема метро). Задание — список задач.
Смета — карточками статей (суточные, проезд, проживание, страховка,
виза, другие расходы) с позициями, привязанными к точкам и участкам
маршрута; суммы только вручную, итог с долями и разбивкой по объектам.
Печать — без шапки с адресатом.

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

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 10:20:15 +05:00
Тимур Городецкий e85c01fca3 refactor: общий хук маршрута по фазам (usePhasedRoute)
Хук, который грузит маршрут согласования отдельно по фазам «Согласование»
и «Исполнение», был в папке «Объяснительной по СКУД». Он понадобился и
заявке на командировку, поэтому перенесён в shared/approval под общим
именем. Поведение СКУД не меняется — поменялись только импорты.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 10:19:57 +05:00
Тимур Городецкий 4c8410bdcc feat: этап исполнения в заявке 1С (исполнитель из маршрута + Planner)
Tests / frontend-test (push) Successful in 1m20s
В маршруте №8 есть шаг «Исполнение», но форма 1С запрашивала только
согласование и записывала пустой список исполнителей: после согласования
заявка навсегда оставалась «Согласовано», без исполнителя и даты исполнения.
Теперь исполнитель берётся из маршрута с теми же условиями, заявка идёт
«Выполнение» → «Закрыта», а карточка Planner создаётся при переходе в
исполнение (в т.ч. сразу при отправке, если согласование не требуется).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-02 10:09:04 +05:00
Тимур Городецкий 4c851b4892 fix: объявление в Teams видно и во вкладке-сайте SharePoint
Tests / frontend-test (push) Successful in 1m19s
Если в Teams закреплена обычная страница SharePoint, SPFx не передаёт
веб-части Teams-контекст, и объявление «открывайте в браузере» не
показывалось. Теперь Teams определяется ещё по фрейму и User-Agent.

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

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 14:45:01 +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
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
Тимур Городецкий 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
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
Тимур Городецкий 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
Тимур Городецкий 98226e4753 feat: предзаполнение «Куда» в ТМЦ, разморозка 1С, readOnly «Отдел»
Tests / frontend-test (push) Successful in 1m16s
- СЗ на перемещение ТМЦ: поле «Куда» предзаполняется проектом-получателем
  по строке-источнику Dataverse (cree9_demandline -> lzk position -> LZK ->
  project id), см. shared/dataverse/lzkPosition.service.ts
- Заявка 1С досрочно разморожена для всех пользователей (UNFROZEN_FORMS
  в SubmitActions), остальные формы остаются замороженными
- Поле «Отдел» в заявке 1С сделано read-only

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-23 11:07:54 +05:00
Тимур Городецкий 64f53b7814 fix: внес изменения в заявках рекрутинга от 22.09.2026
Tests / frontend-test (push) Successful in 1m19s
2026-09-22 12:38:40 +05:00
Тимур Городецкий 25c1188c32 fix: заявки рекрутинга не давали отправить без выьбранного проекта, но пропускали пустую матрицу согласования
Tests / frontend-test (push) Successful in 1m23s
2026-09-21 09:29:34 +05:00
Тимур Городецкий 6f8bea33a2 fix: внес изменения в заявках рекрутинга от 16.09.26
Tests / frontend-test (push) Successful in 1m20s
2026-09-16 17:59:45 +05:00
gorbenko.pavel cf57b40513 feat(автосогласование): колонка AutoApprove во всех списках согласования (#20)
Tests / frontend-test (push) Failing after 38s
Провижининг (Provision-Lists.ps1 читает эти манифесты) теперь заводит колонку
«Автосогласование» (AutoApprove, Да/Нет) в каждом из 12 списков согласования —
рядом с уже существующими SLAhours/AskOverdueReason.

Значение приходит из resolve (approval-route API, шаг маршрута настраивается
только в админке — портал само значение не выбирает, только переносит его в
строку списка при отправке заявки/сохранении черновика, тем же путём, что и
slaHours/askOverdueReason). Фактическое автосогласование по истечении SLA
делает фоновая задача бэкенда (Hangfire), не портал.

В ApprovalMatrix добавлена пометка «(авто)» рядом со значением SLA — чисто
информативно, чтобы участник видел, что решение по шагу может принять не
только человек.

Примечание: ServiceRequest и TmcTransfer не передают ни slaHours/
askOverdueReason, ни (теперь) autoApprove из resolve в строку — это
существовавший пробел (SLA на уровне шага у этих двух форм и раньше не
работал), автосогласование для них наследует только это же ограничение.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/20
2026-09-14 09:02:14 +00:00
Тимур Городецкий a999d45133 feat: добавил формы Заявка на перемещение сотрудника и Заявка на бетон
Tests / frontend-test (push) Successful in 1m22s
2026-09-10 16:21:12 +05:00
Тимур Городецкий 11eb127764 feat: доработал заявку перемещение тмц
Tests / frontend-test (push) Successful in 4m45s
2026-09-10 11:19:16 +05:00
gorbenko.pavel cc2efd8771 Заявка на услуги (#18)
Tests / frontend-test (push) Successful in 1m15s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/18
2026-09-01 12:48:41 +00:00
gorbenko.pavel ddce6b4f25 раздел «Отчёты» в боковом меню — скачивание отчёта по вакансиям (#17)
Tests / frontend-test (push) Successful in 1m15s
Пункт меню виден только заданному списку почт (Тришина, Городецкий,
Горбенко) — группы HR в SharePoint пока нет, добавили TODO завести
проверку по ней отдельно (reportsAccess.ts). Скрыт из меню совсем, а
не показан неактивным, и прямой переход по ?rpnav=reports у остальных
редиректит на «Новую заявку».

Раздел — форма периода (С/По) и кнопка «Скачать xlsx», дергает
GET api/reports/vacancies через тот же AadHttpClient, что и остальные
вызовы approval-route API. Имя файла собирается на фронте по формату
бэкенда (VacancyReportWorkbook.FileName), а не читается из
Content-Disposition — approval-route не объявляет заголовок в
Access-Control-Expose-Headers, браузер бы его не отдал.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/17
2026-08-31 11:00:18 +00:00
Тимур Городецкий 6172321710 feat: added split print button
Tests / frontend-test (push) Successful in 4m15s
2026-08-27 10:09:05 +05:00
gorbenko.pavel 92b95050fa Правки (#16)
Tests / frontend-test (push) Successful in 1m11s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/16
2026-08-26 11:10:26 +00:00
Тимур Городецкий 418e30dfc3 merge branch
Tests / frontend-test (push) Successful in 1m10s
2026-08-26 16:03:49 +05:00
Тимур Городецкий a4bc54def2 feat: feat: брендированная печать, поле «Подразделение» и подача ТМЦ за другого
- Печать доступна только после согласования (Отдел рекрутинга); выбор
  организации и логотип-шапка для форм с несколькими юрлицами
- «СЗ на перемещение ТМЦ»: заявителя можно выбрать (подача за другого),
  маршрут резолвится на выбранного
- «Реферальная рекомендация»: организация вакансии (мультивыбор) и
  подразделение/проект вакансии
- Поле «Подразделение» (справочник) — Vacation, UnpaidLeave, Clearance,
  WorkplaceSetup, RecruitingHire, RecruitingSelection, TmcTransfer
- Поле «Проект» — Vacation, UnpaidLeave, Clearance
2026-08-26 15:49:25 +05:00
gorbenko.pavel df29d080ed Заявление на увольнение (#15)
Tests / frontend-test (push) Successful in 1m17s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/15
2026-08-26 07:07:03 +00:00
Тимур Городецкий f751f03060 fix:передаю условия маршрута по компании в resolve и починил пагинацию /Project
Tests / frontend-test (push) Failing after 14s
2026-08-25 15:50:27 +05:00
Тимур Городецкий 48ef2d3051 Merge branch 'main' of http://git.tnsu.kz/timur.gorodetskiy/request-portal
Tests / frontend-test (push) Successful in 4m14s
2026-08-25 11:44:08 +05:00
Тимур Городецкий 3b4ee93b48 feat: добавил поле организация во все заявки, а также расширил компонет выбора даты для ui-kit 2026-08-25 11:43:57 +05:00
gorbenko.pavel 0ecb1ded78 чат по заявке через комментарии к строке списка (#14)
Tests / frontend-test (push) Successful in 1m15s
Обсуждение заявки поверх штатных комментариев SharePoint (PnPjs
item.comments) — без новых колонок и провижининга, права на переписку
раздаёт сам SharePoint по правам на элемент.

Встроено в ApproveFeature и EditFeature (единственные входы в просмотр
заявки для всех типов), поэтому доступно автору, всем согласующим
(включая уже решивших и ещё не дошедших до своего шага) и исполнителям,
а не только текущему шагу маршрута, как DecisionPanel.

Автора комментария всегда ставит реальная учётка — отладочная подмена
личности на запись в SharePoint не влияет, в UI есть предупреждение.

---------

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/14
2026-08-24 11:37:34 +00:00