Commit Graph

15 Commits

Author SHA1 Message Date
gorbenko.pavel 89fceaab1d fix: убрать «Обучение» из сумм к списанию — дублировало TrainingAmount
Осталось 5 категорий (ОС, СИЗ, подотчётная сумма, НМА, ТМЦ). У обучения уже
было отдельное поле TrainingAmount («Обучение: сумма», правит только КДП) —
второе одноимённое поле с другим поведением (любой согласующий) только
путало, даже с подписью группы над сеткой. WriteOffTrainingAmount убран из
модели/load/submit/манифеста; ClearanceView и RequestSection код не трогали —
они уже обходят WRITE_OFF_CATEGORIES обобщённо.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 14:17:54 +05:00
gorbenko.pavel eacf4baeb1 fix: «за что списание» — переиспользовать стандартный комментарий решения
Правка предыдущего коммита: там для «за что конкретно» завёл отдельное поле
WriteOffComment (с собственной колонкой в списке) — избыточно, раз на экране
уже есть стандартный комментарий решения («Ваше решение» в DecisionPanel),
которым и так сопровождают Согласовать/Вернуть/Отклонить.

Теперь: DecisionPanel получил два новых пропа — commentRequired (сверх обычного
«обязателен при возврате/отклонении» — можно потребовать его на ЛЮБОЕ решение)
и commentPlaceholder (переопределить текст подсказки). ClearanceView передаёt
их, когда есть незаблокированная сумма к списанию с непустым значением
(writeOffTouchedCategories) — комментарий обязателен, а плейсхолдер называет,
за какие категории писать («Введите, за что сумма: ОС, ТМЦ»). Записывается он
туда же, где и всегда — в строку маршрута этого согласующего (Comment списка
согласования), без нового поля на данных заявки.

WriteOffComment (поле, столбец в манифесте, вся связанная логика) убран.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 12:51:48 +05:00
gorbenko.pavel 10963081c6 feat: один общий комментарий к списанию вместо шести, «Подразделение» вместо «Структурное»
Обходной лист: 6 отдельных Comment-колонок (по одной на категорию списания)
консолидированы в одну WriteOffComment — комментарий и так один по смыслу
(«за что списываем»), дублировать текст в 6 колонок не было смысла. IWriteOffCategory
больше не хранит commentField, WriteOffFieldKey сузился до 6 сумм.

Заявление на увольнение: заголовок колонки таблицы организаций — «Подразделение»
вместо «Структурное подразделение» (данные по-прежнему из Section справочника,
только подпись короче).

Со схемой ничего руками не делал — команда для провижининга ниже.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 12:43:37 +05:00
gorbenko.pavel cd1fd76c76 feat: убрано «Самостоятельное подразделение», суммы к списанию компактно с общим комментарием
Заявление на увольнение: убрано поле «Самостоятельное подразделение»
(StandaloneUnit) — из модели, формы и манифеста провижинера. Колонка на
тенанте остаётся (провижинер их не удаляет), но код её больше не пишет и не
читает.

Обходной лист: убраны 6 отдельных textarea-комментариев под каждой суммой —
сетка сумм теперь компактная (короткие подписи, обычная 2-колоночная сетка
секции, без full). Вместо пары «сумма+комментарий» на категорию — ОДИН общий
комментарий, который появляется и становится обязательным, как только хоть
одна редактируемая сумма заполнена (при сохранении бросает ДО записи, если
сумма есть, а комментарий пуст). Плейсхолдер называет категории, для которых
он сейчас пишется («Введите, за что сумма: ОС, ТМЦ»).

При записи общий текст дублируется в Comment-колонку КАЖДОЙ заполняемой сейчас
категории (SP-схема из 6 пар Amount/Comment не менялась) — так по каждой
категории в списке остаётся свой комментарий, а форма не заставляет писать
одно и то же несколько раз подряд.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 12:37:04 +05:00
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 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 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
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 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
Тимур Городецкий 8578653c16 feat: changed get time logic to approvers 2026-08-13 10:01:08 +05:00
Тимур Городецкий a8e54f2b35 feat: migrated 1c form 2026-08-11 10:39:04 +05:00
Тимур Городецкий 05f294d732 fix: changed script to crete cells from list to site 2026-08-06 15:00:06 +05:00
Тимур Городецкий c2e785961b feat: implemented workpalcesetup form 2026-08-04 11:08:16 +05:00