Skip to content

Commit cca00d9

Browse files
committed
Merge branch 'fixVoucherFetching' into development
2 parents 3fd3dd0 + 7e58cc9 commit cca00d9

File tree

5 files changed

+182
-25
lines changed

5 files changed

+182
-25
lines changed

app/(pages)/(main)/volunteering/logs/page.js

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,34 @@ function LogsPage() {
4040
const [workGroups, setWorkGroups] = useState([]);
4141
const [workLogs, setWorkLogs] = useState([]);
4242
const [voucherLogs, setVoucherLogs] = useState([]);
43+
const [lastSemVoucherLogs, setLastSemVoucherLogs] = useState([]);
4344

4445
const [mode, setMode] = useState(false);
4546
const [vouchersEarned, setVouchersEarned] = useState(0);
47+
const [vouchersEarnedLastSemester, setVouchersEarnedLastSemester] = useState(0);
4648
const [vouchersUsed, setVouchersUsed] = useState(0);
49+
const [vouchersUsedLastSemester, setVouchersUsedLastSemester] = useState(0);
4750

4851
const [refresh, setRefresh] = useState(false);
4952

5053
const session = useSession();
54+
55+
let startOfSemester = false;
56+
let lastSemester;
57+
58+
const dateTime = new Date();
59+
const deadline = new Date();
60+
deadline.setDate(16);
61+
deadline.setMonth(1);
62+
63+
if (dateTime < deadline) {
64+
startOfSemester = true;
65+
lastSemester = {
66+
id: session.data.semester.id - 1,
67+
vouchersEarned: 0,
68+
vouchersUsed: 0,
69+
}
70+
}
5171

5272
useEffect(() => {
5373
fetch("/api/v2/users")
@@ -80,6 +100,20 @@ function LogsPage() {
80100
.then(voucherLog => {
81101
handleVoucherLogs(voucherLog.voucherLogs, session, setVoucherLogs, setVouchersUsed)
82102
})
103+
104+
if (startOfSemester) {
105+
fetch("/api/v2/workLogs?semesterId=" + lastSemester.id)
106+
.then(res => res.json())
107+
.then(resData => {
108+
handleLastSemesterWorkLogs(resData.workLogs, session, setVouchersEarnedLastSemester)
109+
})
110+
111+
fetch("/api/v2/voucherLogs?semesterId=" + lastSemester.id)
112+
.then(res => res.json())
113+
.then(voucherLog => {
114+
handleLastSemesterVoucherLogs(voucherLog.voucherLogs, session, setLastSemVoucherLogs, setVouchersUsedLastSemester)
115+
})
116+
}
83117
}, [refresh])
84118

85119
const worklogInputLayout = worklogInput(
@@ -93,15 +127,18 @@ function LogsPage() {
93127
session,
94128
vouchersEarned,
95129
vouchersUsed,
96-
setRefresh
130+
setRefresh,
131+
vouchersEarnedLastSemester,
132+
vouchersUsedLastSemester,
133+
startOfSemester
97134
);
98135

99136
const inputLayout = mode ? worklogInputLayout : voucherLogInputLayout;
100137
const tableLayout = (
101138
<CustomTable
102139
key={mode ? "workLogTable" : "voucherLogTable"}
103140
headers={mode ? WORK_TABLE_HEADERS : VOUCHER_TABLE_HEADERS}
104-
data={mode ? workLogs : voucherLogs}
141+
data={mode ? workLogs : voucherLogs.concat(lastSemVoucherLogs)}
105142
defaultFilterBy="loggedFor"
106143
/>
107144
);
@@ -175,6 +212,20 @@ function handleWorkLogs(logs, session, setWorkLogs, setVouchersEarned) {
175212
setVouchersEarned(newVouchersEarned);
176213
}
177214

215+
function handleLastSemesterWorkLogs(logs, session, setVouchersEarnedLastSemester) {
216+
217+
const newVouchersEarned = logs
218+
.filter((e) => {
219+
const person = e.LoggedForUser;
220+
return person && person.id == session.data.user.id;
221+
})
222+
.reduce((total, e) => {
223+
return (total += e.duration * 0.5);
224+
}, 0.0);
225+
226+
setVouchersEarnedLastSemester(newVouchersEarned);
227+
}
228+
178229
function handleVoucherLogs(logs, session, setVoucherLogs, setVouchersUsed) {
179230

180231
const newVoucherLogs = logs.map((log) => ({
@@ -194,8 +245,35 @@ function handleVoucherLogs(logs, session, setVoucherLogs, setVouchersUsed) {
194245
return (total += e.amount);
195246
}, 0.0);
196247

197-
setVouchersUsed(parseFloat(newVouchersUsed));
198248
setVoucherLogs(newVoucherLogs);
249+
setVouchersUsed(parseFloat(newVouchersUsed));
250+
}
251+
252+
function handleLastSemesterVoucherLogs(logs, session, setLastSemVoucherLogs, setVouchersUsedLastSemester) {
253+
254+
let newVoucherLogs = logs.map((log) => ({
255+
...log,
256+
loggedFor: getUserName(log.LoggedForUser),
257+
usedAt_num: parseISO(log.usedAt).getTime(),
258+
usedAt_label: format(parseISO(log.usedAt), "dd.MM HH:mm").toLowerCase(),
259+
}))
260+
newVoucherLogs = newVoucherLogs.filter((e) => {
261+
const year = new Date(e.usedAt).getFullYear();
262+
return year == new Date().getFullYear();
263+
});
264+
265+
const newVouchersUsed = logs
266+
.filter((e) => {
267+
const person = e.LoggedForUser;
268+
const personId = person.id;
269+
return personId == session.data.user.id;
270+
})
271+
.reduce((total, e) => {
272+
return (total += e.amount);
273+
}, 0.0);
274+
275+
setLastSemVoucherLogs(newVoucherLogs);
276+
setVouchersUsedLastSemester(parseFloat(newVouchersUsed));
199277
}
200278

201279
export default authWrapper(LogsPage);

app/(pages)/(main)/volunteering/logs/voucherLogInput.js

Lines changed: 82 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ export default function voucherLogInput(
77
session,
88
vouchersEarned,
99
vouchersUsed,
10-
setRefresh
10+
setRefresh,
11+
vouchersEarnedLastSemester,
12+
vouchersUsedLastSemester,
13+
startOfSemester
1114
) {
1215
const [numVouchers, setNumVouchers] = useState(0);
1316
const [descriptionVoucher, setDescriptionVoucher] = useState("");
@@ -18,12 +21,21 @@ export default function voucherLogInput(
1821
const [requestResponse, setRequestResponse] = useState("");
1922

2023
const diff = vouchersEarned - vouchersUsed;
24+
const diffLastSemester = vouchersEarnedLastSemester - vouchersUsedLastSemester;
2125

2226
const handleClick = async () => {
27+
28+
let vouchersLeft = numVouchers;
29+
if (startOfSemester && diffLastSemester >= 1) {
30+
vouchersLeft = await handleUseLastSemVouchers();
31+
}
32+
33+
if (vouchersLeft <= 0) return;
34+
2335
const isInvalid = validateVoucherLogRequest(
24-
numVouchers,
36+
vouchersLeft,
2537
descriptionVoucher,
26-
vouchersEarned,
38+
diff,
2739
setNumVouchersError,
2840
setDescriptionVoucherError
2941
);
@@ -37,31 +49,76 @@ export default function voucherLogInput(
3749
},
3850
body: JSON.stringify({
3951
loggedFor: session.data.user.id,
40-
amount: numVouchers,
52+
amount: vouchersLeft,
4153
description: descriptionVoucher,
4254
semesterId: session.data.semester.id,
4355
})
4456
}).then(res => {
45-
setNumVouchers(0);
46-
setDescriptionVoucher("");
47-
if (!res.ok) {
48-
setRequestResponse("Failed to use voucher. Please try again.");
49-
return
50-
}
51-
setRefresh();
52-
setRequestResponse("Voucher used.");
53-
setTimeout(() => {
54-
setRequestResponse("");
55-
}, 5000);
57+
setDescriptionVoucher("");
58+
if (!res.ok) {
59+
setRequestResponse("Failed to use voucher. Please try again.");
60+
return
61+
}
62+
setRequestResponse(numVouchers.toString() + " vouchers used.");
63+
setNumVouchers(0);
64+
setRefresh();
65+
setTimeout(() => {
66+
setRequestResponse("");
67+
}, 7000);
5668
})
5769
};
5870

71+
async function handleUseLastSemVouchers() {
72+
const isInvalid = validateVoucherLogRequest(
73+
numVouchers,
74+
descriptionVoucher,
75+
diff + diffLastSemester,
76+
setNumVouchersError,
77+
setDescriptionVoucherError
78+
);
79+
if (isInvalid) return numVouchers;
80+
81+
const vouchersToUse = Math.min(numVouchers, Math.floor(diffLastSemester));
82+
83+
const res = await fetch("/api/v2/voucherLogs", {
84+
method: "POST",
85+
headers: {
86+
"content-type": "application/json"
87+
},
88+
body: JSON.stringify({
89+
loggedFor: session.data.user.id,
90+
amount: vouchersToUse,
91+
description: descriptionVoucher,
92+
semesterId: session.data.semester.id - 1,
93+
})
94+
});
95+
96+
if (!res.ok) {
97+
setRequestResponse("Failed to use last semester vouchers. Please try again.");
98+
return numVouchers;
99+
}
100+
101+
if (vouchersToUse === numVouchers) {
102+
setDescriptionVoucher("");
103+
setRequestResponse(numVouchers.toString() + " vouchers used.");
104+
setNumVouchers(0);
105+
setRefresh()
106+
setTimeout(() => {
107+
setRequestResponse("");
108+
}, 7000);
109+
return 0;
110+
}
111+
return numVouchers - vouchersToUse;
112+
}
113+
114+
59115
return (
60116
<Stack direction="column" spacing={1}>
61117
<Stack direction="column" spacing={2}>
62118
<Stack direction="column">
63119
<Typography variant="body2">Vouchers remaining: </Typography>
64120
<Typography variant="body2">{diff.toFixed(1)}</Typography>
121+
{lastSemesterVoucherCount(diffLastSemester, startOfSemester)}
65122

66123
<Stack alignItems="end" width="100%">
67124
<Typography variant="caption">25kr / voucher</Typography>
@@ -104,6 +161,16 @@ export default function voucherLogInput(
104161
);
105162
}
106163

164+
function lastSemesterVoucherCount(vouchersEarned, startOfSemester) {
165+
if (!startOfSemester) return null;
166+
return (
167+
<div>
168+
<Typography variant="body2">Vouchers remaining from last semester: </Typography>
169+
<Typography variant="body2">{vouchersEarned.toFixed(1)}</Typography>
170+
</div>
171+
)
172+
}
173+
107174
function validateVoucherLogRequest(
108175
numVouchers,
109176
descriptionVoucher,

app/(pages)/(main)/volunteering/logs/workLogInput.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export default function workLogInput(
6565
setSelectedGroup(null);
6666
setHours(0);
6767
setDescription("");
68-
setRefresh("");
68+
setRefresh();
6969
});
7070

7171
fetch("/api/v2/workGroups", {

app/api/v2/voucherLogs/route.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,21 @@ import { getServerSession } from "next-auth";
99

1010
export async function GET(req) {
1111

12+
const params = req.nextUrl.searchParams
13+
let semesterId = Number(params.get("semesterId"));
14+
1215
const session = await getServerSession(authOptions)
1316
const authCheck = new Auth(session)
1417
.requireRoles([])
1518

1619
if (authCheck.failed) return authCheck.verify(authCheck.response)
1720

18-
19-
2021
try {
21-
const semester = await prisma.Semester.findFirst({select: {id:true}, orderBy: {year: "desc"}})
22+
if (!semesterId) {
23+
const semester = await prisma.Semester.findFirst({select: {id:true}, orderBy: {year: "desc"}});
24+
semesterId = semester.id;
25+
}
26+
2227
const voucherLogs = await prisma.voucherLog.findMany({
2328
select: {
2429
LoggedForUser: {select: {firstName: true, lastName: true, id: true}},
@@ -27,7 +32,7 @@ export async function GET(req) {
2732
description: true
2833
},
2934
where: {
30-
semesterId: semester.id,
35+
semesterId: semesterId,
3136
}
3237
});
3338

app/api/v2/workLogs/route.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,24 @@ import prisma from "@/prisma/prismaClient";
44
import { Auth } from "../../utils/auth";
55
import { getServerSession } from "next-auth";
66
import { authOptions } from "@/app/api/utils/authOptions";
7+
import internal from "stream";
78

89
export async function GET(req) {
910

11+
const params = req.nextUrl.searchParams;
12+
let semesterId = Number(params.get("semesterId"));
13+
1014
const session = await getServerSession(authOptions)
1115
const authCheck = new Auth(session)
1216
.requireRoles([])
1317

1418
if (authCheck.failed) return authCheck.verify(authCheck.response)
1519

1620
try {
17-
const semester = await prisma.Semester.findFirst({select: {id:true}, orderBy: {year: "desc"}})
21+
if (!semesterId) {
22+
const semester = await prisma.Semester.findFirst({select: {id:true}, orderBy: {year: "desc"}});
23+
semesterId = semester.id;
24+
}
1825
const workLogs = await prisma.WorkLog.findMany({
1926
select: {
2027
LoggedByUser: {select: {firstName: true, lastName: true, id: true}},
@@ -24,7 +31,7 @@ export async function GET(req) {
2431
description: true
2532
},
2633
where: {
27-
semesterId: semester.id,
34+
semesterId: semesterId,
2835
}
2936
});
3037

0 commit comments

Comments
 (0)