Commit Graph

70 Commits

Author SHA1 Message Date
gorbenko.pavel 179999c02a feat: ОС, СИЗ и подотчётная сумма — отдельные суммы к списанию
Было одной парой «ОС/СИЗ/подотчётная сумма» — стало тремя независимыми, всего
6 категорий (ОС, СИЗ, подотчётная сумма, обучение, НМА, ТМЦ). Списывают их
разные подразделения и за разное, поэтому и сумма с комментарием у каждой своя,
и блокируется каждая отдельно (правило «введено — больше не меняется» работает
на пару, а не на весь блок).

Существующая колонка WriteOffAssetsAmount/Comment переиспользована под «ОС»
(данных по ней ещё нет), добавлены WriteOffPpe* и WriteOffAccountable*.
Список типов полей теперь выводится из WriteOffFieldKey — IWriteOffFields в
submit.ts больше не дублирует их перечислением.

На тенанте: 4 новые колонки созданы провижинером; отображаемые имена ОС-пары
досинхронизированы отдельно — Provision-Lists.ps1 колонки только СОЗДАЁТ и
переименование в манифесте существующей колонке не применяет.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 17:20:26 +05:00
gorbenko.pavel 2d2194047b feat: совместители в заявлении на увольнение, печать после обходного листа, лицо принимающее ОС/НМА, суммы списания в обходном листе
Четыре независимых доработки поверх связки «Заявление на увольнение» ↔
«Обходной лист»:

1. Совместители (несколько компаний у одного сотрудника): approval-route уже
   резолвит директора/должностного эквивалента КАЖДОЙ компании отдельным шагом
   маршрута (HeadType.CompanyDirectors, шаблон route 17: Chief → CompanyDirectors).
   Organization на форме подачи заявления теперь интерактивная таблица
   (OrganizationsTable) вместо read-only списка — строку компании можно убрать,
   если сотрудник реально не увольняется отовсюду сразу; убранная компания сразу
   снимается и из уже спланированной матрицы (matrix.remove) — искать нужную
   строку вручную не надо. Новый shared/dictionary/employeeLookup.service.ts
   зеркалит DirectorPositionByCompany бэкенда (KazpromService → Главный механик,
   СТ Global → Генеральный директор, иначе Директор) и Employee/Manager
   (managerType=chief) — используется и здесь, и в следующем пункте.

2. Печать заявления заблокирована, пока парный обходной лист не согласован
   (статус читается напрямую по ClearanceUrl, без отдельного поля-дублёра).

3. «Лицо, принимающее ОС/НМА» (AssetsAcceptor, People) — обязательное поле,
   которое заполняет НЕ заявитель, а непосредственный руководитель увольняемого
   (identity-check по Employee/Manager, а не по должности, как в approverRights
   «Обходного листа») прямо перед своим решением (DecisionPanel.onBeforeDecide);
   пустое поле блокирует решение.

4. В обходном листе — 4 независимые пары «сумма к списанию + обязательный
   комментарий» (ОС/СИЗ/подотчёт, обучение, НМА, ТМЦ), отдельно от уже
   существующего TrainingAmount. Заполнить может любой активный согласующий
   (не только профильный), но как только сумма введена — пара блокируется
   навсегда для всех (лок по снимку на момент загрузки, не реактивно от текущего
   ввода — иначе поле блокировалось бы прямо во время набора цифр).

Списки на /sites/requests обновлены: AssetsAcceptor (Заявление на увольнение),
8 колонок WriteOff* (Обходной лист). tsc --noEmit и heft test (build+lint+179
тестов) чистые.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 16:46:41 +05:00
gorbenko.pavel 467ceb0d48 fix: не сообщать об успехе раньше времени — ни о решении, ни о пустом списке
1) DecisionPanel ждёт onDecided, если тот вернул Promise: «Решение сохранено.
Статус заявки: «Согласовано»» появляется только после побочных действий решения —
для заявления на увольнение это созданный обходной лист. Пока идёт создание,
кнопки остаются заблокированными, а на месте результата — «Создаём обходной
лист…». Провал побочного действия статус решения не отменяет (оно уже применено на
сервере) — о проблеме сообщает сам обработчик своим предупреждением.

