- Shipped
- August 25, 2026 at 8:21 PM UTC
- Author
- Kamo
- Commit
- d54f906
Availability was webinar_availability_slot: a dated (date, start, end) row owned by a WebinarType. A presenter who ran three kinds of session had to declare the same Tuesday morning three times, and the copies drifted the moment one was edited — the platform would happily offer a visitor a time the presenter had already withdrawn somewhere else. Capacity to host is a fact about a PERSON, so it now lives in MemberAvailabilityWindow, declared once and read by every type that lists that member as a presenter. Windows also recur: "Tuesdays 9 to noon" is one row with a weekday and an optional effective range, not a row per Tuesday forever. Three consequences worth calling out: - WebinarType gains BOOKING_HORIZON_DAYS. A recurring window has no last date, so something has to say how far ahead the booking page looks; without it the resolver would expand a weekly window without end. - Each window stores the IANA zone it was AUTHORED in. Resolving the zone at read time would mean a member updating their profile timezone silently moved every window they had ever declared, including ones already on offer. - WebinarChildOrgRestriction re-anchors from a dated slot to the TYPE plus an optional weekday. It is written by the CHILD org to narrow what its parent offers its staff, and pointing at one date meant every date the parent added later arrived unrestricted — silently reverting to wide open. CalendarEventRepository gains findBusyForMemberInRange, which is what actually blocks out a window. It replaces a creator-only query that also counted cancelled events and decoderd invitations as busy, so a presenter with a diary full of other people's meetings read as completely free. New right MANAGE_WEBINAR_SCHEDULES (241) gates managing SOMEBODY ELSE's availability. Editing your own needs no right at all. Note: RoleRightType.java and RoleRightHierarchyTest.java are shared with an in-flight clinical-rights change already present in the working tree. The audited totals at HEAD expected 184 children against an enum that had 167, so that test was red before this commit; the combined state is green (1843 tests).