feat: added status next in que and changed forms state machine
This commit is contained in:
@@ -8,13 +8,15 @@ import { IApprovalRow } from './models/IApprovalRow';
|
||||
import { ISiteUser } from './models/ISiteUser';
|
||||
import { emitRequestsChanged } from '../requestEvents';
|
||||
|
||||
export type ApproverDecision = 'approve' | 'return' | 'reject';
|
||||
// approve/return/reject — согласующий; execute — исполнитель отметил «Выполнено».
|
||||
export type ApproverDecision = 'approve' | 'return' | 'reject' | 'execute';
|
||||
|
||||
// Решение согласующего → статус его строки в списке согласования.
|
||||
// Решение → статус его строки в списке согласования.
|
||||
const ROW_STATUS: Record<ApproverDecision, string> = {
|
||||
approve: REQUEST_STATUS.approved,
|
||||
return: REQUEST_STATUS.returned,
|
||||
reject: REQUEST_STATUS.rejected,
|
||||
execute: REQUEST_STATUS.executed,
|
||||
};
|
||||
|
||||
// Действия согласующего: определение его строки, применение решения,
|
||||
@@ -34,7 +36,11 @@ export class ApproverService {
|
||||
public async getPendingRowForCurrentUser(requestId: number): Promise<IApprovalRow | undefined> {
|
||||
const rows = await this.approval.getForRequest(requestId);
|
||||
const userId = await this.approval.getCurrentUserId();
|
||||
const firstPending = rows.filter((r) => r.status === REQUEST_STATUS.onApproval)[0];
|
||||
// Активна первая незакрытая строка по очереди: согласующий («На согласовании»)
|
||||
// или, когда согласование пройдено, исполнитель («На исполнении»).
|
||||
const firstPending = rows.filter(
|
||||
(r) => r.status === REQUEST_STATUS.onApproval || r.status === REQUEST_STATUS.onExecution
|
||||
)[0];
|
||||
if (firstPending && firstPending.approverId === userId) return firstPending;
|
||||
return undefined;
|
||||
}
|
||||
@@ -53,12 +59,17 @@ export class ApproverService {
|
||||
const prevOrder = before.length > 0 ? before[before.length - 1].order : current.order - 1;
|
||||
const newOrder = (prevOrder + current.order) / 2;
|
||||
const position = await this.approval.getJobTitle(user.loginName);
|
||||
// Делегат наследует фазу той строки, вместо которой согласует (согласование/исполнение).
|
||||
// Делегат наследует фазу той строки, вместо которой действует, и её статус
|
||||
// ожидания (согласование → «На согласовании», исполнение → «На исполнении»).
|
||||
const pendingStatus =
|
||||
current.phase === APPROVAL_PHASE.execution
|
||||
? REQUEST_STATUS.onExecution
|
||||
: REQUEST_STATUS.onApproval;
|
||||
await this.approval.addApproverRow(
|
||||
requestId,
|
||||
{ email: user.email, position, allowReassign: false },
|
||||
newOrder,
|
||||
REQUEST_STATUS.onApproval,
|
||||
pendingStatus,
|
||||
current.phase
|
||||
);
|
||||
}
|
||||
@@ -72,6 +83,12 @@ export class ApproverService {
|
||||
comment: string
|
||||
): Promise<string> {
|
||||
await this.approval.setDecision(rowId, ROW_STATUS[decision], comment);
|
||||
// Положительное решение двигает очередь — активируем следующий ждущий шаг
|
||||
// (в т.ч. переход из согласования в исполнение). При возврате/отклонении
|
||||
// очередь не двигаем: заявка уходит на доработку.
|
||||
if (decision === 'approve' || decision === 'execute') {
|
||||
await this.approval.activateNextQueued(requestId);
|
||||
}
|
||||
const rows = await this.approval.getForRequest(requestId);
|
||||
const requestStatus = this.computeRequestStatus(rows);
|
||||
await this.updateRequestStatus(requestId, requestStatus);
|
||||
@@ -99,7 +116,7 @@ export class ApproverService {
|
||||
if (!approvalDone) return REQUEST_STATUS.onApproval;
|
||||
|
||||
if (execRows.length === 0) return REQUEST_STATUS.approved;
|
||||
if (execRows.every((r) => r.status === REQUEST_STATUS.approved)) return REQUEST_STATUS.closed;
|
||||
if (execRows.every((r) => r.status === REQUEST_STATUS.executed)) return REQUEST_STATUS.closed;
|
||||
return REQUEST_STATUS.execution;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user