fix: убрать «Обучение» из сумм к списанию — дублировало TrainingAmount
Осталось 5 категорий (ОС, СИЗ, подотчётная сумма, НМА, ТМЦ). У обучения уже было отдельное поле TrainingAmount («Обучение: сумма», правит только КДП) — второе одноимённое поле с другим поведением (любой согласующий) только путало, даже с подписью группы над сеткой. WriteOffTrainingAmount убран из модели/load/submit/манифеста; ClearanceView и RequestSection код не трогали — они уже обходят WRITE_OFF_CATEGORIES обобщённо. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+1
-1
@@ -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` | Перемещение сотрудников | Отдел кадров | — | — | — | — | ⏳ заглушка (плитка есть, форма не сделана) |
|
||||
|
||||
|
||||
@@ -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`,
|
||||
|
||||
@@ -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)
|
||||
};
|
||||
|
||||
@@ -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: ''
|
||||
};
|
||||
|
||||
@@ -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 }
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user