2) «Вы ещё не создавали заявок» больше не мигает на недогруженном списке.
«Мои заявки» и «Доработка» собираются из двух источников (Search + REST-довесок по
свежести), и onPartial показывал тот, что ответил первым, даже если он пустой — на
экране на мгновение появлялась пустота вместо «Загрузка…». Теперь пустой
промежуточный результат не показывается вовсе, а вывод «заявок нет» делается только
по ЗАВЕРШЁННОЙ загрузке именно этой таблицы (loadedKey), а не по любому пустому rows.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 14:04:57 +05:00
gorbenko.pavel b3dee2047c feat: переход по ссылке между парными заявками — без перезагрузки страницы
Tests / frontend-test (pull_request) Successful in 1m15s
navigateToRequestLink (shared/routing): если абсолютная ссылка ведёт на ЭТУ ЖЕ
страницу портала и на просмотр заявки — открываем её через navigate(), то есть
сменой rp-параметров, а не перезагрузкой SPFx-страницы (она грузится секунды, а
показать нужно ту же страницу с другими параметрами). Раздел бокового меню берётся
текущий: заявка показывается в панели поверх раздела, и переход по ссылке не должен
переключать раздел под ней.

LinkField перехватывает только «обычный» клик: с Ctrl/⌘/Shift/Alt и не левой
кнопкой отдаёт браузеру, href настоящий — ссылку по-прежнему можно скопировать или
открыть в отдельной вкладке. Чужой сайт, другая страница и ссылка не на заявку
возвращают false и обрабатываются браузером как раньше.

Тесты на requestLinkUrl/navigateToRequestLink в routing.test.ts; heft test — 179
успешных, 0 падений. В docs/routing.md добавлены hr-dismissal и clearance-form.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 13:44:10 +05:00
gorbenko.pavel 0f6d1b7ddf fix: ссылка на парную заявку открывается в той же вкладке
Было target="_blank" — на проде это читалось как «портал зачем-то плодит окна».
Ссылка ведёт на ту же страницу портала с другими rp-параметрами, так что обычная
навигация даёт нормальный переход с работающей кнопкой «назад».

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 13:40:22 +05:00
gorbenko.pavel cda68f86b0 Merge remote-tracking branch 'origin/main' into fired-request
Tests / frontend-test (pull_request) Successful in 1m22s
2026-08-25 13:24:23 +05:00
gorbenko.pavel 0e582dceb8 feat: ссылки между заявлением на увольнение и обходным листом видны на формах
Поле-ссылка LinkField (shared/ui): read-only «карточка» как у OrganizationField,
но кликабельная, открывается в новой вкладке (портал — одна страница, переход в
текущей означал бы перезагрузку с потерей открытого). Пустой адрес — поле не
рендерится: связь есть не у всех заявок.

В заявлении показывается «Обходной лист» (ClearanceUrl), в обходном листе —
«Заявление на увольнение» (DismissalUrl); обе колонки читаются в load.ts (адрес из
объекта {Url, Description}) и не пишутся формами. Согласующему, который только что
одобрил заявление, ссылка дописывается в модель сразу после автосоздания листа —
иначе появилась бы только после перезагрузки.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 13:04:52 +05:00
gorbenko.pavel c174eb8688 feat: согласованное заявление на увольнение само создаёт обходной лист
Как только маршрут заявления пройден целиком (статус «Согласовано»), портал
заводит обходной лист по нему: форма не открывается — маршрут резолвится через
approval-route (обе фазы, по Employee и Position заявления), элемент пишется в
текущую партицию списка «Обходной лист … — данные» и сразу уходит на согласование
с оповещением активного шага.

