diff --git a/docs/forms.md b/docs/forms.md index 457a5a2..879abe9 100644 --- a/docs/forms.md +++ b/docs/forms.md @@ -45,7 +45,7 @@ | [`recruiting-referral`](../src/webparts/requestPortal/forms/Referral/README.md) | Реферальная рекомендация | Рекрутинг | да | да | да | кандидат — внешний (текстовые поля, не People); маршрут по рекомендателю; исполнитель переназначает на реального; условное уточнение «откуда знаете» | ✅ | | [`it-workplace-setup`](../src/webparts/requestPortal/forms/WorkplaceSetup/README.md) | Организация рабочего места | IT | да | да | да | префилл из «прием», поля ПО/доступы правит руководитель | ✅ | | [`it-1c-ticket`](../src/webparts/requestPortal/forms/Ticket1C/README.md) | Заявка в отдел 1С | IT | да | нет | да | контакты предзаполняются из Graph (/me); вместо фазы исполнения — карточка в Microsoft Planner (согласовано/сразу без согласования — рабочий бакет, отклонено — отдельный бакет) | ✅ | -| [`clearance-form`](../src/webparts/requestPortal/forms/Clearance/README.md) | Обходной лист | Отдел кадров | да | нет | да | подаётся HR за увольняемого (People-picker) либо создаётся сам по согласованному «Заявлению на увольнение»; условие «IsManager» резолвится по должности из самой заявки; да/нет-поля (парковка, СКУД); 6 независимых сумм к списанию компактной сеткой (ОС, СИЗ, подотчётная сумма, обучение, НМА, ТМЦ) — вводит любой активный согласующий, блокируется навсегда после первого ввода; заполнил хоть одну — стандартный комментарий решения (в блоке «Ваше решение») становится обязательным на любое решение, не только возврат/отклонение | ✅ | +| [`clearance-form`](../src/webparts/requestPortal/forms/Clearance/README.md) | Обходной лист | Отдел кадров | да | нет | да | подаётся HR за увольняемого (People-picker) либо создаётся сам по согласованному «Заявлению на увольнение»; условие «IsManager» резолвится по должности из самой заявки; да/нет-поля (парковка, СКУД); 5 независимых сумм к списанию компактной сеткой (ОС, СИЗ, подотчётная сумма, НМА, ТМЦ — обучение не входит, у него своё поле) — вводит любой активный согласующий, блокируется навсегда после первого ввода; заполнил хоть одну — стандартный комментарий решения (в блоке «Ваше решение») становится обязательным на любое решение, не только возврат/отклонение | ✅ | | [`hr-dismissal`](../src/webparts/requestPortal/forms/Dismissal/README.md) | Заявление на увольнение | Отдел кадров | да | нет | да | совместители — таблица компаний с удалением строки (снимает и согласующего из матрицы); должность/организация из справочника; **после согласования сам создаёт обходной лист**; печать заблокирована до согласования обходного листа; «Лицо, принимающее ОС/НМА» — заполняет только непосредственный руководитель | ✅ | | `hr-transfer` | Перемещение сотрудников | Отдел кадров | — | — | — | — | ⏳ заглушка (плитка есть, форма не сделана) | diff --git a/src/webparts/requestPortal/forms/Clearance/README.md b/src/webparts/requestPortal/forms/Clearance/README.md index aba5068..e6d71fc 100644 --- a/src/webparts/requestPortal/forms/Clearance/README.md +++ b/src/webparts/requestPortal/forms/Clearance/README.md @@ -55,10 +55,13 @@ RequestTypeId» в `docs/forms.md`). Тип уже зарегистрирова заведённых руками, ссылки нет и поле не рендерится. ## Суммы к списанию (согласование) -6 НЕЗАВИСИМЫХ сумм, компактной сеткой (короткие подписи, обычная 2-колоночная -сетка секции), колонки `WriteOff{Assets,Ppe,Accountable,Training,Nma,Tmc}Amount` -(см. `model.ts WRITE_OFF_CATEGORIES`): «ОС», «СИЗ», «Подотчётная сумма», -«Обучение», «НМА», «ТМЦ». +5 НЕЗАВИСИМЫХ сумм, компактной сеткой под подписью «СУММЫ К СПИСАНИЮ» (короткие +подписи, обычная 2-колоночная сетка секции), колонки +`WriteOff{Assets,Ppe,Accountable,Nma,Tmc}Amount` (см. `model.ts +WRITE_OFF_CATEGORIES`): «ОС», «СИЗ», «Подотчётная сумма», «НМА», «ТМЦ». +Обучение сюда НЕ входит — у него уже есть `TrainingAmount` (см. выше) с ДРУГИМ +поведением (правит только КДП); заводить второе одноимённое поле с иным +поведением рядом только путало. - **Не привязаны к должности**, в отличие от отметок выше: заполнить может ЛЮБОЙ согласующий, у которого сейчас активный шаг (`ClearanceView.canEditWriteOffs`, diff --git a/src/webparts/requestPortal/forms/Clearance/load.ts b/src/webparts/requestPortal/forms/Clearance/load.ts index 1feefa2..5c390fa 100644 --- a/src/webparts/requestPortal/forms/Clearance/load.ts +++ b/src/webparts/requestPortal/forms/Clearance/load.ts @@ -41,7 +41,6 @@ export async function loadClearanceRequest(itemId: number, listId?: string): Pro 'WriteOffAssetsAmount', 'WriteOffPpeAmount', 'WriteOffAccountableAmount', - 'WriteOffTrainingAmount', 'WriteOffNmaAmount', 'WriteOffTmcAmount', 'RequestStatus', @@ -70,7 +69,6 @@ export async function loadClearanceRequest(itemId: number, listId?: string): Pro WriteOffAssetsAmount: numberField(item.WriteOffAssetsAmount), WriteOffPpeAmount: numberField(item.WriteOffPpeAmount), WriteOffAccountableAmount: numberField(item.WriteOffAccountableAmount), - WriteOffTrainingAmount: numberField(item.WriteOffTrainingAmount), WriteOffNmaAmount: numberField(item.WriteOffNmaAmount), WriteOffTmcAmount: numberField(item.WriteOffTmcAmount) }; diff --git a/src/webparts/requestPortal/forms/Clearance/model.ts b/src/webparts/requestPortal/forms/Clearance/model.ts index b053290..3e84256 100644 --- a/src/webparts/requestPortal/forms/Clearance/model.ts +++ b/src/webparts/requestPortal/forms/Clearance/model.ts @@ -39,13 +39,16 @@ export interface IFormData { DismissalUrl: string; /** - * Суммы к списанию по обходному листу — 6 независимых сумм (компактная сетка - * полей, см. WRITE_OFF_CATEGORIES). «Сырые» цифры без пробелов, как - * TrainingAmount (см. MoneyInput). Пусто = не заполнено. КАЖДАЯ — - * независимая: заполнить может любой активный согласующий (см. - * ClearanceView.canEditWriteOffs), но как только сумма непустая — блокируется - * НАВСЕГДА, для всех (включая того, кто её ввёл). Признак блокировки — сама - * непустая сумма, отдельного флага в списке нет. + * Суммы к списанию по обходному листу — 5 независимых сумм (компактная сетка + * полей, см. WRITE_OFF_CATEGORIES). Обучение сюда НЕ входит — для него уже + * есть отдельное поле `TrainingAmount` (см. выше) с ДРУГИМ поведением + * (правит только КДП, не любой согласующий); заводить второе «Обучение» с + * иным поведением рядом только путало (полностью совпадающие подписи). + * «Сырые» цифры без пробелов, как TrainingAmount (см. MoneyInput). Пусто = + * не заполнено. КАЖДАЯ — независимая: заполнить может любой активный + * согласующий (см. ClearanceView.canEditWriteOffs), но как только сумма + * непустая — блокируется НАВСЕГДА, для всех (включая того, кто её ввёл). + * Признак блокировки — сама непустая сумма, отдельного флага в списке нет. * * «За что конкретно» — своего поля НЕТ: заполнил хоть одну сумму — становится * обязательным СТАНДАРТНЫЙ комментарий решения (DecisionPanel, «Ваше решение»), @@ -57,22 +60,20 @@ export interface IFormData { WriteOffAssetsAmount: string; WriteOffPpeAmount: string; WriteOffAccountableAmount: string; - WriteOffTrainingAmount: string; WriteOffNmaAmount: string; WriteOffTmcAmount: string; } -/** Имена всех 6 сумм к списанию — см. IFormData.WriteOff*Amount. */ +/** Имена всех 5 сумм к списанию — см. IFormData.WriteOff*Amount. */ export type WriteOffFieldKey = | 'WriteOffAssetsAmount' | 'WriteOffPpeAmount' | 'WriteOffAccountableAmount' - | 'WriteOffTrainingAmount' | 'WriteOffNmaAmount' | 'WriteOffTmcAmount'; /** - * Одна из 6 независимых категорий списания — см. IFormData.WriteOff*Amount. + * Одна из 5 независимых категорий списания — см. IFormData.WriteOff*Amount. * amountField сужен до WriteOffFieldKey (а не keyof IFormData целиком): у * IFormData есть и булевы поля (ParkingCard/AccessCard), и `data[cat.amountField]` * должен типизироваться строго строкой — иначе `.trim()` в валидации и @@ -88,7 +89,6 @@ export const WRITE_OFF_CATEGORIES: IWriteOffCategory[] = [ { key: 'assets', label: 'ОС', amountField: 'WriteOffAssetsAmount' }, { key: 'ppe', label: 'СИЗ', amountField: 'WriteOffPpeAmount' }, { key: 'accountable', label: 'Подотчётная сумма', amountField: 'WriteOffAccountableAmount' }, - { key: 'training', label: 'Обучение', amountField: 'WriteOffTrainingAmount' }, { key: 'nma', label: 'НМА', amountField: 'WriteOffNmaAmount' }, { key: 'tmc', label: 'ТМЦ', amountField: 'WriteOffTmcAmount' } ]; @@ -121,7 +121,6 @@ export const EMPTY_DATA: IFormData = { WriteOffAssetsAmount: '', WriteOffPpeAmount: '', WriteOffAccountableAmount: '', - WriteOffTrainingAmount: '', WriteOffNmaAmount: '', WriteOffTmcAmount: '' }; diff --git a/src/webparts/requestPortal/forms/Clearance/provisioning.json b/src/webparts/requestPortal/forms/Clearance/provisioning.json index d9b321c..7c82054 100644 --- a/src/webparts/requestPortal/forms/Clearance/provisioning.json +++ b/src/webparts/requestPortal/forms/Clearance/provisioning.json @@ -19,7 +19,6 @@ { "internalName": "WriteOffAssetsAmount", "title": "Сумма к списанию: ОС", "type": "Number", "decimals": 2 }, { "internalName": "WriteOffPpeAmount", "title": "Сумма к списанию: СИЗ", "type": "Number", "decimals": 2 }, { "internalName": "WriteOffAccountableAmount", "title": "Сумма к списанию: подотчётная сумма", "type": "Number", "decimals": 2 }, - { "internalName": "WriteOffTrainingAmount", "title": "Сумма к списанию: обучение", "type": "Number", "decimals": 2 }, { "internalName": "WriteOffNmaAmount", "title": "Сумма к списанию: НМА", "type": "Number", "decimals": 2 }, { "internalName": "WriteOffTmcAmount", "title": "Сумма к списанию: ТМЦ", "type": "Number", "decimals": 2 } ]