Skip to content

Commit 05cfdb8

Browse files
authored
Merge pull request #370 from icefoganalytics/test
WUP and Students
2 parents 7ab77e6 + af9e3eb commit 05cfdb8

32 files changed

+3503
-116
lines changed

src/api/routes/admin/application-router.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import knex from "knex";
55
import { DocumentService, DocumentStatus, DocumentationService } from "../../services/shared";
66
import { ReturnValidationErrors } from "../../middleware";
77
import { DB_CONFIG } from "../../config";
8-
import { uniq, parseInt, min, get, isArray, isEmpty, orderBy, sortBy } from "lodash";
8+
import { uniq, parseInt, min, get, isArray, isEmpty, orderBy, sortBy, isString } from "lodash";
99
import { AssessmentYukonGrant, AssessmentYEA } from "../../repositories/assessment";
1010
import { weeksBetween } from "@/utils/date-utils";
1111

@@ -335,6 +335,8 @@ applicationRouter.get("/:id", [param("id").notEmpty()], ReturnValidationErrors,
335335
if (dep.received_date) dep.received_date = moment(dep.received_date).add(7, "hours").format("YYYY-MM-DD");
336336

337337
if (dep.status_date) dep.status_date = moment(dep.status_date).add(7, "hours").format("YYYY-MM-DD");
338+
339+
dep.json_data = JSON.parse(dep.json_data);
338340
}
339341
if (student) {
340342
student.consents = await db("sfa.student_consent")
@@ -509,6 +511,7 @@ applicationRouter.post(
509511
status_reason_id = null,
510512
status_date = null,
511513
comments = null,
514+
json_data = null,
512515
} = req.body;
513516

514517
try {
@@ -534,7 +537,7 @@ applicationRouter.post(
534537
}
535538

536539
// make sure request type is active
537-
const checkIsActive = await db("sfa.request_type").where("id", request_type_id).first();
540+
const checkIsActive = await db("sfa.request_type").where({ id: request_type_id }).first();
538541

539542
if (checkIsActive?.is_active) {
540543
if (newRecord.request_type_id === 1 || newRecord.request_type_id === 46) {
@@ -560,13 +563,14 @@ applicationRouter.post(
560563
is_csg_only: false,
561564
application_id,
562565
status_id: 2,
566+
json_data: isString(json_data) ? json_data : JSON.stringify(json_data),
563567
});
564568

565569
return resInsert
566570
? res.json({ messages: [{ variant: "success", text: "Saved" }] })
567571
: res.json({ messages: [{ variant: "error", text: "Failed" }] });
568572
} else {
569-
res.json({ messages: [{ variant: "error", text: "Request Type is not active" }] });
573+
return res.json({ messages: [{ variant: "error", text: "Request Type is not active" }] });
570574
}
571575
}
572576

@@ -870,6 +874,9 @@ applicationRouter.put(
870874
data.status_date = new Date();
871875
}
872876

877+
data.json_data = isString(data.json_data) ? data.json_data : JSON.stringify(data.json_data);
878+
delete data.id;
879+
873880
try {
874881
const resUpdate = await db("sfa.funding_request")
875882
.where({ id, application_id })
@@ -882,8 +889,8 @@ applicationRouter.put(
882889
}
883890

884891
return resUpdate
885-
? res.json({ messages: [{ variant: "success", text: "Saved" }] })
886-
: res.json({ messages: [{ variant: "error", text: "Failed" }] });
892+
? res.json({ messages: [{ variant: "success", text: "Funding Request Saved" }] })
893+
: res.json({ messages: [{ variant: "error", text: "Save Failed" }] });
887894
} catch (error) {
888895
console.log(error);
889896
return res.json({ messages: [{ text: "Failed to update Funding Request", variant: "error" }] });
@@ -905,7 +912,7 @@ applicationRouter.delete(
905912
return res.status(404).send({ messages: [{ variant: "error", text: "The record does not exits" }] });
906913
}
907914

908-
const disbursements = await db("sfa.disbursement").where({ funding_request_id: id })
915+
const disbursements = await db("sfa.disbursement").where({ funding_request_id: id });
909916

910917
if (disbursements.length > 0) {
911918
return res.status(400).json({

src/api/routes/admin/assessment-router.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { DB_CONFIG } from "../../config";
77
import { assessmentSTARouter } from "./sta-assessment-router";
88
//import { assessmentCsgftRouter } from "./csgft-assessment-router";
99
import { assessmentYukonGrantRouter } from "./assessment/assessment-yukon-grant-router";
10+
import { assessmentWUPApprenticeshipRouter } from "./assessment/assessment-wup-apprenticeship-router";
11+
import { assessmentWUPSkillsRouter } from "./assessment/assessment-wup-skills-router";
1012

1113
const db = knex(DB_CONFIG);
1214
export const assessmentRouter = express.Router();
@@ -15,6 +17,8 @@ export const assessmentRouter = express.Router();
1517
assessmentRouter.use("/sta", assessmentSTARouter);
1618
//assessmentRouter.use("/csgft", assessmentCsgftRouter);
1719
assessmentRouter.use("/yukon-grant", assessmentYukonGrantRouter);
20+
assessmentRouter.use("/wup-apprenticeship", assessmentWUPApprenticeshipRouter);
21+
assessmentRouter.use("/wup-skills-for-success", assessmentWUPSkillsRouter);
1822

1923
const mainTable = "sfa.assessment";
2024

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
import express, { Request, Response } from "express";
2+
import { body, param } from "express-validator";
3+
import knex from "knex";
4+
import { isString } from "lodash";
5+
6+
import { DB_CONFIG } from "@/config";
7+
import { ReturnValidationErrors } from "@/middleware";
8+
import { AssessmentService } from "@/services/admin/assessments/assessment-service";
9+
import { writeAuditLog } from "@/services/audit-service";
10+
import { formatMoney } from "@/utils/formatters";
11+
12+
const db = knex(DB_CONFIG);
13+
export const assessmentWUPApprenticeshipRouter = express.Router();
14+
15+
assessmentWUPApprenticeshipRouter.get(
16+
"/:id",
17+
[param("id").isInt().notEmpty()],
18+
ReturnValidationErrors,
19+
async (req: Request, res: Response) => {
20+
const { id } = req.params;
21+
22+
try {
23+
const result = await db("sfa.assessment")
24+
.innerJoin("sfa.funding_request", "sfa.assessment.funding_request_id", "sfa.funding_request.id")
25+
.where("assessment.id", id)
26+
.select("assessment.*", "funding_request.application_id")
27+
.first();
28+
29+
if (!result) return res.json({ error: "Assessment not found" });
30+
31+
const builder = new AssessmentService(result.application_id, result.funding_request_id, parseInt(id));
32+
await builder.load();
33+
34+
return res.status(200).json({ success: true, data: builder.assessment });
35+
} catch (error: any) {
36+
console.log(error);
37+
return res.json({ error: error });
38+
}
39+
}
40+
);
41+
42+
assessmentWUPApprenticeshipRouter.post(
43+
"/",
44+
[body("funding_request_id").notEmpty()],
45+
ReturnValidationErrors,
46+
async (req: Request, res: Response) => {
47+
const { ...assessment } = req.body;
48+
try {
49+
const fundingRequest = await db("sfa.funding_request").where({ id: assessment.funding_request_id }).first();
50+
if (!fundingRequest) return res.json({ error: "Funding request not found" });
51+
52+
const builder = new AssessmentService(fundingRequest.application_id, assessment.funding_request_id);
53+
await builder.load(true);
54+
55+
const updatedItem = { ...builder.assessment, ...assessment };
56+
delete updatedItem.id;
57+
58+
const existingAssessments = await db("sfa.assessment").where({
59+
funding_request_id: assessment.funding_request_id,
60+
});
61+
62+
let logType = "Assessment";
63+
64+
if (existingAssessments && existingAssessments.length > 0) {
65+
updatedItem.assessment_type_id = 2;
66+
logType = "Reassessment";
67+
}
68+
69+
const updated = await db("sfa.assessment").insert(updatedItem).returning("id");
70+
71+
await writeAuditLog({
72+
application_id: fundingRequest.application_id,
73+
funding_request_id: fundingRequest.id,
74+
assessment_id: updated[0].id,
75+
user_id: req.user.id,
76+
user_name: req.user.display_name.replace(".", " "),
77+
title: `${logType} Created`,
78+
});
79+
80+
if (updated[0].id) {
81+
return res.status(200).json({ messages: [{ variant: "success", text: "Assessment saved" }] });
82+
}
83+
84+
return res.status(404).send();
85+
} catch (err: any) {
86+
console.log("FAILED", err);
87+
return res.json({ messages: [{ variant: "error", text: "Save failed" }] });
88+
}
89+
}
90+
);
91+
92+
assessmentWUPApprenticeshipRouter.patch(
93+
"/:id",
94+
[param("id").isInt().notEmpty()],
95+
ReturnValidationErrors,
96+
async (req: Request, res: Response) => {
97+
const { id } = req.params;
98+
const { ...assessment } = req.body;
99+
const recalculate = req.body.recalculate ?? false;
100+
101+
try {
102+
assessment.json_data = isString(assessment.json_data)
103+
? assessment.json_data
104+
: JSON.stringify(assessment.json_data);
105+
106+
delete assessment.id;
107+
delete assessment.recalculate;
108+
109+
const result = await db("sfa.assessment")
110+
.innerJoin("sfa.funding_request", "sfa.assessment.funding_request_id", "sfa.funding_request.id")
111+
.where("assessment.id", id)
112+
.select("assessment.*", "funding_request.application_id")
113+
.first();
114+
115+
if (!result) return res.json({ error: "Assessment not found" });
116+
117+
if (recalculate) {
118+
const builder = new AssessmentService(result.application_id, result.funding_request_id, parseInt(id));
119+
await builder.load(recalculate);
120+
121+
const updatedItem = builder.assessment;
122+
123+
updatedItem.json_data = isString(updatedItem.json_data)
124+
? updatedItem.json_data
125+
: JSON.stringify(updatedItem.json_data);
126+
127+
await writeAuditLog({
128+
application_id: result.application_id,
129+
funding_request_id: result.funding_request_id,
130+
assessment_id: parseInt(id),
131+
user_id: req.user.id,
132+
user_name: req.user.display_name.replace(".", " "),
133+
title: `Assessment Recalculated = ${formatMoney(builder.assessment.assessed_amount)}`,
134+
});
135+
136+
delete updatedItem.id;
137+
await db("sfa.assessment").where({ id: id }).update(updatedItem);
138+
} else {
139+
await db("sfa.assessment").where({ id: id }).update(assessment);
140+
}
141+
142+
return res.status(200).json({ messages: [{ variant: "success", text: "Assessment saved" }] });
143+
} catch (err: any) {
144+
console.log("FAILED", err);
145+
return res.json({ messages: [{ variant: "error", text: "Save failed" }] });
146+
}
147+
}
148+
);
149+
150+
assessmentWUPApprenticeshipRouter.delete(
151+
"/:id",
152+
[param("id").isInt().notEmpty()],
153+
ReturnValidationErrors,
154+
async (req: Request, res: Response) => {
155+
const { id = null } = req.params;
156+
157+
try {
158+
const verifyRecord = await db("sfa.assessment").where({ id: id }).first();
159+
160+
if (!verifyRecord) {
161+
return res.status(404).send({ wasDelete: false, message: "The record does not exits" });
162+
}
163+
164+
const fundingRequest = await db("sfa.funding_request").where({ id: verifyRecord.funding_request_id }).first();
165+
const disbursements = await db("sfa.disbursement").where({ assessment_id: id });
166+
167+
if (disbursements && disbursements.length > 0) {
168+
return res
169+
.status(409)
170+
.send({ wasDelete: false, message: "The assessment cannot be deleted because it has disbursements." });
171+
}
172+
173+
await writeAuditLog({
174+
application_id: fundingRequest.application_id,
175+
funding_request_id: verifyRecord.funding_request_id,
176+
user_id: req.user.id,
177+
user_name: req.user.display_name.replace(".", " "),
178+
title: `${verifyRecord.assessment_type_id == 1 ? "Assessment" : "Reassessment"} Deleted`,
179+
});
180+
181+
await db("sfa.assessment").where({ id: id }).del();
182+
res.status(200).json({ messages: [{ variant: "success", text: "Assessment deleted" }] });
183+
} catch (error: any) {
184+
console.log(error);
185+
if (error?.number === 547) {
186+
return res
187+
.status(409)
188+
.send({ wasDelete: false, message: `The assessment Id: "${id}" cannot be deleted because it is in use.` });
189+
}
190+
191+
return res.status(409).send({ wasDelete: false, message: "Error to Delete" });
192+
}
193+
}
194+
);

0 commit comments

Comments
 (0)