Skip to content

Commit af9e3eb

Browse files
committed
WUP Fixes and Student Create
1 parent 2504eeb commit af9e3eb

File tree

8 files changed

+214
-101
lines changed

8 files changed

+214
-101
lines changed

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

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import express, { Request, Response } from "express";
22
import { body, param } from "express-validator";
33
import moment from "moment";
44
import knex from "knex";
5-
import { orderBy } from "lodash";
5+
import { isNil, orderBy } from "lodash";
66
import axios from "axios";
77
import { ReturnValidationErrors, ReturnValidationErrorsCustomMessage } from "@/middleware";
88
import { API_PORT, DB_CONFIG, NODE_ENV } from "@/config";
@@ -22,19 +22,36 @@ studentRouter.post(
2222
[body("first_name").notEmpty(), body("last_name").notEmpty()],
2323
ReturnValidationErrors,
2424
async (req: Request, res: Response) => {
25-
let { first_name, last_name, initials, locator_number, sin } = req.body;
26-
27-
let student = {
28-
first_name,
29-
last_name,
30-
initials,
31-
locator_number,
32-
sin,
33-
};
25+
let { first_name, last_name, sin, birth_date } = req.body;
26+
27+
let trx = await db.transaction();
28+
29+
try {
30+
let person = {
31+
first_name,
32+
last_name,
33+
sin,
34+
birth_date,
35+
};
3436

35-
let result = await insertStudent(student);
37+
const newPerson = await trx("sfa.person").insert(person).returning("*");
3638

37-
res.json({ data: result });
39+
let student = {
40+
person_id: newPerson[0].id,
41+
checked_for_yukon_id: false,
42+
is_crown_ward: false,
43+
is_active: true,
44+
};
45+
46+
let newStudent = await trx("sfa.student").insert(student).returning("*");
47+
trx.commit();
48+
49+
return res.json({ data: newStudent[0] });
50+
} catch (error) {
51+
trx.rollback();
52+
console.log(error);
53+
return res.status(500).send({ messages: [{ variant: "error", text: "Save failed" }] });
54+
}
3855
}
3956
);
4057

@@ -1218,23 +1235,6 @@ studentRouter.delete(
12181235
}
12191236
);
12201237

1221-
async function insertStudent(student: any) {
1222-
let max = (await db("sfa.STUDENT").max("student_id as smax").first())?.smax;
1223-
let limit = 5;
1224-
1225-
while (limit > 0) {
1226-
let next = max; //+ 1;
1227-
try {
1228-
student.student_id = next;
1229-
let returning = await knex("sfa.STUDENT").insert(student).returning("*");
1230-
return returning[0];
1231-
} catch (err) {
1232-
max++;
1233-
limit--;
1234-
}
1235-
}
1236-
}
1237-
12381238
function cleanUser(email: string) {
12391239
return email.substring(0, Math.min(10, email.indexOf("@")));
12401240
}

src/api/services/admin/assessments/wup-apprenticeship-service.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,17 +117,19 @@ export class WUPApprenticeshipService {
117117
});
118118
}
119119

120-
const numberDependents = cleanNumber(data.dependent_care_number_of_children);
121-
const dependentWeeklyRate = 7 * 50; // $50 per day per child
120+
const numberDependents = cleanNumber(data.dependent_care_number_of_children) ?? 0;
121+
const numberDays = cleanNumber(data.dependent_care_number_of_days) ?? 0;
122+
123+
const dependentDailyRate = 50; // $50 per day per child
122124

123125
// not sure what data.dependent_care_subsidy_eligible impacts
124126

125127
if (data.dependent_care_allowance) {
126128
data.requested_supports.push({
127129
type: "Dependent care allowance",
128-
frequency: "Weekly",
129-
amount: numberDependents * dependentWeeklyRate,
130-
total_amount: numberDependents * dependentWeeklyRate * this.parent.assessment.weeks_allowed,
130+
frequency: "Once per application",
131+
amount: null,
132+
total_amount: numberDependents * dependentDailyRate * numberDays,
131133
assessed_date: null,
132134
});
133135
}

src/web/src/components/application/assessments/views/WUP-Apprenticeship.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<v-list-item-icon><v-icon>mdi-content-save</v-icon></v-list-item-icon>
2828
<v-list-item-title>Save</v-list-item-title>
2929
</v-list-item>
30-
<v-list-item v-if="canSave" @click="recalculateClick">
30+
<v-list-item v-if="canRecalculate" @click="recalculateClick">
3131
<v-list-item-icon><v-icon>mdi-refresh</v-icon></v-list-item-icon>
3232
<v-list-item-title>Recalculate</v-list-item-title>
3333
</v-list-item>
@@ -319,6 +319,10 @@ export default {
319319
let lastItem = this.assessmentItems[this.assessmentItems.length - 1];
320320
return lastItem.id === parseInt(this.assessment.id);
321321
},
322+
323+
canRecalculate() {
324+
return this.canSave && !isNil(this.assessment) && this.assessment.id > 0;
325+
},
322326
canAddAssessment() {
323327
return !isNil(this.assessment) && this.canSave && this.assessment.id > 0;
324328
},

src/web/src/components/application/wup-funding-requests/apprenticeship-training-support/ApprenticeshipTrainingForm.vue

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,20 @@
259259
@change="saveItem"
260260
/>
261261
</v-col>
262+
<v-col cols="12" md="3">
263+
<v-text-field
264+
v-model="fundingRequest.json_data.dependent_care_number_of_days"
265+
label="Number of days approved"
266+
dense
267+
outlined
268+
background-color="white"
269+
hide-details
270+
@change="saveItem"
271+
/>
272+
</v-col>
262273

