Student Health Records Module
Capture and protect sensitive student health information. Parents provide and confirm records; a doctor's note is required as proof. Only authorised staff in the Health Records Access group can view clinical data.
Purpose
Schools need accurate health information to care for students during the school day — allergies, medications, chronic conditions, emergency contacts for medical events. This module:
- Collects health data from parents/guardians at registration and on updates
- Requires parent confirmation on the dashboard so students cannot submit false information alone
- Requires a doctor's note (PDF/image) as supporting proof for declared conditions
- Restricts viewing to school nurse and top administration via a dedicated access group
Who can see what
| Role / group | Access |
|---|---|
| Parent / guardian | Submit and edit own child's health form; confirm accuracy; upload doctor's note; see summary on dashboard (not other students) |
| Health Records Access group | View full records, nurse notes, documents; add clinical observations; flag for parent re-confirmation |
| Director / System admin | Same as Health Records Access; manage group membership; audit reports |
| Teachers, bursar, reception (default) | No access to health details — may see only a non-clinical flag e.g. "Medical alert — contact nurse" if school enables emergency badge |
| Students | No access — parent account only |
Health Records Access group
Configurable per school in admin settings. Staff are assigned explicitly — not by job title alone. Typical members:
- School nurse(s) per campus
- Head teacher / director (optional per school policy)
- Designated welfare officer
Implemented as HEALTH_RECORDS_VIEWER permission + optional custom group health-records-access in auth-service. Gateway enforces on all /api/v1/health/** routes except parent portal paths.
Registration workflow
- Reception creates student (Core module)
- Parent invited to portal or completes health section at office with staff
- Health questionnaire — parent fills required fields per school template
- Parent uploads doctor's note (required if any condition/medication/allergy declared; required for boarding schools — configurable)
- Record saved as PENDING_PARENT_CONFIRMATION
- Parent taps "I confirm this information is true and complete" on dashboard
- Status → CONFIRMED; nurse notified for review
- Enrollment can proceed to ACTIVE once health section submitted; school may block full access until CONFIRMED (configurable)
Parent dashboard
Each linked child shows a Health record card:
- Status badge: Not started / Pending confirmation / Confirmed / Update required
- Summary lines: allergies, medications (labels only — full detail in form)
- Doctor's note: attached ✓ or missing ⚠
- Actions: Review & confirm, Update health information, Upload doctor's note
Updates after confirmation reset status to UPDATE_PENDING until parent re-confirms and (if conditions changed) new doctor's note uploaded.
Data captured
| Field | Required | Notes |
|---|---|---|
| Known allergies (food, drug, environmental) | Conditional | Free text + structured tags; doctor's note if any allergy listed |
| Chronic conditions (asthma, diabetes, epilepsy, etc.) | Conditional | Doctor's note required if yes |
| Current medications & dosage schedule | Conditional | Doctor's note required if yes |
| Blood group | Recommended | — |
| Disability / special needs (IEP-related) | Optional | May link to requirements checklist module |
| Immunisation status / last tetanus | Configurable | School policy |
| Family doctor name & phone | Recommended | — |
| Hospital preference | Optional | — |
| Emergency action plan | Conditional | Required for serious conditions; attach plan PDF |
| Parent/guardian declaration | Yes | Checkbox + timestamp on confirm |
| Doctor's note attachment | Conditional | PDF/JPG via file-service; max 5 MB |
Record statuses
| Status | Meaning |
|---|---|
| NOT_STARTED | No health form for student |
| DRAFT | Parent started, not submitted |
| PENDING_PARENT_CONFIRMATION | Submitted; awaiting parent confirm on dashboard |
| CONFIRMED | Parent confirmed; nurse may review |
| NURSE_REVIEWED | Nurse verified record and documents |
| UPDATE_PENDING | Parent edited after confirm — must re-confirm |
| RECONFIRMATION_REQUIRED | Nurse requested parent update (e.g. expired doctor's note) |
Nurse & administration actions
- Queue: students pending nurse review, expiring doctor's notes, unconfirmed records
- Add confidential nurse notes (not visible to parents unless school policy shares summary)
- Log incident / sick bay visit (optional sub-feature, same access group)
- Request parent re-confirmation with reason
- Export audit log for director (who accessed which record, when)
Security & compliance
- Separate
health_db— no health fields in student-service public tables - Encryption at rest (PostgreSQL + MinIO for documents)
- Uganda Data Protection Act — explicit consent at confirmation; retention policy configurable
- Immutable
health_access_auditlog (read, export, print) - No health data in SMS/email body — alerts say "Action required on health record" with portal link only
- API returns 403 for unauthorised roles — not 404 (to avoid enumeration, optional mask as 404 for non-existent student)
API endpoints (health-service via gateway)
# Parent portal
GET /api/v1/portal/health/{studentId} # summary + status (guardian-linked only)
PUT /api/v1/portal/health/{studentId} # submit / update form
POST /api/v1/portal/health/{studentId}/confirm # parent confirmation
POST /api/v1/portal/health/{studentId}/documents # upload doctor's note → file-service
# Health Records Access group only
GET /api/v1/admin/health/students?campusId=&status=
GET /api/v1/admin/health/students/{studentId} # full record + audit on read
POST /api/v1/admin/health/students/{studentId}/nurse-note
POST /api/v1/admin/health/students/{studentId}/request-reconfirmation
GET /api/v1/admin/health/audit?studentId=&from=&to=
# Auth admin
PUT /api/v1/admin/groups/health-records-access/members
Data model (health_db)
student_health_records
id, organization_id, campus_id, student_id
status, version
allergies JSONB, chronic_conditions JSONB, medications JSONB
blood_group, disability_notes, immunisation_notes
family_doctor_name, family_doctor_phone, hospital_preference
emergency_action_plan_file_id
parent_confirmed_at, parent_confirmed_by (guardian_id)
parent_declaration_text
nurse_reviewed_at, nurse_reviewed_by
created_at, updated_at
health_documents
id, health_record_id, document_type (DOCTORS_NOTE, ACTION_PLAN, OTHER)
file_id, uploaded_by, uploaded_at, expires_at
health_nurse_notes
id, health_record_id, note, author_id, created_at
health_access_audit
id, health_record_id, student_id, actor_id, action (READ|EXPORT|UPDATE)
ip_address, created_at
health_record_status_history
id, health_record_id, from_status, to_status, actor_id, note, created_at
Events
HealthRecordSubmitted→ notification to nurse groupHealthRecordConfirmed→ nurse queueHealthReconfirmationRequired→ parent SMS/email
See also: database design · architecture · parent portal