Skip to content

Commit 7691d13

Browse files
authored
Merge pull request #347 from icefoganalytics/test
Yukon Grant and YEA Letters
2 parents ea8eb65 + 3f9ea66 commit 7691d13

File tree

27 files changed

+2747
-1110
lines changed

27 files changed

+2747
-1110
lines changed

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

Lines changed: 88 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -3,120 +3,119 @@ import { body, param } from "express-validator";
33
import knex from "knex";
44
import { ReturnValidationErrors } from "../../middleware";
55
import { DB_CONFIG } from "../../config";
6-
import { assessmentCslftRouter } from "./cslft-assessment-router";
6+
//import { assessmentCslftRouter } from "./cslft-assessment-router";
77
import { assessmentSTARouter } from "./sta-assessment-router";
8-
import { assessmentCsgftRouter } from "./csgft-assessment-router";
8+
//import { assessmentCsgftRouter } from "./csgft-assessment-router";
9+
import { assessmentYukonGrantRouter } from "./assessment/assessment-yukon-grant-router";
910

10-
const db = knex(DB_CONFIG)
11+
const db = knex(DB_CONFIG);
1112
export const assessmentRouter = express.Router();
1213

13-
assessmentRouter.use("/cslft", assessmentCslftRouter);
14+
//assessmentRouter.use("/cslft", assessmentCslftRouter);
1415
assessmentRouter.use("/sta", assessmentSTARouter);
15-
assessmentRouter.use("/csgft", assessmentCsgftRouter);
16+
//assessmentRouter.use("/csgft", assessmentCsgftRouter);
17+
assessmentRouter.use("/yukon-grant", assessmentYukonGrantRouter);
1618

1719
const mainTable = "sfa.assessment";
1820

19-
assessmentRouter.get("/:id",
20-
[param("id").isInt().notEmpty()], ReturnValidationErrors,
21-
async (req: Request, res: Response) => {
22-
21+
assessmentRouter.get(
22+
"/:id",
23+
[param("id").isInt().notEmpty()],
24+
ReturnValidationErrors,
25+
async (req: Request, res: Response) => {
2326
const { id = null } = req.params;
2427

2528
try {
26-
const results = await db(mainTable)
27-
.where("id", id);
28-
29-
if (results) {
30-
return res.status(200).json({ success: true, data: [...results], });
31-
} else {
32-
return res.status(404).send();
33-
}
29+
const results = await db(mainTable).where("id", id);
3430

35-
} catch (error: any) {
36-
console.log(error);
31+
if (results) {
32+
return res.status(200).json({ success: true, data: [...results] });
33+
} else {
3734
return res.status(404).send();
35+
}
36+
} catch (error: any) {
37+
console.log(error);
38+
return res.status(404).send();
3839
}
39-
});
40-
41-
assessmentRouter.post("/",
42-
[body("funding_request_id").notEmpty()], ReturnValidationErrors,
43-
async (req: Request, res: Response) => {
44-
const { funding_request_id, ...assessment } = req.body;
45-
const existing = await db(mainTable).where({ funding_request_id: funding_request_id }).count("* as count").first();
46-
47-
let newApp = {
48-
funding_request_id: funding_request_id,
49-
...assessment
50-
};
51-
52-
const newRow = await db(mainTable).insert(newApp).returning("*");
53-
54-
if (newRow && newRow.length == 1) {
55-
return res.json({ data: { id: newRow[0].id }, messages: [{ text: "Assessment created", variant: "success" }] });
56-
}
57-
else {
58-
return res.json({ messages: [{ text: "This record appears to already exist", variant: "error" }] })
59-
}
60-
}
40+
}
6141
);
6242

63-
assessmentRouter.patch("/:id",
64-
[param("id").isInt().notEmpty()], ReturnValidationErrors,
65-
async (req: Request, res: Response) => {
66-
const { id = null } = req.params;
67-
const { ...assessment } = req.body;
68-
69-
console.log(id);
70-
71-
try {
72-
const result = await db(mainTable).where({id:id}).update(assessment);
73-
74-
if (result) {
75-
return res.status(200).json({ messages: [{ variant: "success", text: "Assessment saved" }] })
76-
}
77-
78-
return res.status(404).send();
79-
}
80-
catch (err: any) {
81-
console.log("FAILED", err)
82-
return res.json({ messages: [{ variant: "error", text: "Save failed" }] })
83-
}
84-
43+
assessmentRouter.post(
44+
"/",
45+
[body("funding_request_id").notEmpty()],
46+
ReturnValidationErrors,
47+
async (req: Request, res: Response) => {
48+
const { funding_request_id, ...assessment } = req.body;
49+
const existing = await db(mainTable).where({ funding_request_id: funding_request_id }).count("* as count").first();
50+
51+
let newApp = {
52+
funding_request_id: funding_request_id,
53+
...assessment,
54+
};
55+
56+
const newRow = await db(mainTable).insert(newApp).returning("*");
57+
58+
if (newRow && newRow.length == 1) {
59+
return res.json({ data: { id: newRow[0].id }, messages: [{ text: "Assessment created", variant: "success" }] });
60+
} else {
61+
return res.json({ messages: [{ text: "This record appears to already exist", variant: "error" }] });
8562
}
63+
}
8664
);
8765

88-
assessmentRouter.delete("/:id", [param("id").isInt().notEmpty()], ReturnValidationErrors,
89-
async (req: Request, res: Response) => {
66+
assessmentRouter.patch(
67+
"/:id",
68+
[param("id").isInt().notEmpty()],
69+
ReturnValidationErrors,
70+
async (req: Request, res: Response) => {
71+
const { id = null } = req.params;
72+
const { ...assessment } = req.body;
9073

91-
const { id = null } = req.params;
92-
let description = "";
93-
try {
74+
console.log(id);
9475

95-
const verifyRecord: any = await db(mainTable)
96-
.where({ id: id })
97-
.first();
76+
try {
77+
const result = await db(mainTable).where({ id: id }).update(assessment);
9878

99-
if (!verifyRecord) {
100-
return res.status(404).send({ wasDelete: false, message: "The record does not exits" });
101-
}
79+
if (result) {
80+
return res.status(200).json({ messages: [{ variant: "success", text: "Assessment saved" }] });
81+
}
10282

103-
const deleteRecord: any = await db(mainTable)
104-
.where({ id: id })
105-
.del();
83+
return res.status(404).send();
84+
} catch (err: any) {
85+
console.log("FAILED", err);
86+
return res.json({ messages: [{ variant: "error", text: "Save failed" }] });
87+
}
88+
}
89+
);
10690

107-
return (deleteRecord > 0) ?
108-
res.status(202).send({ wasDelete: true })
109-
:
110-
res.status(404).send({ wasDelete: false, message: `The record with Id: "${id}" does not exits` });
91+
assessmentRouter.delete(
92+
"/:id",
93+
[param("id").isInt().notEmpty()],
94+
ReturnValidationErrors,
95+
async (req: Request, res: Response) => {
96+
const { id = null } = req.params;
97+
let description = "";
98+
try {
99+
const verifyRecord: any = await db(mainTable).where({ id: id }).first();
111100

112-
} catch (error: any) {
101+
if (!verifyRecord) {
102+
return res.status(404).send({ wasDelete: false, message: "The record does not exits" });
103+
}
113104

114-
console.log(error);
115-
if (error?.number === 547) {
116-
return res.status(409).send({ wasDelete: false, message: `The assessment Id: "${id}" cannot be deleted because it is in use.` });
117-
}
105+
const deleteRecord: any = await db(mainTable).where({ id: id }).del();
118106

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

0 commit comments

Comments
 (0)