feat: request portal — bespoke forms + approval mechanism

This commit is contained in:
Тимур Городецкий
2026-08-03 09:35:14 +05:00
commit bc91c9861d
110 changed files with 30562 additions and 0 deletions
@@ -0,0 +1,32 @@
// Типы внешнего approval-route API (api.tnsu.kz).
export type RouteType = 'None' | 'Parallel' | 'Sequential';
export type ApprovalStatus = 'None' | 'Approval' | 'Execution';
// GET /api/request-types → { data: IRequestType[] }
export interface IRequestType {
id: number;
name: string;
pageUrl: string;
}
// Обёртка ответа API (все ответы приходят в поле data).
export interface IApiResponse<T> {
data: T;
}
// GET /api/template-routes/resolve → data
export interface IResolvedRoute {
routeId: number;
routeType: RouteType;
requiresControl: boolean;
steps: IResolvedRouteStep[];
}
export interface IResolvedRouteStep {
id: number;
orderNo: number;
executorEmail: string | null;
position: string | null;
allowReassignToOtherApprovers: boolean;
}
@@ -0,0 +1,8 @@
// Строка согласования из списка «Согласование — <форма>».
export interface IApprovalRow {
id: number;
status: string;
approverId: number; // Id пользователя сайта в поле «Согласующий»
order: number; // колонка Order (очередь согласования)
allowReassign: boolean; // AllowReassignToOtherApprovers
}
@@ -0,0 +1,11 @@
// Строка матрицы согласования для отображения и редактирования на форме.
export interface IMatrixRow {
order: number; // порядок согласования (колонка Order)
who: string; // ФИО согласующего
email: string; // email (для записи новых строк; '' для загруженных из списка)
position: string; // должность/роль
status: string; // статус согласования или «—» для планируемой
date: string; // дата решения (дд.мм.гггг) или ''
comment: string;
allowReassign: boolean; // может ли этот согласующий добавить делеганта
}
@@ -0,0 +1,7 @@
// Пользователь сайта (результат поиска для пикера согласующего).
export interface ISiteUser {
id: number;
name: string;
email: string;
loginName: string; // claims-логин (для чтения должности из профиля)
}
@@ -0,0 +1,25 @@
// Значения Choice-колонки «Статус» — общий жизненный цикл заявки портала.
// Одинаков для контентного списка (заявка) и списка согласования (строки маршрута).
// В слое формы кодом ставятся Draft (черновик) и OnApproval (отправка на согласование);
// Approved/Rejected/Returned выставляются при решениях согласующих; Execution/Closed —
// зарезервированы под будущие этапы.
export const REQUEST_STATUS = {
draft: 'Черновик',
onApproval: 'На согласовании',
approved: 'Согласовано',
rejected: 'Отклонено',
returned: 'Возвращена на доработку',
execution: 'Выполнение',
closed: 'Закрыта',
} as const;
// Полный набор значений для Choice-колонки при провижининге.
export const REQUEST_STATUS_CHOICES: string[] = [
REQUEST_STATUS.draft,
REQUEST_STATUS.onApproval,
REQUEST_STATUS.approved,
REQUEST_STATUS.rejected,
REQUEST_STATUS.returned,
REQUEST_STATUS.execution,
REQUEST_STATUS.closed,
];