куча правок

This commit is contained in:
gorbenko.pavel
2026-08-07 11:06:15 +05:00
parent 9d9f390548
commit 7ef4f53a6a
16 changed files with 1417 additions and 13 deletions
@@ -0,0 +1,92 @@
// Домен вкладки «Редактирование заявок»: живёт целиком в SharePoint-списках
// «<форма> — данные» / «<форма> — согласование», которыми управляет
// request-portal (см. request_type.list_id/site_url — ссылки именно на список
// данных; список согласования вычисляется по конвенции имени, см. approvalListTitle
// в requestManageService.ts). Это НЕ сущности Tnsu.ApprovalRoute.Api — совпадений
// с models/templateRoutes.ts нет, здесь другое хранилище.
//
// Значения статусов — Choice-колонки SharePoint, 1:1 с
// request-portal/src/webparts/requestPortal/shared/approval/models/statuses.ts
// (тот же самый список, то же самое хранилище — просто другой клиент).
export const REQUEST_STATUS = {
draft: 'Черновик',
onApproval: 'На согласовании',
queued: 'Ждёт очереди',
onExecution: 'На исполнении',
executed: 'Выполнено',
approved: 'Согласовано',
rejected: 'Отклонено',
returned: 'Возвращена на доработку',
execution: 'Выполнение',
closed: 'Закрыта'
} as const;
export const APPROVAL_PHASE = {
approval: 'Согласование',
execution: 'Исполнение'
} as const;
// Строка маршрута в одном из этих статусов ЕЩЁ НЕ решена согласующим/исполнителем
// ОКОНЧАТЕЛЬНО — её можно менять (переназначить человека, удалить, переставить,
// добавить новую рядом). «Возвращена на доработку» сюда включена нарочно: это не
// финальное решение (заявка вернётся на новый круг после доработки), поэтому
// согласующего на этом шаге всё ещё можно переназначить. approved/executed/
// rejected — финальные решения, трогать нельзя ни при каких условиях.
const EDITABLE_ROW_STATUSES: string[] = [
REQUEST_STATUS.draft,
REQUEST_STATUS.queued,
REQUEST_STATUS.onApproval,
REQUEST_STATUS.onExecution,
REQUEST_STATUS.returned
];
export function isEditableRowStatus(status: string): boolean {
return EDITABLE_ROW_STATUSES.indexOf(status) !== -1;
}
// Заявка в этом статусе прошла полностью (все фазы завершены) — маршрут можно
// только посмотреть, редактирование выключается целиком независимо от статусов
// отдельных строк.
export function isFullyClosedRequestStatus(status: string): boolean {
return status === REQUEST_STATUS.closed;
}
export interface ManagedRequestSummary {
id: number;
title: string;
status: string;
created: string; // ISO
authorName: string;
}
export interface ManagedRequestPage {
items: ManagedRequestSummary[];
hasMore: boolean;
}
// Строка списка «… — согласование». approverId/approverEmail нужны и для
// отображения, и как исходное значение при открытии формы переназначения.
export interface ManagedApprovalRow {
id: number;
ticketId: number;
approverId: number | null;
approverName: string;
approverEmail: string;
position: string;
status: string;
date: string;
comment: string;
order: number;
allowReassign: boolean;
phase: string;
}
export interface ManagedRequestMatrix {
request: ManagedRequestSummary;
/** Абсолютный URL сайта, где лежат списки данных/согласования этого типа заявки. */
siteUrl: string;
/** Title списка «… — согласование» (вычислен из Title списка данных). */
approvalListTitle: string;
/** Обе фазы вместе, упорядочены по StepOrder. */
rows: ManagedApprovalRow[];
}