Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UTOPIA-1308: (backend) add new status #1451

Merged
merged 10 commits into from
Aug 9, 2023
1 change: 1 addition & 0 deletions src/backend/src/common/enums/size.enum.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export enum SizeEnum {
AT_LEAST_ONE = 'AT_LEAST_ONE',
ALL_ACK = 'ALL_ACK',
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ export enum PiaIntakeStatusEnum {
MPO_REVIEW = 'MPO_REVIEW',
CPO_REVIEW = 'CPO_REVIEW',
FINAL_REVIEW = 'FINAL_REVIEW',
PENDING_COMPLETION = 'PENDING_COMPLETION',
COMPLETE = 'COMPLETE',
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ const validateSize = (
switch (size) {
case SizeEnum.AT_LEAST_ONE:
if (Array.isArray(value) && value.length > 0) return true; // validation ok
break;
case SizeEnum.ALL_ACK:
if (Array.isArray(value) && value.length > 0) {
return value.every((v) => v.isAcknowledged === true);
}
break;
}

errors?.push(`path: ${path} should have at-least one value`);
Expand Down
124 changes: 124 additions & 0 deletions src/backend/src/modules/pia-intake/metadata/pia-status.metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -283,8 +283,132 @@ export const piaStatusMetadata: Partial<
},
],
},
[PiaIntakeStatusEnum.PENDING_COMPLETION]: {
allow: true,
Bottle7 marked this conversation as resolved.
Show resolved Hide resolved
conditions: [
{
piaType: [PiaTypesEnum.DELEGATE_REVIEW],
fieldValidations: {
'review.mpo.reviewNote': {
required: true,
},
'review.programArea.reviews': {
required: true,
size: SizeEnum.ALL_ACK,
},
},
},
{
piaType: [PiaTypesEnum.STANDARD],
fieldValidations: {
'review.mpo.reviewNote': {
required: true,
},
'review.cpo': {
required: true,
},
'review.programArea.reviews': {
required: true,
size: SizeEnum.ALL_ACK,
},
},
},
],
},
},
},
[PiaIntakeStatusEnum.PENDING_COMPLETION]: {
updates: {
allow: false,
kushal-arora-fw marked this conversation as resolved.
Show resolved Hide resolved
},
transition: {
[PiaIntakeStatusEnum.INCOMPLETE]: {
allow: true,
conditions: [
{
accessType: [UserTypesEnum.CPO],
kushal-arora-fw marked this conversation as resolved.
Show resolved Hide resolved
},
],
Bottle7 marked this conversation as resolved.
Show resolved Hide resolved
actions: [
{
type: 'update',
key: 'review',
value: null,
},
],
},
[PiaIntakeStatusEnum.EDIT_IN_PROGRESS]: {
allow: true,
conditions: [
{
accessType: [UserTypesEnum.CPO],
},
],
Bottle7 marked this conversation as resolved.
Show resolved Hide resolved
actions: [
{
type: 'update',
key: 'review',
value: null,
},
],
},
[PiaIntakeStatusEnum.MPO_REVIEW]: {
allow: true,
conditions: [
{
accessType: [UserTypesEnum.CPO],
},
],
},
[PiaIntakeStatusEnum.CPO_REVIEW]: {
allow: true,
conditions: [
{
accessType: [UserTypesEnum.CPO],
},
],
},
[PiaIntakeStatusEnum.FINAL_REVIEW]: {
allow: true,
conditions: [
{
accessType: [UserTypesEnum.CPO],
},
],
},
[PiaIntakeStatusEnum.COMPLETE]: {
allow: true,
conditions: [
{
piaType: [PiaTypesEnum.DELEGATE_REVIEW],
accessType: [UserTypesEnum.CPO],
fieldValidations: {
'review.mpo.reviewNote': {
required: true,
},
'review.programArea.reviews': {
required: true,
size: SizeEnum.ALL_ACK,
},
},
},
{
piaType: [PiaTypesEnum.STANDARD],
accessType: [UserTypesEnum.CPO],
fieldValidations: {
'review.mpo.reviewNote': {
required: true,
},
'review.cpo': {
required: true,
},
'review.programArea.reviews': {
required: true,
size: SizeEnum.ALL_ACK,
},
},
},
],
},
},
},
Expand Down
226 changes: 226 additions & 0 deletions src/backend/test/unit/pia-intake/handle-pia-status-change.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -226,4 +226,230 @@ describe(`handlePiaStatusChange method`, () => {
expect(e).toBeInstanceOf(ForbiddenException);
}
});

