Skip to content

Commit 7bd051c

Browse files
committed
STA Other
1 parent b2d182b commit 7bd051c

File tree

10 files changed

+1259
-42
lines changed

10 files changed

+1259
-42
lines changed

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import express, { Request, Response } from "express";
22
import { body, param } from "express-validator";
33
import knex from "knex";
4+
45
import { ReturnValidationErrors } from "../../middleware";
56
import { DB_CONFIG } from "../../config";
6-
import { AssessmentCslftRepository, AssessmentSTA } from "../../repositories/assessment";
7-
import { AssessmentDTO, AssessmentTable, DisbursementDTO } from "../../models";
8-
import { assessmentRouter } from "./assessment-router";
9-
import axios from "axios";
7+
import { AssessmentSTA } from "../../repositories/assessment";
8+
import { AssessmentDTO, DisbursementDTO } from "../../models";
109

1110
const db = knex(DB_CONFIG);
1211
export const assessmentSTARouter = express.Router();
@@ -24,7 +23,7 @@ assessmentSTARouter.get(
2423
try {
2524
const verifyFundingRequest = await db("sfa.funding_request").where({ id }).first();
2625

27-
if (verifyFundingRequest && verifyFundingRequest?.request_type_id === 1) {
26+
if (verifyFundingRequest && [1, 46].includes(verifyFundingRequest?.request_type_id)) {
2827
const getAssessment = await db(mainTable).where("funding_request_id", verifyFundingRequest.id).first();
2928

3029
if (getAssessment) {
@@ -68,7 +67,7 @@ assessmentSTARouter.post(
6867
try {
6968
const verifyFundingRequest = await db("sfa.funding_request").where({ id: funding_request_id }).first();
7069

71-
if (verifyFundingRequest && verifyFundingRequest?.request_type_id === 1) {
70+
if (verifyFundingRequest && [1, 46].includes(verifyFundingRequest?.request_type_id)) {
7271
results = await assessmentSTARepo.getNewInfo(
7372
parseInt(verifyFundingRequest.application_id),
7473
parseInt(verifyFundingRequest.id),

src/api/services/admin/assessments/assessment-service.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import knex from "knex";
33
import { DB_CONFIG } from "@/config";
44
import { isNil } from "lodash";
55
import { YukonGrantService } from "./yukon-grant-service";
6+
import { STAOtherService } from "./sta-other-service";
67

78
const db = knex(DB_CONFIG);
89

@@ -50,6 +51,8 @@ export class AssessmentService {
5051
switch (this.fundingRequest.request_type_id) {
5152
case 2:
5253
return new YukonGrantService(this).build(reload);
54+
case 46:
55+
return new STAOtherService(this).build(reload);
5356
default:
5457
return this.assessment;
5558
}
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
import knex from "knex";
2+
import { DB_CONFIG } from "@/config";
3+
4+
import { monthsBetween, weeksBetween } from "@/utils/date-utils";
5+
import { AssessmentService } from "./assessment-service";
6+
7+
const db = knex(DB_CONFIG);
8+
9+
export class STAOtherService {
10+
private parent: AssessmentService;
11+
12+
constructor(parentService: AssessmentService) {
13+
this.parent = parentService;
14+
}
15+
16+
async build(reload = false) {
17+
// set all the hard-coded values - likely there because of not-null constraints in the database
18+
this.parent.assessment.allowed_books = 0;
19+
this.parent.assessment.allowed_tuition = 0;
20+
this.parent.assessment.living_costs = 0;
21+
this.parent.assessment.assessment_type_id = 1;
22+
this.parent.assessment.over_award = 0;
23+
this.parent.assessment.over_award_disbursement_period = 0;
24+
this.parent.assessment.over_award_applied_flg = "No";
25+
this.parent.assessment.student_contrib_exempt = "NO";
26+
this.parent.assessment.spouse_contrib_exempt = "NO";
27+
this.parent.assessment.student_contribution_review = "NO";
28+
this.parent.assessment.spouse_contribution_review = "NO";
29+
this.parent.assessment.parent_contribution_review = "NO";
30+
31+
if (reload) {
32+
// set the values from the application
33+
this.parent.assessment.classes_start_date = this.parent.application.classes_start_date;
34+
this.parent.assessment.classes_end_date = this.parent.application.classes_end_date;
35+
this.parent.assessment.effective_rate_date = this.parent.application.classes_start_date;
36+
37+
this.parent.assessment.extras = this.parent.assessment.extras || { allowTravelAmounts: true };
38+
if (this.parent.assessment.period == "0") this.parent.assessment.extras.allowTravelAmounts = false;
39+
40+
this.parent.assessment.allowed_months = monthsBetween(
41+
this.parent.assessment.classes_start_date,
42+
this.parent.assessment.classes_end_date
43+
);
44+
this.parent.assessment.study_weeks = weeksBetween(
45+
this.parent.assessment.classes_start_date,
46+
this.parent.assessment.classes_end_date
47+
);
48+
49+
const homeAddress = await db("sfa.person_address_v")
50+
.where({ person_address_id: this.parent.application.primary_address_id })
51+
.first();
52+
53+
if (!homeAddress) throw new Error("Primary Address not found");
54+
55+
const institutionCampus = await db("sfa.institution_campus")
56+
.where({ id: this.parent.application.institution_campus_id })
57+
.first();
58+
59+
if (!institutionCampus) throw new Error("Institution Campus not found");
60+
61+
this.parent.assessment.home_city_id = homeAddress.city_id;
62+
this.parent.assessment.destination_city_id = institutionCampus.address_city_id;
63+
64+
if (!this.parent.assessment.home_city_id) throw new Error("Home City not found for Student Address");
65+
66+
if (!this.parent.assessment.destination_city_id)
67+
throw new Error("Destination City not found for Institution Campus");
68+
69+
const ygCost = await db("sfa.yg_cost")
70+
.where({
71+
academic_year_id: this.parent.application.academic_year_id,
72+
allowed_percent: 100,
73+
})
74+
.first();
75+
76+
if (!ygCost) throw new Error("Yukon Grant Cost not found");
77+
78+
this.parent.assessment.weekly_amount = ygCost.weekly_amount;
79+
this.parent.assessment.living_costs = ygCost.living || 0;
80+
this.parent.assessment.allowed_tuition = ygCost.tuition || 0;
81+
this.parent.assessment.allowed_books = ygCost.book || 0;
82+
}
83+
84+
// calculate the travel stuff
85+
this.parent.assessment.airfare_amount = 0;
86+
this.parent.assessment.travel_allowance = 0;
87+
88+
let previousTravelCount = 0;
89+
90+
// this is the count of previous travel assessments (post leg and pre leg are the same)
91+
const travelCount = await db.raw(`SELECT count(a.id) as counter
92+
FROM sfa.application app
93+
INNER JOIN sfa.funding_request fr ON app.id = fr.application_id
94+
INNER JOIN (SELECT funding_request_id, assessment_id, sum(disbursed_amount) disbursed_amount
95+
FROM sfa.disbursement GROUP BY funding_request_id, assessment_id) d ON fr.id = d.funding_request_id
96+
INNER JOIN sfa.assessment a ON d.assessment_id = a.id
97+
WHERE app.student_id = ${this.parent.application.student_id}
98+
AND d.disbursed_amount > 0 -- positive disbursement
99+
AND a.airfare_amount > 0 -- has an airfair amount
100+
AND fr.request_type_id = 2 -- request type YG
101+
AND a.id != ${this.parent.assessment.id}`);
102+
103+
if (travelCount && travelCount[0]) {
104+
previousTravelCount += travelCount[0].counter;
105+
}
106+
107+
const isAllowedTravel =
108+
previousTravelCount <= 4 &&
109+
!this.parent.application.is_correspondence &&
110+
this.parent.assessment.extras.allowTravelAmounts;
111+
112+
if (isAllowedTravel) {
113+
const transportation = await db("sfa.transportation")
114+
.where({
115+
home_city_id: this.parent.assessment.home_city_id,
116+
institution_city_id: this.parent.assessment.destination_city_id,
117+
})
118+
.first();
119+
120+
if (transportation) {
121+
this.parent.assessment.airfare_amount = transportation.airfare_amount;
122+
this.parent.assessment.travel_allowance = transportation.travel_allowance_amount;
123+
}
124+
}
125+
126+
let prevPostLegWeeks = 0;
127+
let prevPreLegWeeks = 0;
128+
129+
const prevPostLegWeeksQ = await db.raw(`SELECT COALESCE(sum(a.weeks_allowed), 0) as weeks
130+
FROM sfa.application app
131+
INNER JOIN sfa.funding_request fr ON app.id = fr.application_id
132+
INNER JOIN (SELECT funding_request_id
133+
, assessment_id
134+
, sum(disbursed_amount) disbursed_amount
135+
FROM sfa.disbursement
136+
GROUP BY funding_request_id, assessment_id) d ON fr.id = d.funding_request_id
137+
INNER JOIN sfa.assessment a ON d.assessment_id = a.id
138+
WHERE app.program_id <> (SELECT id FROM sfa.program WHERE description = 'Upgrading-Academic')
139+
AND app.student_id = ${this.parent.studentId}
140+
AND app.id < ${this.parent.application.id}
141+
AND app.academic_year_id > 2015
142+
AND d.disbursed_amount > 0 -- positive disbursement
143+
group by app.student_id`);
144+
145+
if (prevPostLegWeeksQ && prevPostLegWeeksQ[0]) prevPostLegWeeks = prevPostLegWeeksQ[0].weeks;
146+
147+
const prevPreLegWeeksQ =
148+
await db.raw(`SELECT COALESCE(CEILING(SUM(CASE WHEN fr.request_type_id = 1 THEN a.weeks_allowed ELSE a.years_funded_equivalent*34 END)) ,0) weeks
149+
FROM sfa.application app
150+
INNER JOIN sfa.funding_request fr ON app.id = fr.application_id
151+
, (SELECT funding_request_id
152+
, assessment_id
153+
, sum(disbursed_amount) disbursed_amount
154+
FROM sfa.disbursement
155+
GROUP BY funding_request_id, assessment_id) d
156+
INNER JOIN sfa.assessment a ON d.assessment_id = a.id
157+
WHERE fr.id = d.funding_request_id
158+
AND app.id < ${this.parent.application.id}
159+
AND app.program_id <> (SELECT id FROM sfa.program WHERE description = 'Upgrading-Academic')
160+
AND app.student_id = ${this.parent.studentId}
161+
AND app.academic_year_id <=2015
162+
AND d.disbursed_amount > 0 -- positive disbursement
163+
AND fr.request_type_id in (1,2) -- request type STA
164+
group by app.student_id;`);
165+
166+
if (prevPreLegWeeksQ && prevPreLegWeeksQ[0]) prevPreLegWeeks = prevPreLegWeeksQ[0].weeks;
167+
168+
this.parent.assessment.extras.previousFundedWeeks = prevPostLegWeeks + prevPreLegWeeks;
169+
this.parent.assessment.extras.previousTravelCount = previousTravelCount;
170+
171+
if (this.parent.assessment.extras.previousFundedWeeks + this.parent.assessment.study_weeks > 170) {
172+
this.parent.assessment.weeks_allowed = 170 - this.parent.assessment.extras.previousFundedWeeks;
173+
} else {
174+
this.parent.assessment.weeks_allowed = this.parent.assessment.study_weeks;
175+
}
176+
177+
if (this.parent.application.academic_year_id < 2016) {
178+
this.parent.assessment.disbursements_required = this.parent.assessment.disbursements_required ?? 1;
179+
180+
this.parent.assessment.assessed_amount =
181+
(this.parent.assessment.living_costs +
182+
this.parent.assessment.allowed_tuition +
183+
this.parent.assessment.allowed_books) *
184+
this.parent.assessment.disbursements_required +
185+
this.parent.assessment.travel_allowance +
186+
this.parent.assessment.airfare_amount;
187+
} else {
188+
this.parent.assessment.assessed_amount =
189+
this.parent.assessment.weekly_amount * this.parent.assessment.weeks_allowed +
190+
this.parent.assessment.travel_allowance +
191+
this.parent.assessment.airfare_amount;
192+
}
193+
194+
this.parent.assessment.extras.previousDisbursements = this.parent.disbursements.reduce((total, disbursement) => {
195+
return total + disbursement.disbursed_amount;
196+
}, 0);
197+
198+
this.parent.assessment.extras.netAmount =
199+
this.parent.assessment.assessed_amount -
200+
this.parent.assessment.extras.previousDisbursements -
201+
(this.parent.assessment.assessment_adj_amount ?? 0);
202+
}
203+
}

src/web/src/components/application/Status.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,9 @@ export default {
288288
case 2:
289289
this.$router.push(`/application/${this.applicationId}/yukon-grant/${funding_request_id}`);
290290
break;
291+
/* case 46:
292+
this.$router.push(`/application/${this.applicationId}/sta-other/${funding_request_id}`);
293+
break; */
291294
292295
default:
293296
/* if (request_type_id == 4) {

0 commit comments

Comments
 (0)