feat: комментарий инициатора в заявке на отпуск
Необязательное поле «Комментарий» (VacationComment, Note) последним в секции: инициатор может пояснить заявку для согласующих. В просмотре пустой комментарий не показывается, в DOCX для ЭДО не идёт. Колонка уже провизионирована. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -28,6 +28,9 @@
|
||||
- **Даты окончания нет**: отпуск задаётся началом и количеством дней, чтобы не считать
|
||||
праздники и выходные. Колонка `EndDate` не используется: из провижининга, типа контента и представления она убрана (само системное поле SharePoint `FromBaseType` удалить нельзя).
|
||||
- **Заголовок элемента** (`Title`): `Отпуск — {ФИО} — дд.мм.гггг`.
|
||||
- **Комментарий** (с 10-28, `VacationComment`, Note) — необязательный, заполняет инициатор,
|
||||
последним полем секции; в просмотре пустой не показывается. В DOCX для ЭДО (`vacationDocument.ts`) не идёт; при печати
|
||||
просмотра виден, как остальные поля секции.
|
||||
|
||||
## Подписание в ЭДО
|
||||
> **Сейчас выключено** (`VACATION_EDO_SIGNING_ENABLED = false` в `shared/config.ts`): решение последнего
|
||||
@@ -71,7 +74,7 @@
|
||||
SLA на бэкенде approval-route этот код не вызывает — такое заявление на подпись не уйдёт.
|
||||
|
||||
## Секции формы
|
||||
RequestSection (сотрудник · должность · дата начала · количество дней)
|
||||
RequestSection (сотрудник · должность · дата начала · количество дней · замещающий · комментарий)
|
||||
|
||||
## Точки входа
|
||||
- rptype: `hr-vacation`
|
||||
|
||||
@@ -34,6 +34,7 @@ export async function loadVacationRequest(itemId: number, listId?: string): Prom
|
||||
'DepartmentId',
|
||||
'Project',
|
||||
'ProjectId',
|
||||
'VacationComment',
|
||||
'RequestStatus',
|
||||
'RequestUniqueCode',
|
||||
'Employee/Title',
|
||||
@@ -58,7 +59,8 @@ export async function loadVacationRequest(itemId: number, listId?: string): Prom
|
||||
Department: (item.Department as string) || '',
|
||||
DepartmentId: (item.DepartmentId as string) || '',
|
||||
Project: (item.Project as string) || '',
|
||||
ProjectId: (item.ProjectId as string) || ''
|
||||
ProjectId: (item.ProjectId as string) || '',
|
||||
VacationComment: (item.VacationComment as string) || ''
|
||||
};
|
||||
|
||||
return {
|
||||
|
||||
@@ -44,6 +44,8 @@ export interface IFormData {
|
||||
Project: string;
|
||||
/** oid проекта ('' — если введён вручную без выбора из списка). */
|
||||
ProjectId: string;
|
||||
/** Комментарий инициатора к заявке — необязательный, для согласующих. */
|
||||
VacationComment: string;
|
||||
}
|
||||
|
||||
/** Обновление одного поля формы с сохранением типа значения. */
|
||||
@@ -73,7 +75,8 @@ export const EMPTY_DATA: IFormData = {
|
||||
Department: '',
|
||||
DepartmentId: '',
|
||||
Project: '',
|
||||
ProjectId: ''
|
||||
ProjectId: '',
|
||||
VacationComment: ''
|
||||
};
|
||||
|
||||
/** Плейсхолдер для поля выбора сотрудника. */
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
{ "internalName": "Department", "title": "Подразделение", "type": "Text" },
|
||||
{ "internalName": "DepartmentId", "title": "Id подразделения (справочник)", "type": "Text" },
|
||||
{ "internalName": "Project", "title": "Проект", "type": "Text" },
|
||||
{ "internalName": "ProjectId", "title": "Id проекта (справочник)", "type": "Text" }
|
||||
{ "internalName": "ProjectId", "title": "Id проекта (справочник)", "type": "Text" },
|
||||
{ "internalName": "VacationComment", "title": "Комментарий", "type": "Note" }
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
import * as React from 'react';
|
||||
import { FormGrid, FormField, TextInput, PeopleField, OrganizationTable } from '../../../shared/ui';
|
||||
import { FormGrid, FormField, TextInput, TextArea, PeopleField, OrganizationTable, useFormReadOnly } from '../../../shared/ui';
|
||||
import { ProjectPicker } from '../../../shared/dictionary';
|
||||
import { ISectionProps, EMPLOYEE_PLACEHOLDER, SUBSTITUTE_PLACEHOLDER, MIN_NOTICE_DAYS, MAX_DAYS } from '../model';
|
||||
import { isoDatePlusDays } from '../../../shared/dateUtils';
|
||||
|
||||
/** Единственная секция формы «Заявка на отпуск»: сотрудник (должность и подразделение подтягиваются из справочника), даты. */
|
||||
export const RequestSection: React.FC<ISectionProps> = ({ data, set, context, onEmployeeChange, printOrgIndex }) => (
|
||||
export const RequestSection: React.FC<ISectionProps> = ({ data, set, context, onEmployeeChange, printOrgIndex }) => {
|
||||
const readOnly = useFormReadOnly();
|
||||
|
||||
return (
|
||||
<FormGrid>
|
||||
<FormField label="Сотрудник" htmlFor="Employee" required full>
|
||||
<PeopleField
|
||||
@@ -56,5 +59,17 @@ export const RequestSection: React.FC<ISectionProps> = ({ data, set, context, on
|
||||
placeholder={SUBSTITUTE_PLACEHOLDER}
|
||||
/>
|
||||
</FormField>
|
||||
{/* Пустой комментарий в просмотре не показываем — пустое поле только мешает читать. */}
|
||||
{(!readOnly || data.VacationComment.trim()) && (
|
||||
<FormField label="Комментарий" htmlFor="VacationComment" full>
|
||||
<TextArea
|
||||
id="VacationComment"
|
||||
value={data.VacationComment}
|
||||
onChange={(v) => set('VacationComment', v)}
|
||||
rows={3}
|
||||
/>
|
||||
</FormField>
|
||||
)}
|
||||
</FormGrid>
|
||||
);
|
||||
);
|
||||
};
|
||||
|
||||
@@ -43,7 +43,8 @@ function buildItem(
|
||||
Department: data.Department || null,
|
||||
DepartmentId: data.DepartmentId || null,
|
||||
Project: data.Project || null,
|
||||
ProjectId: data.ProjectId || null
|
||||
ProjectId: data.ProjectId || null,
|
||||
VacationComment: data.VacationComment.trim() || null
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user