Files
request-portal/src/webparts/requestPortal/forms/ServiceRequest
gorbenko.pavel c5958c3348
Tests / frontend-test (push) Successful in 1m22s
refactor(ServiceRequest): убрать «Ревизия», «Отдел» -> «Подразделение» из справочника (#19)
Поле «Ревизия» — из бумажной формы, в электронной не нужно (нет
параллельных версий заявки, при возврате на доработку правится тот же
элемент). Убрано из модели, манифеста и load.ts.

«Отдел» переименован в «Подразделение» (заголовок общего столбца сайта
Department — у большинства форм он уже так называется) и теперь, как
организация и должность, подставляется из карточки заявителя
(Employee/ByEmail.section/departmentId) при выборе/загрузке — а не
только вручную через DepartmentPicker.

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

---------

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/19
2026-09-02 05:22:28 +00:00
..
2026-09-01 12:48:41 +00:00
2026-09-01 12:48:41 +00:00
2026-09-01 12:48:41 +00:00

Заявка на услуги (wh-service-request)

Назначение: электронный аналог бумажной Service Requisition Form ПТО — заявка на договор/услуги/работы (субподряд, поставка, аренда) по проекту. Категория: Склад / Снабжение Списки SP: «Заявка на услуги — данные», «Заявка на услуги — согласование» RequestTypeId (внешний API маршрутов): резолвится в рантайме по pageUrl (см. docs/forms.md)

Маршрут

  • Фазы: согласование (без фазы исполнения — договор дальше ведётся вне портала)
  • Особенности: маршрут зависит от выбранного проекта (ProjectId, oid из ProjectPicker) — пока проект не выбран, resolveRoute отвечает 404, и матрица не резолвится (см. matrixReady в ServiceRequestForm.tsx, тот же приём, что в TmcTransferForm)

Особое поведение

  • Подача за другого: заявитель — PeopleField, по умолчанию текущий пользователь, можно выбрать любого — маршрут резолвится на ВЫБРАННОГО (см. handleRequesterChange).
  • Табличная часть «Приложения» (Annexes) — описание документа + номер приложения + сам файл, прикреплённый прямо к строке (fileName, хранится как встроенное вложение элемента списка — см. shared/attachments). Отдельного общего блока «Вложения» у формы нет: каждый файл привязан к своей строке.
  • Табличная часть «Смета» (Costs) — список групп (разделов работ), внутри каждой свои позиции; название группы необязательно. Сумма по позиции, по группе и общий итог считаются на лету (qty × rate, см. cost.ts), не хранятся в структуре — правка количества/цены не может их рассинхронизировать.
  • Под «Объём работ» (текстовое поле) — детализация по позициям в ТОМ ЖЕ формате, что и смета: группы/позиции/цена/сумма (WorkVolumes, см. CostGroupsEditor.tsx — общий редактор, переиспользуется и в CostsSection, и здесь). Дополняет текст итоговыми цифрами, не заменяет его.
  • Costs/WorkVolumes сериализуются в JSON-колонки (EstimateJson/WorkVolumesJson) ОБЪЕКТОМ { groups, total } — готовый итог кладётся прямо в JSON рядом с группами (см. serializeGroups/parseGroupedJson в cost.ts), а не отдельной числовой колонкой: он и так пересчитывается из groups при каждом сохранении, отдельная колонка была бы лишней схемой ради того же значения. Сама форма читает только groups — total из хранилища не доверяет, всегда считает заново (costTotal); total в JSON нужен тем, кто читает колонку напрямую (отчёты, sp-query), не поднимая форму.
  • Annexes сериализуется в AnnexesJson просто массивом (без обёртки total — там считать нечего) — тот же приём, что в TmcTransfer (ItemsJson).
  • Продолжительность работ под датами «начало/окончание» — производная величина (считается на лету), в SharePoint не пишется.
  • Фазы исполнения нет: saveServiceRequest пишет маршрут с пустым списком исполнителей.

Секции формы

HeaderSection, ScopeSection, AnnexesSection, CostsSection, RemarksSection

Точки входа

  • rptype: wh-service-request
  • Режим согласующего (просмотр): есть (ServiceRequestView)
  • «Создать на основе»: —