Проект больше не влияет на маршрут (условие по Project убрано в админке),
поэтому поле стало мультивыбором (ProjectPickerMulti). Список хранится в
новой колонке ProjectsJson; старые Project/ProjectId/ProjectCode заполняются
производными значениями для представлений и отчётов, старые заявки читаются
из них. Title и текстовые колонки обрезаются до 255 символов, чтобы длинные
названия не роняли сохранение. Требует провижининга колонки ProjectsJson.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Алтынай Бултурукова (право canEditRoute) просила менять порядок участников
уже поданной заявки. Стрелки у шагов согласования и исполнения: меняются
местами только соседние шаги одной фазы, оба «Ждут очереди» — активный и
пройденные шаги не трогаются, поэтому никто не теряет заявку и оповещать
некого. Строки перечитываются перед записью, StepOrder пишется одним батчем.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Кнопка отправки гасла без объяснения, если, например, указано больше 5 дней.
Форма переходит на общий FieldIssuesProvider: над кнопками список проблем,
по нажатию — подсветка поля с текстом ошибки и прокрутка к нему. Правила
вынесены в validation.ts.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Вместо свободного «В связи с» — обязательный выбор причины (брак, рождение
ребёнка, смерть близких, иные случаи); текст причины нужен только для иных
случаев. Отпуск — не более 5 календарных дней. Подавать за 14 дней нужно
только в иных случаях: остальные события заранее не планируются.
Причина хранится в новой Choice-колонке UnpaidLeaveReasonType.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Отдел кадров переименовал заявки: «Заявление на оплачиваемый ежегодный
трудовой отпуск» и «Заявление на отпуск без сохранения заработной платы».
Меняются плитки и заголовки карточек; имена списков SharePoint и pageUrl
остаются прежними, чтобы не потерять связь с существующими списками.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Отдел 1С передаёт заявки внутри себя: исполнитель с невыполненным шагом
может в поданной заявке заменить или убрать невыполненного исполнителя,
в т.ч. активного и себя. Выполненные шаги не трогаются, последнего
невыполненного — только заменить. Механизм тот же, что в подборе, но
право по роли в маршруте, а не по списку email.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Если согласующий из маршрута недоступен (отпуск и т.п.), инициатор может
поставить на его шаг другого человека, пока заявка не отправлена. Шаг
целиком (порядок, роль, SLA) сохраняется, удалить его по-прежнему нельзя —
состав маршрута из админки остаётся гарантированным. Замена — общая операция
useMatrixEditor.replace, кнопка подключена только в этой форме.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Форма не передавала в approval-route значения полей, только отдел, поэтому
условные шаги («WorkplaceCompaniesJson содержит АСТЕЛ-К», «Organization
содержит …», «Software содержит AutoCAD») считались неверно. Теперь
передаются организации (имена через пробел, как в приёме и подборе) и
«Необходимое ПО»; матрица пересчитывается при их смене.
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>
Полное право правки стало раздельным по формам: раньше общий список открыл
бы Ерболу и подбор с приёмом. В «Организации рабочего места» право действует,
пока он есть в маршруте (согласование или исполнение) и заявка «На
согласовании» или «Выполнение», независимо от того, чья сейчас очередь.
Правки пишутся в журнал (подсветка «Было: …»), перед «Согласовать»
проверяются обязательные поля. Блок вложений вынесен в общий компонент.
Нужна новая колонка WorkplaceApproverChangesJson в списке данных.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Без латинского написания имени ИТ не может завести учётную запись,
поэтому заявку без него больше нельзя ни отправить, ни сохранить.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Алтынай на своём шаге согласования теперь может добавлять и удалять
файлы, а не только поля. Удаление — сразу, новые файлы загружаются
вместе с «Сохранить» или решением. Блоки вложений вынесены из
просмотров в отдельные компоненты на общем хуке useAttachmentEditor.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Заявки, открытые из КПС, передают ссылку на заявку в позицию акта
дефектов через Inventory API (POST /inventory/api/defect-acts/parts/
{partId}/tmc-transfer); остальные — в Dataverse, как раньше. Для КПС не
ищем «Куда» в Dataverse: positionId там чужой и давал только 404.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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>
Внешняя система (напр. КПС) передаёт source — пишем его в новую колонку
SourceSystem рядом с SourcePositionId, чтобы по заявке было видно, откуда
она пришла и куда отвечать. Запоминание источника вынесено в отдельный
эффект: positionId/source/склад сохраняются и по ссылке без nomenclatureId.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Цифровая версия бумажной заявки на командировку (отдел кадров). Можно
подать за другого сотрудника; маршрут — лентой точек (город + объект из
справочника проектов + даты) с видом транспорта на каждом участке и
вторым видом «Схема» (SVG, как схема метро). Задание — список задач.
Смета — карточками статей (суточные, проезд, проживание, страховка,
виза, другие расходы) с позициями, привязанными к точкам и участкам
маршрута; суммы только вручную, итог с долями и разбивкой по объектам.
Печать — без шапки с адресатом.
Плитка пока только для тестировщиков (comingSoon): списки SharePoint
не провизионированы, тип заявки и маршрут в админке не заведены.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Хук, который грузит маршрут согласования отдельно по фазам «Согласование»
и «Исполнение», был в папке «Объяснительной по СКУД». Он понадобился и
заявке на командировку, поэтому перенесён в shared/approval под общим
именем. Поведение СКУД не меняется — поменялись только импорты.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
В маршруте №8 есть шаг «Исполнение», но форма 1С запрашивала только
согласование и записывала пустой список исполнителей: после согласования
заявка навсегда оставалась «Согласовано», без исполнителя и даты исполнения.
Теперь исполнитель берётся из маршрута с теми же условиями, заявка идёт
«Выполнение» → «Закрыта», а карточка Planner создаётся при переходе в
исполнение (в т.ч. сразу при отправке, если согласование не требуется).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
В подборе и реферале черновик хранил дату первого сохранения, и через
несколько дней заявка уходила на согласование со старой датой подачи.
Теперь при отправке дата подачи всегда сегодняшняя, а открытый черновик
сразу показывает сегодня (как уже было в объяснительной по СКУД). В реферале
дату больше нельзя поправить руками. Общая логика — shared/submitDate.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Пользователи не понимали, почему кнопка «Отправить на согласование» серая.
Теперь в заявках на приём и подбор кнопки активны: нажатие при незаполненных
или неверных полях ничего не сохраняет, а подсвечивает эти поля с подсказкой
под ними и прокручивает к первому. Над кнопками — список проблем, пункты ведут
к полю. Механизм общий (FieldIssuesProvider + FormField), остальные формы
пока работают по-старому и переводятся по тому же паттерну.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Вместо линии для подписи под запиской печатается маршрут согласования
и исполнения. Документ больше не вылезает за карточку (box-sizing), а текст
причины «Другое» получает точку, чтобы следующая фраза к нему не прилипала.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Убрана причина «Забыл(а) пропуск», неисправность турникета/считывателя
обобщена до «Неисправность СКУД» — так просит отдел кадров.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Сотрудник пишет объяснительную за дни без отметок СКУД, выбирая их кликом
в календаре «Мой СКУД» (перенесён из portal-main-page: те же цвета и
правила, проходы Hikvision текущего пользователя, праздники из
«Производственного календаря»). Текст записки собирается автоматически,
в просмотре печатается бланк объяснительной.
- выбираются прошедшие дни < 8 ч, с одной записью или без отметок и
сегодня без отметок; только текущий и прошлый месяц;
- дни сохраняются снимком (JSON), т.к. согласующий чужой СКУД не видит;
- защита от повторов: дни из уже поданных объяснительных помечены ✓ и
не выбираются, перед отправкой список перечитывается;
- маршрут в две фазы: согласование + исполнение (кадры);
- дата подачи ставится автоматически.
Плитка пока только для тестировщиков (comingSoon): списки SP
провизионированы, тип и маршрут заведены, осталась проверка e2e.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
При доработке и повторной отправке writeRoute раньше удалял все строки
маршрута и создавал заново — кто вернул или отклонил заявку и с каким
комментарием, терялось. Теперь маршрут пересохраняется патчем
(planRoutePatch + ApprovalListService.patchSteps): строки, что остаются в
маршруте, обновляются на месте, и их прошлые решения лежат в истории
версий; недостающие шаги создаются, выпавшие и строки делегатов уходят в
корзину. Всё одним пакетом. Проверено пилотами на увольнении и рабочем
месте (обе фазы, уход в корзину). Аварийный откат для всех форм —
ROUTE_PATCH_ENABLED = false.
Из версий строк маршрута и заявки собирается лента «История
согласования» (shared/approval/history): отправки, решения с
комментариями и временем на шаге, делегирование, замена исполнителя,
у кого заявка сейчас. Свёрнутый раздел в карточке и в форме доработки
всех форм, грузится только при раскрытии.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Если последний рабочий день раньше, чем через месяц от сегодня, под полем
показывается причина и минимальная дата. Раньше кнопки отправки просто
становились неактивными без объяснения — это случалось у заявлений,
пролежавших на доработке: дата, допустимая при подаче, переставала
подходить. Правило и текст вынесены в lastWorkingDay.ts и общие для
подсказки и проверки перед отправкой.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Подпись «Организация заявителя» заменена на «Организация» — в форме,
в подсказке незаполненных полей и в манифесте колонки (как у остальных
форм; на существующую колонку SharePoint манифест не влияет).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Начальник отдела подбора (routeEditRights) назначает исполнителей, но
сама в исполнении не стоит. В матрице «Исполнение» заявки на подбор у
шагов «Ждёт очереди» и «На исполнении» появились кнопки «Заменить» и
«Удалить»:
- замена меняет только человека в шаге, активный шаг сразу переходит
к новому исполнителю, ему уходит оповещение;
- при удалении активного очередь переходит к следующему исполнителю;
- выполненные шаги не трогаются, последнего невыполненного исполнителя
можно только заменить — иначе заявка закрылась бы без исполнения.
Остальные формы не затронуты: кнопки включаются пропсами ApprovalMatrix
(canReplaceRow/onReplaceRow) только в RecruitingSelectionView.
notifyActiveStep получил необязательный rowId, чтобы на параллельном
шаге письмо ушло именно новому исполнителю.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Тип заявки и так виден в колонке «Тип», префикс в названии только
удлинял его:
- подбор: «Должность — Проект»;
- приём: «ФИО — Должность — Проект».
Уже созданные заявки сохраняют старое название до пересохранения.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Поле было только для чтения и не позволяло поправить организации. Теперь
это CompanyPickerMulti, как в подборе: предзаполняется по заявителю и
редактируется, обязательное. Компании хранятся в WorkplaceCompaniesJson,
Organization пересобирается текстом для печати и старых заявок.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
employeeCompanies() нужен теперь не только подбору, но и заявке на рабочее
место — одна реализация вместо копий в каждой форме.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
После согласования подбор сразу уходит в «Выполнение», поэтому фильтр
только по «Согласовано» почти всегда давал пустой список. Теперь берутся
все утверждённые статусы, как в isApprovedStatus.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Если нужной базы нет в списке, заявитель отмечает «Другое» и вписывает
название в обязательное поле. Текст хранится в отдельной колонке DB1COther,
показывается в просмотре и попадает в карточку Planner.
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>
«Виды работ», «Организация» и «База 1С» теперь читаются из колонок списка
(общий хук shared/fieldChoices), а не из констант: новый пункт добавляется
в параметрах столбца без правки кода и деплоя. Пилот — на форме 1С, при
успехе переводим остальные формы. В стартовые варианты provisioning.json
добавлен «Маршруты в ДО».
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>