Parent-Teacher Meeting (PTM)
A teacher creates a PTM as a typed alert. It fans out as a
MEETINGannouncement to the targeted sections. Parents see it on their PTM page (with the join link if it's online). Students see it under their school services. There's no booking yet — slot booking is exposed in the form as "Individual Meetings" but the parent-side surface today is a unified list with upcoming and past meetings.
At a glance
| Who can do this | Teachers schedule · Parents view & join · Students view (read-only) |
| Where it lives | Teacher app /dashboard/alerts/ptm (and /dashboard/alerts/ptm/:id/edit) · Parent app /ptm · Student app /dashboard/school/ptm |
| Alert type | MEETING (priority MEDIUM by default) |
| Triggers notifications? | Yes — push + in-app on publish, scheduled to send at scheduledAt |
| Related features | Notice Board & Alerts · Notifications |
How it flows
Status lifecycle
The parent app derives Upcoming vs Past purely from eventAt (or scheduledAt as fallback) compared to Date.now() — there's no explicit "Cancelled" or "Completed" status surfaced.
Step-by-step
1. Teacher schedules the PTM
- App / route: Teacher app →
/dashboard/alerts/ptm(create) or/dashboard/alerts/ptm/:id/edit(revise an existing one). - Form fields:
- Meeting title (required).
- Meeting type (radio):
- Regular PTM — open meeting for all parents at scheduled time.
- Individual Meetings — appointment-based, parents could book one-on-one slots.
- Urgent Meeting — private meeting for selected students' parents only.
- Purpose / Agenda (required, free text — "helps parents prepare").
- Meeting Mode: Offline / Online.
- Location (offline) or Meeting Link (online — accepts Google Meet, Zoom, any URL; parents can tap to join).
- Meeting date & time (
eventAt) — when the meeting happens. Past times allowed only when editing a meeting whoseeventAtis already past (so a teacher can patch up history without breaking validation). - Attachments — S3-uploaded files.
- Save vs Publish:
Save Draftpersists withstatus = DRAFTand does not notify anyone.Publishopens the AlertTargetScheduleSheet, where the teacher picks target classes / sections and thesendAt(when the alert notification fires). On confirm, status flips toPUBLISHED.
- Publish is disabled until both
meetingTitleandmeetingAtare filled.
2. Notification fan-out
- At
sendAt, all targeted students and their parents receive a push + in-app notification of typeMEETING. - The notification deep-links into the parent's
/ptmpage (parent app) and the student's/dashboard/school/ptm?id=:id(student app, opening the detail drawer).
3. Parent views & joins
- App / route: Parent app →
/ptm. If multiple children are linked, the page resolves a child vialocation.state.studentProfileIdor falls back to the first linked student. - The page splits meetings into Upcoming (sorted ascending — soonest first) and Past (sorted descending — most recent first).
- Each card shows: unread dot, title, description, meeting date/time, Mode badge (Online / Offline), Priority badge (HIGH / MEDIUM / LOW), and — if Online — a Join Meeting link that opens the meeting URL in a new tab.
4. Student views
- App / route: Student app →
/dashboard/school/ptm. - Two sections: CurrentPTM (upcoming) and PastPTMList, both pulling
MEETING-type student announcements. - Tapping a card opens PTMDetailDrawer with the agenda, location/link, mode, and attachments. The URL gains
?id=:idso the drawer is deep-linkable; closing it strips the param. - Read-only: students cannot book, RSVP, or chat from this surface.
5. Editing or rescheduling
- Teacher returns to the alerts list, taps the PTM, gets routed to
/dashboard/alerts/ptm/:id/edit. - All fields are editable, including
eventAt(past dates allowed for retroactive fixes) andmeetingMode. - Re-publishing updates the existing alert; recipients see the updated card on next load.
Edge cases & things to test
- Online with no link: teacher publishes Online mode but leaves the link blank — parent card should not show a broken Join button.
- Offline with empty location: same — should not crash; "Location" should just be empty.
- Past
eventAtat publish time: should be allowed only on edit (where the meeting is already past); on create, the date picker disables past dates. - Different
eventAtvsscheduledAt: meeting at noon Friday but alert sends Wednesday morning — parent should see the Wednesday push but the card date should read Friday noon. - Multi-section publish: target Sections A + B — both parent groups get one alert each, no duplicates.
- Multi-child parent: parent with kids in two sections, both having PTMs — switching the active student should swap the PTM list.
- Notification deep-link: tap a
MEETINGpush on parent app → lands on/ptmwith the right card visible. On student app → opens/dashboard/school/ptm?id=:idand pre-opens the drawer. - Edit after parents have joined / read: read state and unread dot should persist; the edited card should not re-mark itself unread for everyone (or, conversely, should re-mark unread if the time changes — confirm intended behaviour).
- Long meeting title / agenda: 500-char title — should clip in the card with line-clamp without breaking the layout.
- Attachments: 0 attachments vs 5 attachments — parent and student detail surfaces should handle both gracefully.
- Time zone: meeting date is stored UTC; verify both apps render in the device's local time, especially around midnight crossovers.
- "Individual Meetings" type: today the form captures the type, but there's no parent-side slot-booking UI — verify the type round-trips through edit and that no UI advertises booking that doesn't exist.
Related
- Notice Board & Alerts — PTM is a typed alert; the same alert system underlies it
- Notifications — push + in-app fan-out at
sendAt - Homework — sibling alert type, same publish + target-schedule pattern