it('succeeds to change status of a DELEGATE PIA if MPO changes status from FINAL_REVIEW to PENDING_COMPLETION', async () => {
const userType: Array<UserTypesEnum> = [UserTypesEnum.MPO];

const storedValue: PiaIntakeEntity = {
...piaIntakeEntityMock,
review: {
mpo: {
isAcknowledged: true,
reviewNote: 'ABCD',
},
programArea: {
selectedRoles: ['Director'],
reviews: {
Director: {
isAcknowledged: true,
reviewNote: 'ABCD2',
},
},
},
},
saveId: 10,
status: PiaIntakeStatusEnum.FINAL_REVIEW,
};

const updatedValue: UpdatePiaIntakeDto = {
status: PiaIntakeStatusEnum.PENDING_COMPLETION,
saveId: 10,
review: {
mpo: {
isAcknowledged: true,
reviewNote: 'ABCD2',
},
programArea: {
selectedRoles: ['Director'],
reviews: {
Director: {
isAcknowledged: true,
reviewNote: 'ABCD2',
},
},
},
},
};

handlePiaStatusChange(
updatedValue,
storedValue,
userType,
PiaTypesEnum.DELEGATE_REVIEW,
);

expect(updatedValue.review).not.toBe(null);
});

it('succeeds to change status of a STANDARD PIA if CPO changes status from FINAL_REVIEW to PENDING_COMPLETION with a CPO review', async () => {
const userType: Array<UserTypesEnum> = [UserTypesEnum.CPO];

const storedValue: PiaIntakeEntity = {
...piaIntakeEntityMock,
review: {
mpo: {
isAcknowledged: true,
reviewNote: 'ABCD',
},
programArea: {
selectedRoles: ['Director'],
reviews: {
Director: {
isAcknowledged: true,
reviewNote: 'ABCD2',
},
},
},
},
saveId: 10,
status: PiaIntakeStatusEnum.FINAL_REVIEW,
};

const updatedValue: UpdatePiaIntakeDto = {
status: PiaIntakeStatusEnum.PENDING_COMPLETION,
saveId: 10,
review: {
mpo: {
isAcknowledged: true,
reviewNote: 'ABCD2',
},
programArea: {
selectedRoles: ['Director'],
reviews: {
Director: {
isAcknowledged: true,
reviewNote: 'ABCD2',
},
},
},
cpo: {
1234: {
isAcknowledged: true,
reviewNote: 'ABCD2',
},
},
},
};

handlePiaStatusChange(
updatedValue,
storedValue,
userType,
PiaTypesEnum.STANDARD,
);

expect(updatedValue.review.cpo).not.toBe(null);
});

it('DOES NOT succeed to change status of a STANDARD PIA if CPO changes status from FINAL_REVIEW to PENDING_COMPLETION without a CPO review', async () => {
const userType: Array<UserTypesEnum> = [UserTypesEnum.CPO];

const storedValue: PiaIntakeEntity = {
...piaIntakeEntityMock,
review: {
mpo: {
isAcknowledged: true,
reviewNote: 'ABCD',
},
programArea: {
selectedRoles: ['Director'],
reviews: {
Director: {
isAcknowledged: true,
reviewNote: 'ABCD2',
},
},
},
},
saveId: 10,
status: PiaIntakeStatusEnum.FINAL_REVIEW,
};

const updatedValue: UpdatePiaIntakeDto = {
status: PiaIntakeStatusEnum.PENDING_COMPLETION,
saveId: 10,
review: {
mpo: {
isAcknowledged: true,
reviewNote: 'ABCD2',
},
programArea: {
selectedRoles: ['Director'],
reviews: {
Director: {
isAcknowledged: true,
reviewNote: 'ABCD2',
},
},
},
},
};

try {
handlePiaStatusChange(
updatedValue,
storedValue,
userType,
PiaTypesEnum.STANDARD,
);
} catch (e) {
expect(e).toBeInstanceOf(ForbiddenException);
}
});

it('DOES NOT succeed to change status of a DELEGATED PIA if MPO changes status from FINAL_REVIEW to PENDING_COMPLETION without Program Area reviews', async () => {
const userType: Array<UserTypesEnum> = [UserTypesEnum.CPO];

const storedValue: PiaIntakeEntity = {
...piaIntakeEntityMock,
review: {
mpo: {
isAcknowledged: true,
reviewNote: 'ABCD',
},
programArea: {
selectedRoles: ['Director'],
reviews: {
Director: {
isAcknowledged: true,
reviewNote: 'ABCD2',
},
},
},
},
saveId: 10,
status: PiaIntakeStatusEnum.FINAL_REVIEW,
};

const updatedValue: UpdatePiaIntakeDto = {
status: PiaIntakeStatusEnum.PENDING_COMPLETION,
saveId: 10,
review: {
mpo: {
isAcknowledged: true,
reviewNote: 'ABCD2',
},
programArea: {
selectedRoles: ['Director'],
reviews: {
Director: {
isAcknowledged: true,
reviewNote: 'ABCD2',
},
},
},
},
};

try {
handlePiaStatusChange(
updatedValue,
storedValue,
userType,
PiaTypesEnum.STANDARD,
);
} catch (e) {
expect(e).toBeInstanceOf(ForbiddenException);
}
});
});
Loading
Loading