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

#4271 - Test to rename Overwritten status to Edited #4351

Draft
wants to merge 10 commits into
base: main
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -161,14 +161,14 @@ describe("ApplicationExceptionAESTController(e2e)-approveException", () => {
});
});

it(`Should not be able to approve application exception when the application has ${ApplicationStatus.Overwritten} and exception is in ${ApplicationExceptionStatus.Pending} status.`, async () => {
it(`Should not be able to approve application exception when the application has ${ApplicationStatus.Edited} and exception is in ${ApplicationExceptionStatus.Pending} status.`, async () => {
// Arrange
const application = await saveFakeApplicationWithApplicationException(
appDataSource,
undefined,
{ applicationExceptionStatus: ApplicationExceptionStatus.Pending },
);
application.applicationStatus = ApplicationStatus.Overwritten;
application.applicationStatus = ApplicationStatus.Edited;
await db.application.save(application);
const updateApplicationException = {
exceptionStatus: ApplicationExceptionStatus.Approved,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ describe("ApplicationExceptionAESTController(e2e)-getPendingApplicationException
application5Promise,
]);

application5.applicationStatus = ApplicationStatus.Overwritten;
application5.applicationStatus = ApplicationStatus.Edited;
await db.application.save(application5);

const endpoint =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ describe("ApplicationOfferingChangeRequestStudentsController(e2e)-updateApplicat
{
student,
},
{ applicationStatus: ApplicationStatus.Overwritten },
{ applicationStatus: ApplicationStatus.Edited },
);
const applicationOfferingChangeRequest =
await saveFakeApplicationOfferingRequestChange(db, {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,12 +116,12 @@ describe("ApplicationAESTController(e2e)-getApplicationDetails", () => {
});

it(
"Should get the student application details when the application status is overwritten and " +
"Should get the student application details when the application status is edited and " +
"the optional query parameter to load dynamic data is not passed.",
async () => {
// Arrange
const application = await saveFakeApplication(db.dataSource, undefined, {
applicationStatus: ApplicationStatus.Overwritten,
applicationStatus: ApplicationStatus.Edited,
});

await db.application.save(application);
Expand Down Expand Up @@ -161,7 +161,7 @@ describe("ApplicationAESTController(e2e)-getApplicationDetails", () => {
db.dataSource,
{},
{
applicationStatus: ApplicationStatus.Overwritten,
applicationStatus: ApplicationStatus.Edited,
applicationData: {
studystartDate: "2000-01-01",
studyendDate: "2000-01-31",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ describe("ApplicationAESTController(e2e)-getApplicationVersionHistory", () => {
db = createE2EDataSources(dataSource);
});

it("Should get an array of application versions when there is an overwritten application associated with the given application.", async () => {
it("Should get an array of application versions when there is an edited application associated with the given application.", async () => {
// Arrange
const application = await saveFakeApplication(db.dataSource, undefined, {
submittedDate: new Date(),
});

const overwrittenApplication = await saveFakeApplication(
const editedApplication = await saveFakeApplication(
db.dataSource,
{
institution:
Expand All @@ -44,7 +44,7 @@ describe("ApplicationAESTController(e2e)-getApplicationVersionHistory", () => {
programYear: application.programYear,
},
{
applicationStatus: ApplicationStatus.Overwritten,
applicationStatus: ApplicationStatus.Edited,
applicationNumber: application.applicationNumber,
offeringIntensity:
application.currentAssessment.offering.offeringIntensity,
Expand All @@ -63,8 +63,8 @@ describe("ApplicationAESTController(e2e)-getApplicationVersionHistory", () => {
.expect({
previousVersions: [
{
id: overwrittenApplication.id,
submittedDate: overwrittenApplication.submittedDate.toISOString(),
id: editedApplication.id,
submittedDate: editedApplication.submittedDate.toISOString(),
},
],
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,15 +154,15 @@ describe("ApplicationInstitutionsController(e2e)-getApplicationDetails", () => {
});
});

it("Should not get the student application details when the application status is overwritten.", async () => {
it("Should not get the student application details when the application status is edited.", async () => {
// Arrange
const savedApplication = await saveFakeApplication(
appDataSource,
{
institutionLocation: collegeFLocation,
},
{
applicationStatus: ApplicationStatus.Overwritten,
applicationStatus: ApplicationStatus.Edited,
},
);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import {
Body,
Controller,
DefaultValuePipe,
Get,
NotFoundException,
Param,
ParseBoolPipe,
ParseIntPipe,
Patch,
Post,
Query,
UnprocessableEntityException,
Expand All @@ -21,6 +23,7 @@ import {
InProgressApplicationDetailsAPIOutDTO,
ApplicationOverallDetailsAPIOutDTO,
ApplicationFormData,
AssessApplicationChangeRequestAPIInDTO,
} from "./models/application.dto";
import {
AllowAuthorizedParty,
Expand All @@ -46,7 +49,7 @@ import {
INVALID_OPERATION_IN_THE_CURRENT_STATUS,
} from "@sims/services/constants";
import { IUserToken, Role } from "../../auth";
import { ApplicationStatus } from "@sims/sims-db";
import { ApplicationEditStatus, ApplicationStatus } from "@sims/sims-db";

@AllowAuthorizedParty(AuthorizedParties.aest)
@Groups(UserGroups.AESTUser)
Expand Down Expand Up @@ -76,7 +79,7 @@ export class ApplicationAESTController extends BaseController {
): Promise<ApplicationSupplementalDataAPIOutDTO> {
const application = await this.applicationService.getApplicationById(
applicationId,
{ loadDynamicData, allowOverwritten: true },
{ loadDynamicData, allowEdited: true },
);
if (!application) {
throw new NotFoundException(
Expand Down Expand Up @@ -282,4 +285,29 @@ export class ApplicationAESTController extends BaseController {
})),
};
}

@Patch(":applicationId/change-request-approval")
async assessApplicationChangeRequest(
@Param("applicationId", ParseIntPipe) applicationId: number,
@Body() payload: AssessApplicationChangeRequestAPIInDTO,
@UserToken() userToken: IUserToken,
): Promise<void> {
try {
await this.applicationService.assessApplicationChangeRequest(
applicationId,
payload.editStatus,
userToken.userId,
);
} catch (error: unknown) {
if (error instanceof CustomNamedError) {
switch (error.name) {
case APPLICATION_NOT_FOUND:
throw new NotFoundException(error.message);
case INVALID_OPERATION_IN_THE_CURRENT_STATUS:
throw new UnprocessableEntityException(error.message);
}
}
throw error;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,7 @@ export class ApplicationControllerService {
data: application.data,
id: application.id,
applicationStatus: application.applicationStatus,
applicationEditStatus: application.applicationEditStatus,
applicationNumber: application.applicationNumber,
applicationFormName: application.programYear.formName,
applicationProgramYearID: application.programYear.id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,61 @@ export class ApplicationStudentsController extends BaseController {
};
}

@CheckSinValidation()
@Patch(":applicationId/submit-change-request")
@ApiBadRequestResponse({
description:
"Not able to start a changed request due to an invalid request.",
})
@ApiNotFoundResponse({ description: "Application not found." })
@ApiForbiddenResponse({
description: "You have a restriction on your account.",
})
async submitApplicationChangeRequest(
@Body() payload: SaveApplicationAPIInDTO,
@Param("applicationId", ParseIntPipe) applicationId: number,
@UserToken() studentToken: StudentUserToken,
): Promise<void> {
const programYear = await this.programYearService.getActiveProgramYear(
payload.programYearId,
);
if (!programYear) {
throw new UnprocessableEntityException(
"Program Year is not active. Not able to create an application invalid request.",
);
}
// Execute form.io validation.
const submissionResult =
await this.formService.dryRunSubmission<ApplicationData>(
programYear.formName,
payload.data,
);
if (!submissionResult.valid) {
throw new BadRequestException(
"Not able to start a changed request due to an invalid request.",
);
}
try {
await this.applicationService.submitApplicationChangeRequest(
applicationId,
studentToken.userId,
studentToken.studentId,
submissionResult.data.data,
payload.associatedFiles,
);
} catch (error) {
switch (error.name) {
case APPLICATION_NOT_VALID:
case INVALID_OPERATION_IN_THE_CURRENT_STATUS:
default:
// TODO: add logger.
throw new InternalServerErrorException(
"Unexpected error while submitting the application.",
);
}
}
}

/**
* Submit an existing student application changing the status
* to submitted and triggering the necessary processes.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import { IntersectionType } from "@nestjs/swagger";
import { IsObject, IsOptional, IsPositive, Length } from "class-validator";
import {
IsIn,
IsObject,
IsOptional,
IsPositive,
Length,
} from "class-validator";
import {
ApplicationExceptionStatus,
ApplicationStatus,
Expand All @@ -15,6 +21,7 @@ import {
StudentScholasticStandingChangeType,
ApplicationOfferingChangeRequestStatus,
StudentAssessmentStatus,
ApplicationEditStatus,
} from "@sims/sims-db";
import { JsonMaxSize } from "../../../utilities/class-validation";
import { JSON_20KB } from "../../../constants";
Expand Down Expand Up @@ -123,6 +130,7 @@ export class ApplicationDataChangeAPIOutDTO {

export class ApplicationSupplementalDataAPIOutDTO extends ApplicationBaseAPIOutDTO {
studentFullName: string;
applicationEditStatus: ApplicationEditStatus;
applicationOfferingIntensity?: OfferingIntensity;
applicationStartDate?: string;
applicationEndDate?: string;
Expand Down Expand Up @@ -229,3 +237,13 @@ export class ApplicationVersionAPIOutDTO {
export class ApplicationOverallDetailsAPIOutDTO {
previousVersions: ApplicationVersionAPIOutDTO[];
}

export class AssessApplicationChangeRequestAPIInDTO {
@IsIn([
ApplicationEditStatus.EditDeclined,
ApplicationEditStatus.EditedWithApproval,
])
editStatus:
| ApplicationEditStatus.EditDeclined
| ApplicationEditStatus.EditedWithApproval;
}
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ describe("AssessmentAESTController(e2e)-manualReassessment", () => {

const unprocessableApplicationStatuses = [
ApplicationStatus.Cancelled,
ApplicationStatus.Overwritten,
ApplicationStatus.Edited,
ApplicationStatus.Draft,
];
for (const unprocessableApplicationStatus of unprocessableApplicationStatuses) {
Expand All @@ -166,7 +166,7 @@ describe("AssessmentAESTController(e2e)-manualReassessment", () => {
.expect(HttpStatus.UNPROCESSABLE_ENTITY)
.expect({
statusCode: HttpStatus.UNPROCESSABLE_ENTITY,
message: `Application cannot have manual reassessment in any of the statuses: ${ApplicationStatus.Cancelled}, ${ApplicationStatus.Overwritten} or ${ApplicationStatus.Draft}.`,
message: `Application cannot have manual reassessment in any of the statuses: ${ApplicationStatus.Cancelled}, ${ApplicationStatus.Edited} or ${ApplicationStatus.Draft}.`,
error: "Unprocessable Entity",
});
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ export class AssessmentAESTController extends BaseController {

/**
* Triggers manual reassessment for an application.
* Application cannot be archived or in any of the statuses 'Cancelled', 'Overwritten' or 'Draft' and original assessment must be in completed status.
* Application cannot be archived or in any of the statuses 'Cancelled', 'Edited' or 'Draft' and original assessment must be in completed status.
* @param payload request payload.
* @param applicationId application id.
* @returns id of the assessment created.
Expand All @@ -142,7 +142,7 @@ export class AssessmentAESTController extends BaseController {
description:
`Application original assessment expected to be '${StudentAssessmentStatus.Completed}' to allow manual reassessment or ` +
"application cannot have manual reassessment after being archived or " +
`application cannot have manual reassessment in any of the statuses: ${ApplicationStatus.Cancelled}, ${ApplicationStatus.Overwritten} or ${ApplicationStatus.Draft}.`,
`application cannot have manual reassessment in any of the statuses: ${ApplicationStatus.Cancelled}, ${ApplicationStatus.Edited} or ${ApplicationStatus.Draft}.`,
})
async manualReassessment(
@Body() payload: ManualReassessmentAPIInDTO,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ export class ApplicationExceptionService extends RecordDataModelService<Applicat
.innerJoin("student.user", "user")
.where("exception.id = :exceptionId", { exceptionId })
.andWhere("application.applicationStatus != :applicationStatus", {
applicationStatus: ApplicationStatus.Overwritten,
applicationStatus: ApplicationStatus.Edited,
})
.getOne();

Expand Down Expand Up @@ -245,7 +245,7 @@ export class ApplicationExceptionService extends RecordDataModelService<Applicat
exceptionStatus: ApplicationExceptionStatus.Pending,
})
.andWhere("application.applicationStatus != :applicationStatus", {
applicationStatus: ApplicationStatus.Overwritten,
applicationStatus: ApplicationStatus.Edited,
});

if (paginationOptions.searchCriteria) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ export class ApplicationRestrictionBypassService {
/**
* Checks if the application is in a valid state for bypass creation.
* Throws an error if the application is in a Draft, Cancelled,
* or Overwritten state.
* or Edited state.
* @param applicationId id of the application to check.
*/
private async checkForApplicationInValidState(
Expand All @@ -314,7 +314,7 @@ export class ApplicationRestrictionBypassService {
[
ApplicationStatus.Draft,
ApplicationStatus.Cancelled,
ApplicationStatus.Overwritten,
ApplicationStatus.Edited,
].includes(application.applicationStatus)
) {
throw new CustomNamedError(
Expand Down
Loading