HandbookCommunication31

School calendar & events.

A school runs on dates. Term starts, half-term break, the exam window, the parent evening, sports day, the staff meeting that cancels lessons. Scatter those across notice-boards and group chats and someone always misses one. YESS keeps a single calendar the whole school reads from — built from real events you publish, fed automatically by the terms and holidays the academic structure already knows, projected into every portal in the reader's own language, and subscribable to the calendar app on every phone. This handbook is how an event goes from a draft in the admin office to a reminder on a parent's lock screen.

  • 9event types
  • 8calendar sources
  • iCalphone subscribe
  • ≈13 minto read

Prologue

One calendar, everyone reads#

At the centre of this module is one table — school_calendar_events — and one promise: every date the school cares about lives there once, and every screen reads from it. A holiday, a closure, a meeting, an exam, an assembly, a parent day, a sports day, a general event — all of them are rows of the same shape, differing only by type.

But the calendar is more than what an admin types in. It is an aggregator. The terms and holidays the academic structure already holds flow in automatically. Exams, field trips, parent-teacher conferences, live classes, holiday-class sessions — each surfaces on the calendar from its own module, so the family looking at "what is coming up" sees the whole school, not just the events someone remembered to re-enter.

Every date the school cares about, in one place, in every reader's language, on every device.

Chapter one

A term on the calendar#

Follow one term and the rest of the book is detail.

Before term. The registrar sets the academic year and its three terms in the academic structure, and enters the half-term break as a term holiday. Without anyone re-typing it, that holiday appears on the school calendar as an all-day event that cancels the timetable — a database trigger mirrored it across.

Week one. The head opens /dashboard/events and creates the term's fixtures: a parent evening (RSVP on, capacity 200), a sports day (all-day, cancels lessons), a staff meeting. Each starts as a draft; one click publishes it, and notify parents fans a notification out to every family in their own language.

Mid-term. A parent opens /portal/calendar on her phone. She sees the parent evening, her daughter's exam dates, the consented field trip, and the fee due date — all colour-coded by source. She taps the parent evening, RSVPs going for two, and the seat count ticks up. The event was already near full; a later canceller frees a seat and the next person on the waitlist is promoted automatically and notified.

All term. A teacher who pasted his YESS calendar link into Google Calendar weeks ago never opens the app at all — his classes, his invigilation slots, and the school events simply appear on the phone he already checks.

Chapter two

The event record#

Events are created and managed at /dashboard/events — a card grid with a KPI strip, type and status filters, and create/edit/delete/publish. Every event carries a handful of decisions:

What an event carries

  1. 1

    Type

    One of nine: holiday, closure, meeting, exam, assembly, parent_day, sports_day, event, or custom. Holidays and closures auto-force the cancels-timetable flag, because a closed day has no lessons.

  2. 2

    Time mode

    All-day, half-day (morning or afternoon), evening, or timed. Time inputs only appear for the timed and evening modes — an all-day event needs no clock.

  3. 3

    Dates

    A start and end date (the end may not precede the start), with optional start and end times for the timed modes.

  4. 4

    Audience & campus

    On a multi-campus school you pick a campus (or leave it school-wide); you can also aim the event at a role group — staff, families, parents, or students — so it surfaces only in the right portals.

  5. 5

    Notify & cancels-timetable

    Toggle notify-parents to fan a notification out on publish, and cancels-timetable to mark the day lesson-free (forced on for holidays and closures).

  6. 6

    Status

    Draft or published. A draft is invisible to families; publishing surfaces it everywhere and, if notify-parents is on, sends the alert.

At the row level every in-school user can read and write calendar events — the finer control of who may create or publish lives in the permissions above, checked by the screen. Renaming or moving a published event updates it everywhere it appears at once.

Type, time mode, dates, audience, and the notify and cancels-timetable toggles — one event, every decision in one dialog.

Chapter three

Terms and holidays flow in#

The calendar is not where you define the academic year — that lives in the academic structure, with the terms and their holidays. But you should never have to enter a holiday twice, so YESS bridges the two automatically.

Holidays sync by trigger. When a term holiday is created, edited, or removed, a database trigger mirrors it into school_calendar_events as a published, all-day, timetable-cancelling holiday — matched back to its source row so an edit updates the calendar copy and a delete removes it. A one-time backfill brought existing holidays across when the bridge was built.

Term and year boundaries appear as markers. The school-wide calendar at /dashboard/calendar projects read-only markers for "term begins / ends" and "academic year begins / ends" straight from the structure. These are synthetic — you cannot edit or delete them from the calendar, because the calendar is reading them, not owning them. Change a term's dates in the academic structure and the markers move with it.

Chapter four

The aggregated calendar#

The staff calendar at /dashboard/calendar is the fullest view — an agenda hero over a month-and-week grid, with source filter chips. It merges eight streams into one surface: published school events, the term and year markers, exam sessions, holiday-class windows, field trips, parent-teacher conferences, live classes, and the holidays synced from the structure. Each source is colour-coded so a glance tells you whether a block is an exam, a trip, or a meeting.

Because the calendar is projecting from live modules, it is always current. Schedule an exam in the examinations module and it appears here; confirm a field trip and it lands on the calendar; book a parent-teacher conference and it shows for both parties. Nothing here is a stale copy waiting for a refresh.

Chapter five

RSVP and the waitlist#

An event can ask for a reply. When an event is marked RSVP-required, the portal renders a response block on the event's page at /portal/events/[id] with three buttons — going, interested, can't make it — and a party-size selector. Responses are written through a database function into the school_event_rsvps table, one row per person per event, with a capacity bar showing seats taken against the limit.