Поля выводятся из заявления (сотрудник, должность, подразделение, организация,
последний рабочий день → дата расторжения договора); отметки парковки/СКУД/обучения
остаются профильным согласующим. Пара связывается перекрёстными гиперссылками
ClearanceUrl / DismissalUrl — для них добавлен requestLinkUrl: абсолютная ссылка на
заявку без посторонних параметров страницы, в отличие от routeUrl.

Повторное создание отсекается непустой ClearanceUrl: заявление можно согласовать
второй раз после возврата на доработку, и без этой проверки на каждый цикл
появлялся бы новый обходной лист. Создание идёт в браузере последнего согласующего —
если оно упало, согласование не отменяется, а портал показывает предупреждение
«заведите вручную».

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 12:56:50 +05:00
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
Тимур Городецкий cf1bc0ec1f feat: добавил новые колнки
Tests / frontend-test (push) Successful in 1m7s
2026-08-25 12:31:55 +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
Тимур Городецкий a146877327 fix: удалил эндпоинт Projects1C и перевел на актуальный Project
Tests / frontend-test (push) Successful in 1m9s
2026-08-24 16:33:36 +05:00
Тимур Городецкий df33608f42 fix: добавил прочие вложения на форму заявки на прием
Tests / frontend-test (push) Successful in 1m12s
2026-08-24 15:47:57 +05:00
Тимур Городецкий 0b2961a741 fix: изменил заявку на подбор и заявку на прием согласно требованиям от 24.08.2026
Tests / frontend-test (push) Successful in 1m12s
2026-08-24 15:12:42 +05:00
gorbenko.pavel fd19ddc41a Заявление реферальная программа (#13)
Tests / frontend-test (push) Successful in 1m20s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/13
2026-08-21 12:27:34 +00:00
gorbenko.pavel 131e302f67 Оптимизация списков (#12)
Tests / frontend-test (push) Successful in 1m18s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/12
2026-08-21 10:01:33 +00:00
gorbenko.pavel ebb361ab9f Правка ошибок (#11)
Tests / frontend-test (push) Successful in 1m28s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/11
2026-08-21 06:30:09 +00:00
gorbenko.pavel e90a8ea3cc Фикс шатдауна сайта (#10)
Tests / frontend-test (push) Successful in 1m9s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/10
2026-08-20 07:12:50 +00:00
gorbenko.pavel 7bd540e816 убрал перф логирование
Tests / frontend-test (push) Successful in 1m11s
2026-08-19 16:36:10 +05:00
gorbenko.pavel 6f789f8f1c Архивация списков (#9)
Tests / frontend-test (push) Successful in 1m12s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/9
2026-08-19 09:07:53 +00:00
gorbenko.pavel 3a71d0df1f Разные фиксы (#8)
Tests / frontend-test (push) Successful in 1m20s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/8
2026-08-18 08:45:42 +00:00
Тимур Городецкий 5b2c062e81 fix: изменил заявку на подбор согласно требованиям от 17.08.2026
Tests / frontend-test (push) Successful in 1m8s
2026-08-17 18:29:31 +05:00
Тимур Городецкий d8fe538f36 feat: добавлено форма отпуск БС
Tests / frontend-test (push) Successful in 1m8s
2026-08-17 14:56:06 +05:00
gorbenko.pavel 20a54e01f1 Merge remote-tracking branch 'origin/main'
Tests / frontend-test (push) Successful in 1m10s
2026-08-17 13:20:05 +05:00
gorbenko.pavel e2c7f96021 скрипт 2026-08-17 13:19:43 +05:00
Тимур Городецкий e59f96ee06 Merge branch 'main' of http://git.tnsu.kz/timur.gorodetskiy/request-portal
Tests / frontend-test (push) Successful in 4m16s
2026-08-17 12:06:26 +05:00
Тимур Городецкий e6ca84827a feat: добавлено отображение статуса делеганта и того кто его назначил 2026-08-17 12:06:09 +05:00
gorbenko.pavel 364835eaf7 Обходной лист (#7)
Tests / frontend-test (push) Successful in 1m16s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/7
2026-08-17 05:43:38 +00:00
Тимур Городецкий a937e33f2e refactor: StatusBadge поверх ui-kit Badge
Tests / frontend-test (push) Successful in 4m20s
2026-08-14 12:07:09 +05:00
Тимур Городецкий 64527ebd5b feat: навигация на ui-kit SIdebar + мобильный drawer
Tests / frontend-test (push) Successful in 1m9s
2026-08-14 11:35:49 +05:00
Тимур Городецкий c98a665611 refactor: миграция форм на ui-kit, удаление локальных дублей
Tests / frontend-test (push) Successful in 4m11s
2026-08-14 11:09:11 +05:00
gorbenko.pavel 9d04fb4be4 возвращено sla
Tests / frontend-test (push) Successful in 1m23s
2026-08-13 17:17:14 +05:00
gorbenko.pavel 293876dd50 переработано переназначение
Tests / frontend-test (push) Successful in 1m8s
2026-08-13 17:07:05 +05:00
Тимур Городецкий bcd54d7bc8 feat: подключить ui-kit
Tests / frontend-test (push) Successful in 4m28s
2026-08-13 14:05:32 +05:00
gorbenko.pavel ed3d1a9172 Обходной лист provision
Tests / frontend-test (push) Successful in 1m9s
2026-08-13 12:37:23 +05:00
Тимур Городецкий fc2ef1789d fix: prefill position, hide print photo, drop SLA column
Tests / frontend-test (push) Successful in 1m8s
2026-08-13 10:18:30 +05:00
Тимур Городецкий 6fed6b1540 Merge branch 'main' of http://git.tnsu.kz/timur.gorodetskiy/request-portal
Tests / frontend-test (push) Successful in 1m9s
2026-08-13 10:01:22 +05:00
Тимур Городецкий 8578653c16 feat: changed get time logic to approvers 2026-08-13 10:01:08 +05:00
gorbenko.pavel 03182dbba4 Sla (#6)
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/6
2026-08-13 04:45:02 +00:00
Тимур Городецкий 2e6e138e8d feat: finished recruitin selection form
Tests / frontend-test (push) Successful in 1m9s
2026-08-11 17:35:49 +05:00
Тимур Городецкий 84f1f0fef9 Merge branch 'main' of http://git.tnsu.kz/timur.gorodetskiy/request-portal
Tests / frontend-test (push) Successful in 1m8s
# Conflicts:
#	src/webparts/requestPortal/forms/Ticket1C/load.ts
2026-08-11 16:57:17 +05:00
Тимур Городецкий 2471410b25 feat: migrated vacation form to request portal 2026-08-11 16:53:53 +05:00
gorbenko.pavel 3d52634677 дедупликация
Tests / frontend-test (push) Successful in 1m9s
2026-08-11 14:24:32 +05:00
gorbenko.pavel 850249eaef переименование статустов
Tests / frontend-test (push) Successful in 1m18s
2026-08-11 13:55:35 +05:00
gorbenko.pavel 5cbc9eb89b отображение ошибки
Tests / frontend-test (push) Successful in 1m9s
2026-08-11 12:51:26 +05:00
Тимур Городецкий 00977dcea6 Merge branch 'main' of http://git.tnsu.kz/timur.gorodetskiy/request-portal
Tests / frontend-test (push) Successful in 1m5s
2026-08-11 10:39:26 +05:00
Тимур Городецкий a8e54f2b35 feat: migrated 1c form 2026-08-11 10:39:04 +05:00
gorbenko.pavel 70450aa66d Переработка списков (#5)
Tests / frontend-test (push) Successful in 1m25s
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/5
2026-08-11 04:23:05 +00:00