Девятый вид: причина (из ТЗ + «Другое»), что меняется — график работы
и/или оклад; оклад вводится один, долю постоянной части можно задать
(по умолчанию 75 % из ТЗ), переменная — остаток до 100 %, суммы считаются
сами; даты не раньше чем через 15 дней (срок уведомления работника);
обоснование — текстом или документом. Длинные названия видов 7 и 9
сокращены, а дублирующий выбранный вид заголовок над полями убран у всех
видов.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Восьмой вид, ровно по шаблону ТЗ: дата изменения, «в связи с» свободным
текстом (списка причин в ТЗ нет) и обязательная новая должностная
инструкция — отдельный слот вложений. Инициатор — только руководитель.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Седьмой вид, по ролям строго по шаблонам ТЗ. Работник просит неполный
рабочий день / неполную рабочую неделю и пишет заявление; работодатель
переводит на вахтовый, сменный или иной режим с новым графиком и
временем работы и указывает причину из ТЗ. Текущий режим и дата — у
обоих, документ «Новый график» необязателен. Списки графика и времени
работы и поле «список + Другое» стали общими для видов формы.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
По ТЗ у видов, которые может начать и сам работник (3, 4, 5, 7), шаблон
разный: у работника — только текст заявления, у работодателя — причины
из списка и обоснование. Разделяем строго по ТЗ полем «Инициатор»: по
умолчанию «на себя — работник, за другого — работодатель» (с подсказкой
под полем), следует за сменой сотрудника, пока его не выбрали руками.
Причина у работника при сохранении очищается.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Пятый вид: место работы «было → стало» парой организация + проект
(текущая организация — из шапки, новая — из справочника и обязательна),
адрес, дата, причина, условия переезда, вахта с графиком работы и
обоснование. Проверки «обязательно при отправке» по видам собраны в
одну функцию, чтобы форма не росла с каждым новым видом.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Четвёртый вид: новое подразделение из справочника, дата, причина а–г и
обоснование. По ТЗ согласие принимающего руководителя — шаг маршрута, а
approval-route руководителя нового подразделения найти не умеет, поэтому
пока форма сама ставит выбранного принимающего руководителя первым шагом
согласования (временно, до шага в админке маршрутов). Логика маршрута
вынесена в useContractRoute — форма перерастала 300 строк.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Исполнение — внутренняя работа после согласования, к печатному документу
заявки оно не относится: на печати остаётся только маршрут согласования.
Раньше так было лишь в отпусках, через ручную обёртку. Теперь у
ApprovalMatrix есть признак printable, ExecutorsMatrix всегда выключает
печать (и для будущих форм), а блоки «Исполнение», выведенные через
ApprovalMatrix напрямую, помечены явно. На экране ничего не меняется.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
В маршрут #15 добавлен тот же шаг кадровика, что в ежегодном отпуске:
в офисе — кадровик компании, на объекте — кадровик объекта. Форма
теперь передаёт проект в approval-route, поле «Проект» обязательно и
только из справочника. Сборка «организация + проект» вынесена в общий
organizationProjectRouteFieldValues — ей пользуются обе формы отпуска.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Кадры назначают кадровика по объекту, а в офисе — по компании, поэтому
маршрут #9 теперь учитывает проект: форма передаёт его в approval-route
вместе с организацией. Поле «Проект» стало обязательным и принимается
только из справочника — название, вписанное руками, условия маршрута
не узнают, и заявка ушла бы без кадровика.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
По аналогии с ежегодным отпуском вверху формы и просмотра увольнения —
плашка «Примечание» с текстом от кадров про срок уведомления по ст. 56
ТК РК. На печать не идёт.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Плашка «Примечание» с правилами нужна не только заявлениям на отпуск —
следующей её получает увольнение. Имя LeaveNotice вводило бы в
заблуждение, поэтому компонент стал нейтральным FormNotice; поведение
не меняется.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Исполнение — внутренняя работа кадров после согласования и к заявлению
сотрудника не относится. На печати «Заявки на отпуск» и «Отпуска без
содержания» остаётся только маршрут согласования; на экране таблица видна.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Печатное заявление подписывают от руки, а на листе было негде. В правом
верхнем углу шапки, под статусом, теперь ФИО сотрудника, место под роспись
и линия «(подпись)» — только при печати. ФИО именно сотрудника, а не
инициатора: заявку могут оформить за него. Общий компонент
shared/ui/PrintSignature, подключён в «Заявку на отпуск» и «Отпуск без
содержания».
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Комментарий адресован согласующим, а не кадрам, поэтому в печати просмотра
он скрыт (rp-no-print); обёртка с display: contents сохраняет поле ячейкой сетки.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Поток RequestsNotification умеет ветки «Отклонено» и «Возврат на доработку»,
но портал их не вызывал: notifyActiveStep ищет только активные строки, а после
такого решения их нет — инициатор узнавал о решении, только открыв заявку.
notifyInitiatorOfReturn шлёт в тот же поток RowID строки, по которой решил
текущий пользователь; подключён в onDecided всех форм, кроме «Изменения
условий ТД» (доработаем позже).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Третий разобранный вид: новая должность из справочника с ручным вводом,
дата перевода, причина (карьерный рост / вакантная должность / новый
объект, перераспределение функций / иное) и обоснование. Должностная
инструкция по ТЗ прикладывается всегда — обязательный слот вложений.
Работника и работодателя не различаем: причины видны всем.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Колонка ТЗ «Что приложить» становится подписанными слотами вложений по
виду; обязательны там, где ТЗ прямо требует документ. Первый слот —
«Результаты аттестации» при доплате за вредные условия. Обязательность
проверяется только при отправке, черновик сохраняется и без файла; файлы
скрытого слота не загружаются.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Подпись вложения префиксом в имени файла и поле одного слота жили внутри
«Заявки на приём», а теперь нужны и другим формам. Перенесены в
shared/attachments без изменения поведения: приём реэкспортирует общее,
его форма и просмотр не тронуты. useAttachmentEditor принимает новую,
ещё не сохранённую заявку (itemId пустой) и явное «куда грузить» —
id появляется только после первого сохранения.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Второй разобранный вид: основание (а–д из шаблона ТЗ — надбавка это или
доплата, видно из пункта), срок с/по или «бессрочно», размер с
переключателем «% / ₸» и обоснование, куда пишется и объём доп. работы при
совмещении. Проценты принимают дробные значения (7,5 %), тенге — целые;
при переходе на тенге дробная часть отбрасывается.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Условия меняются в одном трудовом договоре, а у совместителя их несколько.
Как в командировке: пикер FullBase теперь выбирает человека (записи
склеены по ИИН), а под ним — список его мест работы «Компания — должность —
подразделение»; единственное место выбирается само. Маршрут строится по
человеку и не ждёт выбора организации. Строка под полем и вложенная сетка,
сжимавшая поля вида, убраны.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Первый разобранный с кадрами вид: текущий и новый оклад, дата, причина
(испытательный срок / расширение функционала / иное) и обоснование — оно
же текст причины «иное». Всё необязательно. Поля вида живут в своей
секции byType/, а колонки невыбранного вида при сохранении очищаются,
чтобы после смены вида в заявке не оставалось скрытых значений.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Новая кадровая форма (hr-contract-change, только тестировщикам): сотрудник
из кадровой базы снимком в текстовых колонках и вид изменения из 10 по
ст. 33 ТК РК. Вид хранится MultiChoice-массивом, хотя по ТЗ выбирается
один, — чтобы разрешить несколько без миграции. Маршрут — по сотруднику,
а без учётной записи — по заявителю. Поля по видам добавляются отдельно.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Необязательное поле «Комментарий» (VacationComment, Note) последним в
секции: инициатор может пояснить заявку для согласующих. В просмотре
пустой комментарий не показывается, в DOCX для ЭДО не идёт.
Колонка уже провизионирована.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Транспорт и время выезда переехали в карточку точки, куда едут («Как
добраться: Алматы → Астана»), обратный переезд — под переключателем
«Возвращение». Отдельной строкой на линии маршрута участок пропускали.
Время выезда теперь обязательно — оно нужно тревел-координатору под билеты.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
По умолчанию считаются по датам точки; карандаш открывает ручной ввод — любое
число (форс-мажор, задержался). Под полем видно, сколько по датам, и можно
вернуть расчёт. В просмотре, печати и колонке SP ручное значение помечено
«(вручную)». Хранится в TripEstimateJson (quantityManual), колонок нет.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Переименована по требованию кадров; так же подписана и в списке незаполненных полей.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
У каждого участка маршрута рядом с видом транспорта — «Утро / День / Вечер /
Ночь» (необязательно, повторный клик снимает выбор). Хранится в TripRouteJson
(legDepartureTime) — новых колонок нет. На схеме — только в подсказке плашки
транспорта. Стили плашек вынесены в общий ChoiceChips.module.scss.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Необязательное поле «Комментарий» (колонка TripComment) после итога сметы;
в просмотре пустой комментарий не показывается.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
От прибытия в первую точку до отъезда из последней включительно; при
отправке подсвечивается отъезд последней точки.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Суточные — не больше 6 МРП в день по Казахстану и 8 за рубежом (по признаку
точки). Проживание теперь строится по точкам маршрута, как суточные: ночи из
дат точки, человек вводит только цену за ночь — не больше 15 000 ₸ по
Казахстану; лимит для заграницы — константа, пока без значения. Превышение
видно сразу под полем и блокирует отправку. syncPerDiem → syncRouteItems.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
У каждой точки маршрута — «Казахстан | Другая страна» (бывают смешанные
поездки). За рубежом страна и город вводятся вручную, подпись «Китай, Пекин»,
объект можно вписать своим текстом (завод, выставка — их нет в справочнике).
Новая колонка TripKind («По Казахстану» / «Зарубежная») — хотя бы одна точка
за рубежом делает поездку зарубежной; пригодится для маршрута и отчётов.
Переключатель «Форма | Схема» вынесен в общий SegmentedSwitch.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Поле убрано из формы, модели, чтения/записи и проверки. Колонка TripPurpose
убрана из манифеста; в уже созданном списке SP она остаётся с данными
тестовых заявок (провизионер колонки не удаляет).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Прибытие в любую точку маршрута — не раньше сегодняшнего дня: прошедшие дни
закрыты в календаре, а набранная вручную или устаревшая в черновике дата
подсвечивается при отправке (черновик сохраняется). «Сегодня» передаётся в
submitIssues параметром — тесты не зависят от текущей даты.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
По просьбе кадров. Иконка — local_taxi (машина с шашкой), чтобы такси
отличалось от служебного и личного автотранспорта.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Город отправления и города точек выбираются из справочника КАТО; в маршруте
хранятся оба названия и код (city/cityKz/cityKato, origin/originKz/originKato
внутри TripRouteJson — новых колонок нет). Везде, включая TripCity/TripRoute и
заголовок, город показывается как «Кульсары (Құлсары)». Введённый вручную
город (село, заграница) сохраняется текстом. README дополнен и описанием
командирующей организации.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Сотрудник может работать в нескольких компаниях, а командирует одна —
теперь её выбирают из организаций сотрудника (Employee/ByEmail), должность
подставляется из выбранной компании. Одна организация выбирается сама.
Выбор хранится в TripCompany + TripCompanyId (id — под будущий маршрут).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Плашки об отправке, ошибке и повторе, а также текст «Документы
отправлены на подписание в ЭДО» показываются только при включённом
VACATION_EDO_SIGNING_ENABLED.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Флаг VACATION_EDO_SIGNING_ENABLED в shared/config.ts: пока false,
решение последнего согласующего применяется без обращения к ЭДО.
Код отправки оставлен, включается заменой флага на true.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Пункт 4.5 — тот же выбор, что 5.6 в заявке на подбор, с «Другое» и ручным
вводом; подставляется из связанного подбора и обязателен для отправки.
Колонка сайта WorkHours общая с подбором (тот же тип, заголовок и варианты),
в список приёма её подключает провизионинг — до деплоя, иначе заявка не
сохранится. «Сдельная оплата труда» сдвинута на 4.6.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Оплачиваемый отпуск и отпуск без сохранения з/п добавлены в UNFROZEN_FORMS:
сохранять черновик и отправлять их теперь могут все, а не только группа
«Тестирование». Формы начали передавать formId в SubmitActions — без него
точечное снятие заморозки не срабатывало.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Проверки обязательных полей вынесены в validation.ts и показываются под
полями через FieldIssuesProvider, как в приёме, подборе и отпуске: форма
прокручивается к первому полю, над кнопками — кликабельный список.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
При виде работ «Дата запрета (открытие/закрытие)» и выбранной базе АТП
остальные базы снимаются и добавить их нельзя — дата запрета по АТП
открывается/закрывается отдельно. Над полем «База 1С» при этом виде работ
показывается предупреждение.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
LeavePrintNotice заменён общим LeaveNotice с заголовком и пунктами из model.ts
каждой формы: в отпуске — примечание HR (ст. 92 ТК РК, срок подачи, подписание
в отделе кадров), в отпуске без содержания — прежняя памятка про печать.
Проверки отпуска вынесены в validation.ts и показываются под полями через
FieldIssuesProvider, как в приёме и подборе.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Кадровый сотрудник и исполнитель в этих маршрутах зависят от компании
сотрудника (Ольга Кудрящова и Айнур — Тансу/КПС/CT, Мольдир Хамит —
остальные), но формы не передавали организацию в расчёт маршрута, и
условные шаги в админке не срабатывали. Теперь названия компаний из поля
«Организация» (Employee/ByEmail) уходят как Organization через пробел — и в
согласование, и в исполнителей; маршрут пересчитывается, когда организация
подгрузится. Общий хелпер — shared/dictionary/organizationRouteFields.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Сбор условий маршрута (вид работ, база 1С, отдел) и запрос маршрута с
схлопыванием повторов переехали из формы в planRoute.ts. Поведение формы
не меняется; функцию сможет использовать страница «Проверка маршрутов»,
чтобы проверять ровно тот маршрут, что видит заявитель.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
## Что сделано
**Чат заявки: отметки и оповещения**
- В поле ввода «@» открывает подсказку с участниками заявки: инициатор, согласующие и исполнители из маршрута, а также те, кому открыты «Все заявки» этого типа (список из request-type-access).
- Отметка — обычный текст «@ФИО», без штатного упоминания SharePoint, чтобы не уходило его письмо.
- После отправки сообщения портал вызывает поток Power Automate (`FLOW_CHAT_NOTIFY_URL`): отмеченным — «Вас упомянули», инициатору — «Новое сообщение по вашей заявке». Сбой потока не мешает отправке.
- В письмо добавляется строка «Прикреплены файлы: …», чтобы сообщение из одного файла не приходило пустым.
- Свойство веб-части «Чат: уведомлять о своих сообщениях (для теста)», по умолчанию выключено: письма и о своих сообщениях, можно отметить себя.
- Когда пишет сам инициатор с отметками, в `initiatorEmail` уходит первый отмеченный — поток шлёт инициатору всегда, если его нет среди отмеченных, и иначе он получил бы письмо о своём же сообщении.
**Чат включён для:** Обходной лист, заявка на подбор, заявка на приём, заявка в отдел 1С.
**Исправление:** редактор маршрута может удалять исполнителей в Обходном листе, Командировке и заявке в 1С (не передавалось `canRemoveRow`).
**Прочее:** убраны 4 предупреждения линтера (`no-new-null`, `no-script-url`).
## Не проверено на тенанте
- Ответ потока 200 через AadHttpClient и доставка писем.
- Права согласующих на комментарии и на запись в библиотеку «Файлы чата».
- Папки в «Файлы чата» наследуют права библиотеки, а не закрыты на заявку — для подбора и приёма это важно решить до выкладки.
- Если поток вставляет `messageText` в HTML-письмо, перенос строки перед «Прикреплены файлы» может не отобразиться.
---------
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/26
База 1С — мультивыбор, поэтому на одном шаге могут сработать сразу
несколько строк матрицы с одним исполнителем (Гульжан и за ЗУП, и за
АТП от финдепа). Он получал бы два уведомления и решал шаг дважды.
Запланированный маршрут теперь оставляет одну строку на человека в
пределах шага; один человек на разных шагах не схлопывается.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Новая матрица маршрута #8 назначает согласующих по выбранной базе
(ЗУП, АТП, ATS), а форма передавала в approval-route только вид работ
и отдел — такие шаги никогда не срабатывали. Теперь DB1C уходит в
fieldValues одной строкой через пробел (мультивыбор, value у API
только строка), и маршрут пересчитывается при смене набора баз.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>