feat(classes): optional required-form gate at signup (waiver-on-file)
Pure signupFormEligibility (manager override bypasses) + 4 tests.
signUpForClass now: classes.manage override + sign-up-on-behalf
(targetMemberId), and a hard form gate -- if the class has a
required_form_id the member must have a form_submissions row on file
(checked via service client, since a class manager need not hold
forms.manage). create/updateClass validate the form is in-space and
published. listUpcomingSessions exposes required_form {title,url,
satisfied}. Manage UI: published-form picker on create/edit + a 'requires
form' badge. Member UI: shows the requirement, links to the form, and
replaces Sign up with 'Complete required form' until it is on file.
Mirrors the equipment cert-gate pattern.
This commit is contained in:
@@ -63,6 +63,21 @@ export function canSignUp(input: {
|
||||
return { ok: true }
|
||||
}
|
||||
|
||||
// A class may require a form (waiver/intake) on file. Mirrors the equipment
|
||||
// required-certification gate: the requirement is bypassed for a manager
|
||||
// acting with override (e.g. signing a member up on their behalf). "On file"
|
||||
// means the member has at least one completed submission of that form.
|
||||
export function signupFormEligibility(input: {
|
||||
requiresForm: boolean
|
||||
memberHasForm: boolean
|
||||
managerOverride: boolean
|
||||
}): SignupEligibility {
|
||||
if (input.requiresForm && !input.memberHasForm && !input.managerOverride) {
|
||||
return { ok: false, reason: 'This class requires a form to be completed before you can sign up.' }
|
||||
}
|
||||
return { ok: true }
|
||||
}
|
||||
|
||||
// When a registered member cancels and a seat frees, the earliest-signed-up
|
||||
// waitlisted member is promoted. Returns that signup id, or null if there is
|
||||
// no free seat or no one waiting.
|
||||
|
||||
Reference in New Issue
Block a user