From c73ab17cbd11ee550ac4a978b362a5dd4add8af7 Mon Sep 17 00:00:00 2001 From: "gorbenko.pavel" Date: Tue, 1 Sep 2026 11:26:57 +0500 Subject: [PATCH] refactor(ServiceRequest): CostsJson/CostTotal -> EstimateJson/EstimateTotal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Понятнее по смыслу колонки: это смета (Estimate), а не «costs» вообще. Co-Authored-By: Claude Sonnet 5 --- src/webparts/requestPortal/forms/ServiceRequest/README.md | 4 ++-- src/webparts/requestPortal/forms/ServiceRequest/load.ts | 4 ++-- src/webparts/requestPortal/forms/ServiceRequest/model.ts | 4 ++-- .../requestPortal/forms/ServiceRequest/provisioning.json | 4 ++-- .../forms/ServiceRequest/sections/CostsSection.tsx | 2 +- src/webparts/requestPortal/forms/ServiceRequest/submit.ts | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/webparts/requestPortal/forms/ServiceRequest/README.md b/src/webparts/requestPortal/forms/ServiceRequest/README.md index 3da64ab..f06809a 100644 --- a/src/webparts/requestPortal/forms/ServiceRequest/README.md +++ b/src/webparts/requestPortal/forms/ServiceRequest/README.md @@ -12,8 +12,8 @@ ## Особое поведение - Подача за другого: заявитель — `PeopleField`, по умолчанию текущий пользователь, можно выбрать любого — маршрут резолвится на ВЫБРАННОГО (см. `handleRequesterChange`). - Табличная часть «Приложения» (`Annexes`) — документы заявки (чертежи, ТЗ, ведомости объёмов) с чекбоксом «подтверждено»; не путать с блоком «Вложения» (реальные файлы) — это ОТДЕЛЬНЫЙ учёт, как в бумажной форме. -- Табличная часть «Смета» (`Costs`) — список групп (разделов работ), внутри каждой свои позиции; название группы необязательно. Сумма по позиции, по группе и общий итог считаются на лету (`qty × rate`, см. `cost.ts`), не хранятся в структуре — правка количества/цены не может их рассинхронизировать. `CostTotal` дублируется числовой колонкой в SharePoint при сохранении — только для отчётов, форма её не читает обратно. -- Обе табличные части сериализуются в JSON-колонки (`AnnexesJson`, `CostsJson`) — тот же приём, что в `TmcTransfer` (`ItemsJson`). +- Табличная часть «Смета» (`Costs`) — список групп (разделов работ), внутри каждой свои позиции; название группы необязательно. Сумма по позиции, по группе и общий итог считаются на лету (`qty × rate`, см. `cost.ts`), не хранятся в структуре — правка количества/цены не может их рассинхронизировать. `EstimateTotal` дублируется числовой колонкой в SharePoint при сохранении — только для отчётов, форма её не читает обратно. +- Обе табличные части сериализуются в JSON-колонки (`AnnexesJson`, `EstimateJson`) — тот же приём, что в `TmcTransfer` (`ItemsJson`). - Продолжительность работ под датами «начало/окончание» — производная величина (считается на лету), в SharePoint не пишется. - Фазы исполнения нет: `saveServiceRequest` пишет маршрут с пустым списком исполнителей. diff --git a/src/webparts/requestPortal/forms/ServiceRequest/load.ts b/src/webparts/requestPortal/forms/ServiceRequest/load.ts index ab6bea8..0cfff58 100644 --- a/src/webparts/requestPortal/forms/ServiceRequest/load.ts +++ b/src/webparts/requestPortal/forms/ServiceRequest/load.ts @@ -34,7 +34,7 @@ const SELECT_FIELDS = [ 'EstimatedFinishDate', 'GeneralRemarks', 'AnnexesJson', - 'CostsJson', + 'EstimateJson', 'RequestStatus', 'RequestUniqueCode' ]; @@ -94,7 +94,7 @@ export async function loadServiceRequest(itemId: number, listId?: string): Promi EstimatedFinishDate: toDateInput(item.EstimatedFinishDate), GeneralRemarks: (item.GeneralRemarks as string) || '', Annexes: parseRows(item.AnnexesJson), - Costs: parseRows(item.CostsJson) + Costs: parseRows(item.EstimateJson) }; return { diff --git a/src/webparts/requestPortal/forms/ServiceRequest/model.ts b/src/webparts/requestPortal/forms/ServiceRequest/model.ts index 6cd68ac..8753149 100644 --- a/src/webparts/requestPortal/forms/ServiceRequest/model.ts +++ b/src/webparts/requestPortal/forms/ServiceRequest/model.ts @@ -80,7 +80,7 @@ export const CONTRACT_ACTION_OPTIONS: ISelectOption[] = [ * Данные формы «Заявка на услуги» (бумажный аналог — Service Requisition Form * ПТО). Ключи = internalName колонок SP-списка «Заявка на услуги — данные». * Табличные части (Annexes / Costs) в колонки не разворачиваются, а - * сериализуются в JSON-колонки AnnexesJson / CostsJson (см. submit.ts / load.ts). + * сериализуются в JSON-колонки AnnexesJson / EstimateJson (см. submit.ts / load.ts). */ export interface IFormData { // --- Заявитель --- @@ -132,7 +132,7 @@ export interface IFormData { // --- Табличные части --- /** Приложения к заявке (сериализуются в AnnexesJson). */ Annexes: IAnnexRow[]; - /** Сметная стоимость по группам (сериализуется в CostsJson). */ + /** Сметная стоимость по группам (сериализуется в EstimateJson). */ Costs: ICostGroup[]; } diff --git a/src/webparts/requestPortal/forms/ServiceRequest/provisioning.json b/src/webparts/requestPortal/forms/ServiceRequest/provisioning.json index 61ca799..0296388 100644 --- a/src/webparts/requestPortal/forms/ServiceRequest/provisioning.json +++ b/src/webparts/requestPortal/forms/ServiceRequest/provisioning.json @@ -29,7 +29,7 @@ { "internalName": "GeneralRemarks", "title": "Общие замечания", "type": "Note" }, { "internalName": "AnnexesJson", "title": "Приложения (JSON)", "type": "Note" }, - { "internalName": "CostsJson", "title": "Сметная стоимость (JSON)", "type": "Note" }, - { "internalName": "CostTotal", "title": "Итого без НДС", "type": "Number", "decimals": 2 } + { "internalName": "EstimateJson", "title": "Сметная стоимость (JSON)", "type": "Note" }, + { "internalName": "EstimateTotal", "title": "Итого без НДС", "type": "Number", "decimals": 2 } ] } diff --git a/src/webparts/requestPortal/forms/ServiceRequest/sections/CostsSection.tsx b/src/webparts/requestPortal/forms/ServiceRequest/sections/CostsSection.tsx index bd63181..5f54ab2 100644 --- a/src/webparts/requestPortal/forms/ServiceRequest/sections/CostsSection.tsx +++ b/src/webparts/requestPortal/forms/ServiceRequest/sections/CostsSection.tsx @@ -116,7 +116,7 @@ const CostGroup: React.FC = ({ * Сметная стоимость услуг-работ по разделам (группам). Сумма по позиции, * по группе и общий итог — все производные (qty × цена), считаются на лету * и НЕ хранятся построчно (см. cost.ts): правка количества/цены не может - * рассинхронизировать сумму. CostTotal в SharePoint дублируется отдельной + * рассинхронизировать сумму. EstimateTotal в SharePoint дублируется отдельной * числовой колонкой при сохранении (см. submit.ts) — только для отчётов, * форма её сама не читает. */ diff --git a/src/webparts/requestPortal/forms/ServiceRequest/submit.ts b/src/webparts/requestPortal/forms/ServiceRequest/submit.ts index 262bbb0..49bc21a 100644 --- a/src/webparts/requestPortal/forms/ServiceRequest/submit.ts +++ b/src/webparts/requestPortal/forms/ServiceRequest/submit.ts @@ -33,12 +33,12 @@ function buildItem(data: IFormData, status: string): Record { }); item.AnnexesJson = data.Annexes.length > 0 ? JSON.stringify(data.Annexes) : null; - item.CostsJson = data.Costs.length > 0 ? JSON.stringify(data.Costs) : null; + item.EstimateJson = data.Costs.length > 0 ? JSON.stringify(data.Costs) : null; // Итог сметы дублируем числовой колонкой намеренно: в самой форме он считается // на лету (см. cost.ts), но представлениям SharePoint и отчётам нужна сумма // без разбора JSON — иначе любой отчёт по заявкам пришлось бы писать кодом. const total = costTotal(data.Costs); - item.CostTotal = total > 0 ? total : null; + item.EstimateTotal = total > 0 ? total : null; return item; }