263-
<v-col cols="12" md="8">
274+
275+
<v-col cols="12" md="6">
264276
<v-switch
265277
v-model="fundingRequest.json_data.dependent_care_subsidy_eligible"
266278
label="Apprentice is eligible for Yukon Child Care Subsidy"

src/web/src/router/index.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ import CSLRestrictedDataModuleRoutes from "@/modules/csl-restricted-data/router"
7676

7777
import administrationRoutes from "@/modules/Administration/router";
7878
import fundingRequestRoutes from "@/components/application/funding-requests/router";
79+
import CreateStudent from "../views/CreateStudent.vue";
7980

8081
Vue.use(VueRouter);
8182

@@ -268,6 +269,14 @@ const routes = [
268269
requiresAuth: true,
269270
},
270271
},
272+
{
273+
path: "/create-student",
274+
name: "CreateStudent",
275+
component: CreateStudent,
276+
meta: {
277+
requiresAuth: true,
278+
},
279+
},
271280

272281
{
273282
path: "/sign-in",
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
<template>
2+
<div>
3+
<h1>
4+
Create Student
5+
</h1>
6+
<v-row>
7+
<v-col cols="12" md="6">
8+
<v-card class="default">
9+
<v-card-text>
10+
<v-form>
11+
<v-row class="mb-4">
12+
<v-col cols="12" md="6">
13+
<v-text-field
14+
label="First name"
15+
dense
16+
outlined
17+
hide-details
18+
background-color="white"
19+
v-model="student.first_name"
20+
></v-text-field>
21+
</v-col>
22+
<v-col cols="12" md="6">
23+
<v-text-field
24+
label="Last name"
25+
dense
26+
outlined
27+
hide-details
28+
background-color="white"
29+
v-model="student.last_name"
30+
></v-text-field>
31+
</v-col>
32+
<v-col cols="12" md="6">
33+
<v-text-field
34+
label="SIN"
35+
dense
36+
outlined
37+
hide-details
38+
background-color="white"
39+
v-model="student.sin"
40+
oninput="
41+
if (this.value.length > 9) this.value = this.value.slice(0, 9);
42+
"
43+
@keypress="validate.isNumber($event)"
44+
></v-text-field>
45+
</v-col>
46+
<v-col cols="12" md="6">
47+
<v-menu
48+
v-model="show_menu"
49+
:close-on-content-click="false"
50+
transition="scale-transition"
51+
left
52+
nudge-top="26"
53+
offset-y
54+
min-width="auto"
55+
>
56+
<template v-slot:activator="{ on, attrs }">
57+
<v-text-field
58+
label="Birth date"
59+
append-icon="mdi-calendar"
60+
:value="student.birth_date"
61+
hide-details
62+
readonly
63+
outlined
64+
dense
65+
background-color="white"
66+
v-bind="attrs"
67+
v-on="on"
68+
></v-text-field>
69+
</template>
70+
<v-date-picker
71+
:value="student.birth_date"
72+
@input="
73+
(e) => {
74+
student.birth_date = e;
75+
show_menu = false;
76+
}
77+
"
78+
></v-date-picker>
79+
</v-menu>
80+
</v-col>
81+
</v-row>
82+
83+
<div class="d-flex">
84+
<v-btn :disabled="!formValid" color="primary" @click="saveClick">Create</v-btn>
85+
<v-spacer />
86+
<v-btn text to="/dashboard" color="warning" outlined>Cancel</v-btn>
87+
</div>
88+
</v-form>
89+
</v-card-text>
90+
</v-card>
91+
</v-col>
92+
</v-row>
93+
</div>
94+
</template>
95+
96+
<script>
97+
import axios from "axios";
98+
import { STUDENT_URL } from "@/urls";
99+
import validator from "@/validator";
100+
101+
export default {
102+
data: () => ({
103+
showDrawer: false,
104+
student: { first_name: "", last_name: "", sin: "", birth_date: "" },
105+
show_menu: false,
106+
107+
validate: {},
108+
}),
109+
computed: {
110+
formValid: function() {
111+
let fn = this.student.first_name.trim();
112+
let ln = this.student.last_name.trim();
113+
let sn = this.student.sin.trim();
114+
let bd = this.student.birth_date.trim();
115+
116+
if (fn.length == 0 || ln.length == 0 || sn.length != 9 || bd.length == 0) return false;
117+
118+
return true;
119+
},
120+
},
121+
async created() {
122+
this.validate = { ...validator };
123+
},
124+
methods: {
125+
show() {
126+
this.showDrawer = true;
127+
},
128+
saveClick() {
129+
axios.post(`${STUDENT_URL}`, this.student).then((resp) => {
130+
console.log(resp.data.data.id);
131+
132+
if (resp.data.data.id) {
133+
this.$router.push(`/student/${resp.data.data.id}`);
134+
}
135+
});
136+
},
137+
},
138+
};
139+
</script>

src/web/src/views/Dashboard.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,12 +187,12 @@
187187
<v-btn
188188
x-small
189189
color="primary"
190-
text
191-
:to="'/search?text=' + search"
190+
outlined
191+
:to="'/create-student'"
192192
class="my-0"
193193
style="font-size: 12px !important"
194194
>
195-
Advanced search</v-btn
195+
Create Student</v-btn
196196
>
197197
</div>
198198
<div class="float-left">Students ({{ resultCount }} matches)</div>

0 commit comments

Comments
 (0)