Skip to content

Commit d02223a

Browse files
committed
wip: update membership system
1 parent 65ab205 commit d02223a

File tree

15 files changed

+533
-235
lines changed

15 files changed

+533
-235
lines changed

apps/dashboard/src/app/(internal)/brukere/components/membership-form.tsx

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ import {
99
getMembershipTypeName,
1010
getSpecializationName,
1111
} from "@dotkomonline/types"
12-
import { getCurrentUTC } from "@dotkomonline/utils"
13-
import { addYears, isBefore } from "date-fns"
12+
import { getNextSemesterStart, getCurrentSemesterStart } from "@dotkomonline/utils"
13+
import { isBefore } from "date-fns"
1414
import type { z } from "zod"
15+
import { createNumberInput } from "@/components/forms/NumberInput"
16+
import { Code, Stack, Text } from "@mantine/core"
1517

1618
export const MembershipWriteFormSchema = MembershipWriteSchema.superRefine((data, ctx) => {
17-
if (isBefore(data.end, data.start)) {
19+
if (data.end && isBefore(data.end, data.start)) {
1820
ctx.addIssue({
1921
code: "custom",
2022
message: "Sluttdato må være etter startdato",
@@ -26,13 +28,14 @@ export const MembershipWriteFormSchema = MembershipWriteSchema.superRefine((data
2628
type MembershipWriteFormSchema = z.infer<typeof MembershipWriteFormSchema>
2729

2830
const DEFAULT_VALUES: Partial<MembershipWriteFormSchema> = {
29-
start: getCurrentUTC(),
30-
end: addYears(getCurrentUTC(), 1),
31+
start: getCurrentSemesterStart(),
32+
end: getNextSemesterStart(),
3133
specialization: null,
34+
semester: 0,
3235
}
3336

3437
interface UseMembershipWriteFormProps {
35-
onSubmit(data: z.infer<typeof MembershipWriteFormSchema>): void
38+
onSubmit(data: MembershipWriteFormSchema): void
3639
defaultValues?: Partial<MembershipWrite>
3740
label?: string
3841
}
@@ -59,6 +62,7 @@ export const useMembershipWriteForm = ({
5962
}),
6063
specialization: createSelectInput({
6164
label: "Spesialisering",
65+
description: "Masterspesialisering",
6266
required: false,
6367
clearable: true,
6468
placeholder: "Velg spesialisering",
@@ -68,6 +72,7 @@ export const useMembershipWriteForm = ({
6872
value: specialization,
6973
label: getSpecializationName(specialization) ?? specialization,
7074
})),
75+
disabled: false,
7176
}),
7277
start: createDateTimeInput({
7378
label: "Startdato",
@@ -77,6 +82,40 @@ export const useMembershipWriteForm = ({
7782
label: "Sluttdato",
7883
required: true,
7984
}),
85+
semester: createNumberInput({
86+
label: "Semester",
87+
description: (
88+
<Stack gap="xs">
89+
<Text size="xs" c="dimmed">
90+
Hvilket semester medlemskapet innebærer. 0-indeksert.
91+
</Text>
92+
<Stack gap="0.25rem">
93+
<Text size="xs" c="dimmed">
94+
<Code>0</Code> → 1. semester (1. årstrinn)
95+
</Text>
96+
<Text size="xs" c="dimmed">
97+
<Code>1</Code> → 2. semester (1. årstrinn)
98+
</Text>
99+
<Text size="xs" c="dimmed">
100+
<Code>2</Code> → 3. semester (2. årstrinn)
101+
</Text>
102+
<Text size="xs" c="dimmed">
103+
...
104+
</Text>
105+
<Text size="xs" c="dimmed">
106+
<Code>8</Code> → 9. semester (5. årstrinn)
107+
</Text>
108+
<Text size="xs" c="dimmed">
109+
<Code>9</Code> → 10. semester (5. årstrinn)
110+
</Text>
111+
</Stack>
112+
</Stack>
113+
),
114+
required: false,
115+
min: 0,
116+
max: 9,
117+
allowDecimal: false,
118+
}),
80119
},
81120
})
82121
}

apps/rpc/src/modules/event/attendance-service.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,17 @@ import {
2323
type User,
2424
type UserId,
2525
findActiveMembership,
26-
getMembershipGrade,
2726
hasAttendeePaid,
2827
isAttendable,
2928
} from "@dotkomonline/types"
30-
import { createAbsoluteEventPageUrl, createPoolName, getCurrentUTC, ogJoin, slugify } from "@dotkomonline/utils"
29+
import {
30+
createAbsoluteEventPageUrl,
31+
createPoolName,
32+
getCurrentUTC,
33+
ogJoin,
34+
slugify,
35+
getStudyGrade,
36+
} from "@dotkomonline/utils"
3137
import {
3238
addDays,
3339
addHours,
@@ -600,6 +606,8 @@ export function getAttendanceService(
600606
(!isFuture(reservationActiveAt) && (pool.capacity === 0 || poolAttendees.length < pool.capacity)) ||
601607
options.immediateReservation
602608

609+
const userGrade = membership.semester != null ? getStudyGrade(membership.semester) : null
610+
603611
const attendee = await attendanceRepository.createAttendee(
604612
handle,
605613
attendance.id,
@@ -610,7 +618,7 @@ export function getAttendanceService(
610618
earliestReservationAt: reservationActiveAt,
611619
reserved: isImmediateReservation,
612620
selections: [],
613-
userGrade: getMembershipGrade(membership),
621+
userGrade,
614622
} satisfies AttendeeWrite)
615623
)
616624

apps/rpc/src/modules/event/attendance.e2e-spec.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
type MembershipWrite,
66
findActiveMembership,
77
} from "@dotkomonline/types"
8-
import { getCurrentUTC } from "@dotkomonline/utils"
8+
import { getCurrentUTC, getCurrentSemesterStart, getNextSemesterStart, isSpringSemester } from "@dotkomonline/utils"
99
import { faker } from "@faker-js/faker"
1010
import type { ApiResponse, GetUsers200ResponseOneOfInner } from "auth0"
1111
import { addDays, addHours, addMinutes, isFuture, subHours } from "date-fns"
@@ -41,9 +41,10 @@ export function getMockAttendancePool(input: Partial<AttendancePoolWrite> = {}):
4141
export function getMockMembership(input: Partial<MembershipWrite> = {}): MembershipWrite {
4242
return {
4343
type: "BACHELOR_STUDENT",
44-
start: addDays(getCurrentUTC(), -100),
45-
end: addDays(getCurrentUTC(), 100),
44+
start: getCurrentSemesterStart(),
45+
end: getNextSemesterStart(),
4646
specialization: null,
47+
semester: isSpringSemester() ? 1 : 2,
4748
...input,
4849
}
4950
}

0 commit comments

Comments
 (0)