Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/13
This commit was merged in pull request #13.
This commit is contained in:
@@ -5,7 +5,9 @@ import {
|
||||
EDITABLE_STATUSES,
|
||||
REQUEST_STATUS,
|
||||
REQUEST_STATUS_CHOICES,
|
||||
initialSubmitStatus,
|
||||
isEditableStatus,
|
||||
isSubmittedStatus,
|
||||
} from './statuses';
|
||||
|
||||
describe('isEditableStatus', () => {
|
||||
@@ -32,6 +34,43 @@ describe('isEditableStatus', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('initialSubmitStatus', () => {
|
||||
it('есть согласующие — заявка идёт на согласование', () => {
|
||||
expect(initialSubmitStatus(2, 0)).toBe(REQUEST_STATUS.onApproval);
|
||||
expect(initialSubmitStatus(2, 3)).toBe(REQUEST_STATUS.onApproval);
|
||||
});
|
||||
|
||||
it('согласующих нет, но есть исполнители — сразу в исполнение', () => {
|
||||
expect(initialSubmitStatus(0, 1)).toBe(REQUEST_STATUS.execution);
|
||||
});
|
||||
|
||||
it('маршрута нет вовсе — заявка сразу согласована', () => {
|
||||
expect(initialSubmitStatus(0, 0)).toBe(REQUEST_STATUS.approved);
|
||||
});
|
||||
});
|
||||
|
||||
// writeRoute по этому предикату решает, писать строки как «Ждёт очереди» и
|
||||
// активировать первую, или оставить как есть (черновик). Каждый статус, который
|
||||
// возвращает initialSubmitStatus, ОБЯЗАН считаться отправкой: иначе строки
|
||||
// маршрута получают недопустимый статус, а активации не происходит вовсе —
|
||||
// именно так заявка без согласующих перестала попадать в очередь исполнения.
|
||||
describe('isSubmittedStatus', () => {
|
||||
it('любой результат initialSubmitStatus считается отправкой', () => {
|
||||
[initialSubmitStatus(1, 0), initialSubmitStatus(0, 1), initialSubmitStatus(0, 0)].forEach((s) =>
|
||||
expect(isSubmittedStatus(s)).toBe(true)
|
||||
);
|
||||
});
|
||||
|
||||
it('черновик отправкой не считается', () => {
|
||||
expect(isSubmittedStatus(REQUEST_STATUS.draft)).toBe(false);
|
||||
});
|
||||
|
||||
it('возврат и отклонение отправкой не считаются (маршрут не переактивируется)', () => {
|
||||
expect(isSubmittedStatus(REQUEST_STATUS.returned)).toBe(false);
|
||||
expect(isSubmittedStatus(REQUEST_STATUS.rejected)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
// Наборы Choice-значений держатся в синхроне с provisioning.json списков —
|
||||
// расхождение ломает запись (SharePoint отвергает значение вне Choice).
|
||||
describe('наборы Choice-значений', () => {
|
||||
|
||||
@@ -43,6 +43,45 @@ export function isEditableStatus(status: string | undefined): boolean {
|
||||
return !status || EDITABLE_STATUSES.indexOf(status) !== -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Статус ЗАЯВКИ в момент ОТПРАВКИ — до записи строк маршрута (см. writeRoute),
|
||||
* когда реальных строк ещё нет и решать по ним, как computeRequestStatus в
|
||||
* approverDecision.service.ts, нельзя. Формы раньше писали «На согласовании»
|
||||
* безусловно; это неверно для маршрута без согласующих (только исполнение,
|
||||
* см. форму «Реферальная рекомендация») — там заявка должна сразу войти в
|
||||
* фазу исполнения, минуя несуществующую фазу согласования.
|
||||
*
|
||||
* Порядок фаз — тот же, что у computeRequestStatus (согласование → исполнение
|
||||
* → закрыта), только по КОЛИЧЕСТВУ шагов, а не по фактическим статусам строк
|
||||
* (при отправке все строки ещё «Ждёт очереди»/не существуют).
|
||||
*/
|
||||
export function initialSubmitStatus(approversCount: number, executorsCount: number): string {
|
||||
if (approversCount > 0) return REQUEST_STATUS.onApproval;
|
||||
if (executorsCount > 0) return REQUEST_STATUS.execution;
|
||||
return REQUEST_STATUS.approved;
|
||||
}
|
||||
|
||||
/**
|
||||
* Статус заявки означает «отправлена» (в отличие от черновика)?
|
||||
*
|
||||
* Нужен writeRoute: он по этому признаку решает, писать строки маршрута как
|
||||
* «Ждёт очереди» + активировать первую, или сохранить их «как есть» (черновик).
|
||||
* Раньше там стояло строгое `status === onApproval` — единственный статус,
|
||||
* которым формы отправляли заявку. С появлением initialSubmitStatus отправка
|
||||
* может дать «Выполнение» (маршрут без согласующих), и строгое сравнение молча
|
||||
* ломалось: строки получали ApprovalStatus «Выполнение» (недопустимое значение
|
||||
* для строки, см. APPROVAL_ROW_STATUS_CHOICES), а activateNextQueued не
|
||||
* вызывался — ни одна строка не становилась «На исполнении», и заявка не
|
||||
* попадала в очередь исполнителя.
|
||||
*/
|
||||
export function isSubmittedStatus(status: string): boolean {
|
||||
return (
|
||||
status === REQUEST_STATUS.onApproval ||
|
||||
status === REQUEST_STATUS.execution ||
|
||||
status === REQUEST_STATUS.approved
|
||||
);
|
||||
}
|
||||
|
||||
// Наборов значений ДВА, и они не совпадают — это разные сущности:
|
||||
//
|
||||
// 1) статус ЗАЯВКИ — колонка RequestStatus в списке «… — данные». Пишется
|
||||
|
||||
Reference in New Issue
Block a user