The waitlist runs itself. If an event is full and a waitlist is enabled, a new going reply is parked as waitlisted with a queue position rather than rejected. When a confirmed attendee later cancels, a trigger fires a promotion routine: the next person on the waitlist is moved into the vacated seat, notified with a deep link to the event, and the queue is renumbered. No organiser has to chase the list.

Chapter six

Everyone's own calendar#

The same events reach each audience as a feed shaped for them. A parent or student opens /portal/calendar (or the simpler "what's coming up" list at /portal/events) and sees a personal merge: published school events aimed at them, their own exam schedule, consented field trips, parent-teacher conferences, holiday-class sessions, assignment due dates, and fee due dates — each colour-coded by where it came from, windowed to the months around today.

A teacher opens /teacher/calendar and gets their own merge — school events for staff, exam sessions, their live classes, and their assignment deadlines. The role-group audience you set on an event is honoured here: a staff-only event does not clutter a parent's feed.

And when an event is published with notify parents on, the calendar does not wait for anyone to open a screen — it dispatches a notification to every family in their preferred language, so the date arrives even before they look.

Chapter seven

Subscribe to the calendar#

The most-loved feature in this module is the one a school never has to explain twice: a personal subscription link that drops the YESS calendar straight into Google Calendar, Outlook, or Apple Calendar. Each user has a private feed at /api/cal/[token] — a standards-compliant iCalendar feed they paste once and forget.

The feed is built per person and is richer than any single screen. For a student it carries school events and their exams; for a parent, the same for every linked child, prefixed with the child's name; for a teacher, their weekly timetable as a proper recurring series (with the right days skipped when a substitution covers them), their invigilation slots, field trips they lead or accompany, holiday-class sessions, parent-teacher conferences, and university-style course sessions. It looks sixty days back and a year ahead, and refreshes itself every few minutes.

What makes it elite

What makes this calendar elite#

Six things that make this elite

  1. 1

    Owned events, projected sources

    The calendar owns the events you publish and projects everything from other modules — exams, trips, conferences, holidays — so the family sees the whole school without anyone re-entering a date.

  2. 2

    Holidays you never type twice

    A term holiday entered in the academic structure mirrors itself onto the calendar by trigger, as a published, timetable-cancelling event matched to its source — edit it once, it updates everywhere.

  3. 3

    A waitlist that runs itself

    When a seat frees on a full event, the next person on the waitlist is promoted and notified automatically, the queue renumbered — no organiser chasing a spreadsheet of replies.

  4. 4

    A feed per audience, in their language

    Parents, students, and staff each get a merge shaped for them, honouring the event's role-group audience, with notify-parents fanning the alert out in the family's own language on publish.

  5. 5

    Subscribe once, sync forever

    A private iCalendar link drops the school's calendar into Google, Outlook, or Apple — a teacher's recurring timetable, a parent's children's exams — refreshing on its own.

  6. 6

    Campus-aware

    On a federation, an event can be aimed at one campus or the whole school, and campus-pinned views show that campus's events plus the school-wide ones.

Planned features

What comes next#

The event record, draft-and-publish, the term-and-holiday sync, the aggregated calendar, RSVP with a waitlist, the personal feeds, the notify-parents fan-out, and the iCalendar subscription are all live. The honest gaps below are still being finished.

Five honest gaps

  1. 1

    Recurring events in the editor

    The schema holds a recurrence rule, and the subscription feed already emits recurring timetable classes — but the event create form does not yet let you author a repeating calendar event. A weekly staff meeting is, for now, a series of single events.

  2. 2

    RSVP controls in the create form

    RSVP, capacity, deadline, and waitlist are fully built on the response side, but the everyday event dialog does not yet expose the switches to turn them on — so RSVP appears on events set up for it, not on every new one.

  3. 3

    Richer audience targeting

    An event can be aimed at a campus and a role group today; the schema reserves finer targets — a specific class, section, or list of students — which the create form does not yet produce.

  4. 4

    Named attendee lists

    The event's attendees view currently shows anonymised identifiers rather than full names; joining the name in is a small, planned polish.

  5. 5

    Event-to-attendance

    An event can cancel the timetable, but attending an event does not yet write an attendance record. Linking RSVPs or check-ins to the attendance engine is a future connection.

Adjacent modules

Where the calendar connects#

Tutorial

Do it step by step#

Publish an event end to end — from a draft in the admin office to a notification on a parent's phone and a row in their calendar app. Five steps, the way the school office actually works.

  1. 1

    Create the event

    Open /dashboard/events and click Add event. Pick a type — say parent_day — set the time mode and dates, choose the audience (families, or a campus), and decide whether it cancels the timetable.

    Holidays and closures force the cancels-timetable flag on, because a closed day has no lessons.

  2. 2

    Publish and notify

    Save it as a draft to review, then publish. Turn on notify parents and publishing fans a notification out to every family in their own language — the date arrives before anyone opens a screen.
  3. 3

    Check the aggregated view

    Open /dashboard/calendar to see your event sitting alongside the term markers, the holidays synced from the structure, exams, and trips — eight sources on one colour-coded surface.
  4. 4

    See it as a parent

    The family opens /portal/calendar (or /portal/events) and finds the event in their personal feed with their child's exams and fee dates. If RSVP is on, they reply going from the event page and a seat is reserved.
  5. 5

    Subscribe on the phone

    Encourage every family and teacher to paste their personal subscription link into their phone's calendar app. From then on, every published event, exam, and class appears on the device they already check — no app to open.

Typed once, published once — and the date is on a notice-board, in a portal feed, and on a parent's lock screen.