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,41 @@
import { WebPartContext } from '@microsoft/sp-webpart-base';
import { resolveRoute } from './approvalRoute.service';
import { ApprovalListService, IApproverToWrite } from './approvalList.service';
import { IMatrixRow } from './models/IMatrixRow';
// Планируемый маршрут для НОВОЙ заявки: resolve по email инициатора → строки матрицы.
// Имена согласующих подтягиваются по executorEmail (бэкенд отдаёт email + должность).
export async function getPlannedMatrix(
context: WebPartContext,
requestTypeId: number,
userEmail: string,
approval: ApprovalListService
): Promise<IMatrixRow[]> {
if (!userEmail) return [];
const route = await resolveRoute(context, requestTypeId, userEmail);
const ordered = route.steps.slice().sort((a, b) => a.orderNo - b.orderNo);
return Promise.all(
ordered.map(async (s) => ({
order: s.orderNo,
who: s.executorEmail ? await approval.resolveUserName(s.executorEmail) : '',
email: s.executorEmail || '',
position: s.position || '',
status: '—',
date: '',
comment: '',
allowReassign: s.allowReassignToOtherApprovers,
}))
);
}
// Записать строки согласующих для заявки с указанным статусом.
// Матрица перезаписывается целиком (для повторной отправки/черновика).
export async function writeApprovers(
approval: ApprovalListService,
requestId: number,
approvers: IApproverToWrite[],
status: string
): Promise<void> {
await approval.deleteForRequest(requestId);
await approval.createSteps(requestId, approvers, status);
}