2 Commits

Author SHA1 Message Date
Тимур Городецкий efa3fdf65e feat: примечание о сроке уведомления в заявлении на увольнение
Tests / frontend-test (push) Successful in 1m24s
По аналогии с ежегодным отпуском вверху формы и просмотра увольнения —
плашка «Примечание» с текстом от кадров про срок уведомления по ст. 56
ТК РК. На печать не идёт.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-29 10:59:14 +05:00
Тимур Городецкий 16699ef2e2 refactor: LeaveNotice переименован в общий FormNotice
Плашка «Примечание» с правилами нужна не только заявлениям на отпуск —
следующей её получает увольнение. Имя LeaveNotice вводило бы в
заблуждение, поэтому компонент стал нейтральным FormNotice; поведение
не меняется.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-29 10:59:13 +05:00
13 changed files with 50 additions and 19 deletions
@@ -10,7 +10,8 @@ import {
RequestNumber,
SubmitActions,
getDraftDeleteHandler,
useRequestSubmit
useRequestSubmit,
FormNotice
} from '../../shared/ui';
import {
composeRemoveRowRule,
@@ -44,7 +45,16 @@ import {
dataListTitle,
dataListTitleForListId
} from '../../shared/listTitles';
import { FORM_ID, IFormData, EMPTY_DATA, SetField, IOrganizationRecord, primaryPosition } from './model';
import {
FORM_ID,
IFormData,
EMPTY_DATA,
SetField,
IOrganizationRecord,
primaryPosition,
NOTICE_TITLE,
NOTICE_ITEMS
} from './model';
import { saveDismissalRequest, dismissalApprovalService } from './submit';
import { loadDismissalRequest } from './load';
import { RequestSection } from './sections/RequestSection';
@@ -374,6 +384,8 @@ const DismissalForm: React.FC<IRequestFormProps> = ({
)}
{submit.error && <Alert variant="err">{submit.error}</Alert>}
<FormNotice title={NOTICE_TITLE} items={NOTICE_ITEMS} />
<FormModeProvider readOnly={readOnly}>
<RequestSection {...sectionProps} />
</FormModeProvider>
@@ -2,7 +2,7 @@ import * as React from 'react';
import { useState, useEffect, useMemo, useCallback } from 'react';
import type { WebPartContext } from '@microsoft/sp-webpart-base';
import styles from './DismissalView.module.scss';
import { Alert, FormCard, InitiatorLine, FormModeProvider, PrintButton } from '../../shared/ui';
import { Alert, FormCard, InitiatorLine, FormModeProvider, PrintButton, FormNotice } from '../../shared/ui';
import {
ApproverService,
DecisionPanel,
@@ -28,7 +28,7 @@ import {
dataListTitleForListId
} from '../../shared/listTitles';
import { parseRoute } from '../../shared/routing';
import { FORM_ID, IFormData, EMPTY_DATA, SetField } from './model';
import { FORM_ID, IFormData, EMPTY_DATA, SetField, NOTICE_TITLE, NOTICE_ITEMS } from './model';
import { loadDismissalRequest } from './load';
import { dismissalApprovalService, updateAssetsAcceptor } from './submit';
import { loadClearanceRequest } from '../Clearance/load';
@@ -285,6 +285,7 @@ const DismissalView: React.FC<IDismissalViewProps> = ({ context, itemId, formKey
}
headerRight={status ? <StatusBadge status={status} /> : undefined}
>
<FormNotice title={NOTICE_TITLE} items={NOTICE_ITEMS} />
<FormModeProvider readOnly>
<RequestSection {...sectionProps} />
</FormModeProvider>
@@ -61,6 +61,8 @@ RequestTypeId» в `docs/forms.md`). Тип заведён в админке app
- **Комментарий** (`Comment`) — необязательный свободный текст. Причины увольнения
отдельного поля нет: в шаблоне формулировка фиксированная («по собственному желанию»).
- **Заголовок элемента** (`Title`): `Заявление на увольнение — {ФИО} — дд.мм.гггг`.
- **Примечание** (с 10-29, `FormNotice`, тексты `NOTICE_TITLE`/`NOTICE_ITEMS` в `model.ts`) — плашка
вверху формы и просмотра про срок уведомления по ст. 56 ТК РК. Текст от HR, дословно; на печать не идёт.
## Совместители: организации таблицей, удаление синхронизировано с маршрутом
Сотрудник может числиться сразу в НЕСКОЛЬКИХ компаниях (совместительство).
@@ -149,3 +149,18 @@ export const EMPTY_DATA: IFormData = {
export const EMPLOYEE_PLACEHOLDER = 'Начните вводить Ф.И.О. сотрудника…';
/** Заявление нужно подавать не позднее чем за столько месяцев до последнего рабочего дня. */
export const MIN_NOTICE_MONTHS = 1;
/**
* Примечание вверху формы и просмотра (см. shared/ui/FormNotice). Текст — от HR,
* дословно. «Не менее чем за один месяц» — это MIN_NOTICE_MONTHS: поменяли срок —
* поправьте и текст.
*/
export const NOTICE_TITLE = 'Примечание';
export const NOTICE_ITEMS: string[] = [
'Срок уведомления. Согласно п. 1 ст. 56 Трудового кодекса РК, работник вправе по своей инициативе ' +
'расторгнуть трудовой договор, уведомив работодателя письменно не менее чем за один месяц, за исключением ' +
'случаев, предусмотренных п. 3 этой статьи. Если трудовым договором установлен более длительный срок ' +
'уведомления, применяется срок из трудового договора.',
'Увольнение до истечения срока уведомления. Дата увольнения раньше чем через месяц с даты подачи заявления ' +
'возможна только по согласованию с работодателем, либо в случаях, предусмотренных п. 3 ст. 56 ТК РК.'
];
@@ -13,7 +13,7 @@ import {
SubmitActions,
getDraftDeleteHandler,
useRequestSubmit,
LeaveNotice
FormNotice
} from '../../shared/ui';
import {
composeRemoveRowRule,
@@ -335,7 +335,7 @@ const UnpaidLeaveForm: React.FC<IRequestFormProps> = ({
)}
{submit.error && <Alert variant="err">{submit.error}</Alert>}
<LeaveNotice title={NOTICE_TITLE} items={NOTICE_ITEMS} />
<FormNotice title={NOTICE_TITLE} items={NOTICE_ITEMS} />
<FormModeProvider readOnly={readOnly}>
<RequestSection {...sectionProps} />
@@ -9,7 +9,7 @@ import {
FormModeProvider,
PrintSplitButton,
OrgLetterhead,
LeaveNotice,
FormNotice,
PrintSignature
} from '../../shared/ui';
import {
@@ -170,7 +170,7 @@ const UnpaidLeaveView: React.FC<IUnpaidLeaveViewProps> = ({ context, itemId, for
</div>
}
>
<LeaveNotice title={NOTICE_TITLE} items={NOTICE_ITEMS} />
<FormNotice title={NOTICE_TITLE} items={NOTICE_ITEMS} />
<FormModeProvider readOnly>
<RequestSection {...sectionProps} />
</FormModeProvider>
@@ -95,7 +95,7 @@ export const SUBSTITUTE_PLACEHOLDER = 'Начните вводить Ф.И.О.
*/
export const MIN_NOTICE_DAYS = 14;
/** Памятка вверху формы и просмотра (см. shared/ui/LeaveNotice). Текст — по просьбе HR. */
/** Памятка вверху формы и просмотра (см. shared/ui/FormNotice). Текст — по просьбе HR. */
export const NOTICE_TITLE = 'Памятка';
export const NOTICE_ITEMS: string[] = [
'После согласования заявления его необходимо распечатать с портала (кнопка «Печать» на странице заявки), ' +
@@ -13,7 +13,7 @@ import {
SubmitActions,
getDraftDeleteHandler,
useRequestSubmit,
LeaveNotice
FormNotice
} from '../../shared/ui';
import {
composeRemoveRowRule,
@@ -354,7 +354,7 @@ const VacationForm: React.FC<IRequestFormProps> = ({
)}
{submit.error && <Alert variant="err">{submit.error}</Alert>}
<LeaveNotice title={NOTICE_TITLE} items={NOTICE_ITEMS} />
<FormNotice title={NOTICE_TITLE} items={NOTICE_ITEMS} />
<FormModeProvider readOnly={readOnly}>
<RequestSection {...sectionProps} />
@@ -10,7 +10,7 @@ import {
FormModeProvider,
PrintSplitButton,
OrgLetterhead,
LeaveNotice,
FormNotice,
PrintSignature
} from '../../shared/ui';
import {
@@ -229,7 +229,7 @@ const VacationView: React.FC<IVacationViewProps> = ({ context, itemId, formKey,
</div>
}
>
<LeaveNotice title={NOTICE_TITLE} items={NOTICE_ITEMS} />
<FormNotice title={NOTICE_TITLE} items={NOTICE_ITEMS} />
<FormModeProvider readOnly>
<RequestSection {...sectionProps} />
</FormModeProvider>
@@ -87,7 +87,7 @@ export const MIN_NOTICE_DAYS = 7;
export const MAX_DAYS = 24;
/**
* Примечание вверху формы и просмотра (см. shared/ui/LeaveNotice). Текст — от HR,
* Примечание вверху формы и просмотра (см. shared/ui/FormNotice). Текст — от HR,
* дословно. «Одну календарную неделю» — это MIN_NOTICE_DAYS: поменяли срок — поправьте и текст.
* Правило про часть не менее 14 дней только показываем, а не проверяем: форма не знает,
* брал ли сотрудник уже часть отпуска.
@@ -1,6 +1,6 @@
import * as React from 'react';
import { Alert } from '@tnsu/ui-kit';
import styles from './LeaveNotice.module.scss';
import styles from './FormNotice.module.scss';
interface Props {
/** Заголовок плашки, например «Примечание» или «Памятка». */
@@ -10,12 +10,13 @@ interface Props {
}
/**
* Плашка с правилами для заявлений на отпуск (трудовой и без содержания).
* Тексты у форм разные, поэтому приходят из model.ts каждой формы.
* Плашка с правилами вверху формы и её просмотра — «Примечание», «Памятка»
* (отпуск, отпуск без содержания, увольнение). Тексты у форм разные — от
* кадров, дословно, — поэтому приходят из model.ts каждой формы.
* Вариант warn, а не info: нейтральная плашка терялась на фоне формы.
* На печать не выводится — это подсказка для сотрудника, а не часть заявления.
*/
export const LeaveNotice: React.FC<Props> = ({ title, items }) => {
export const FormNotice: React.FC<Props> = ({ title, items }) => {
if (items.length === 0) return null;
return (
@@ -60,6 +60,6 @@ export { issueLabels } from './FieldIssues/fieldIssues';
export { getDraftDeleteHandler } from './SubmitActions/getDraftDeleteHandler';
export { InitiatorLine } from './InitiatorLine/InitiatorLine';
export type { IInitiatorLineProps } from './InitiatorLine/InitiatorLine';
export { LeaveNotice } from './LeaveNotice/LeaveNotice';
export { FormNotice } from './FormNotice/FormNotice';
export { useRequestSubmit } from './useRequestSubmit';
export type { IRequestSubmit, SubmitKind } from './useRequestSubmit';