Правки #16

Merged
gorbenko.pavel merged 27 commits from fired-request into main 2026-08-26 11:10:27 +00:00
5 changed files with 20 additions and 21 deletions
Showing only changes of commit 89fceaab1d - Show all commits
+1 -1
View File
@@ -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 }
]