Skip to content

Schools ​

The Schools module tracks every discipleship class, leadership track, or training course your church runs. A "school" in GCM is the container β€” Foundations, Membership Class, Leadership 101, School of Ministry. Members get enroled into a school, work through its objectives, and eventually graduate with a grade on the transcript.

Schools list

Three things to know upfront ​

ConceptWhat it is
SchoolA class or course (row in schools).
EnrolmentOne member's seat in one school. Has a status β€” enrolled, completed, or withdrawn. Stored in school_enrolments (British spelling β€” yes, on purpose).
GraduationA separate record marking the member finished, with a date and an optional grade. Stored in school_graduations.

A member can be enroled in many schools at once, and a school can have a long history of past graduates without losing its current cohort. Enrolments and graduations are independent tables so you can keep clean transcripts even after you reorganise the curriculum.

Objectives & completion tracking ​

Each school can define an ordered list of objectives β€” Read Genesis 1-12, Memorise key verses, Submit final essay. As a student works through them, the shepherd ticks each objective off on the enrolment record. Per-objective grades are supported too.

The student's row shows a live progress bar and a 3/8 style counter so you can see at a glance who's on track and who's stalled.

TIP

Don't pre-load all your objectives the day you create a school. Start with three or four, see how the first cohort moves through them, then refine. Schools that try to nail the curriculum upfront usually end up rewriting it anyway.

How enrolments flow into graduations ​

When you mark a member as graduated, two things happen automatically:

  1. A new row is written to school_graduations with the date and grade.
  2. Any active enrolled rows for that member and school are flipped to completed and stamped with the graduation date.

This means you don't have to remember to "close out" the enrolment β€” graduating handles it. You'll see the change reflected immediately in the Currently enrolled card on the school detail page.

WARNING

If you record a graduation for a member who was never enroled (e.g. back-filling an old graduate from a paper register), the graduation still saves but no enrolment row is touched. That's fine β€” graduations stand on their own.

Hierarchy scoping ​

The schools list, enrolments tab, and graduations tab all respect your org hierarchy filter at the top of the page. Pick a region, branch, or campus and the counts collapse to just the members assigned to that unit.

This is how multi-campus churches share one curriculum (the school row stays global) but cleanly separate the cohorts (each campus's enrolments only show under that campus's filter).

Attendance integration ​

Every school detail page renders an embedded attendance chart powered by EntityAttendanceChart. If you also create matching meetings under Attendance, you get a unified view: enrolment cohort + week-by-week class attendance, side by side on one page.

See School reporting for how the numbers tie together.

Permissions ​

ActionAdminShepherdTeacherMember
View schools listyesyes (scoped)yesno
Create / edit / delete schoolyesnonono
Enrol a memberyesyes (scoped)yesno
Mark objective completeyesyes (scoped)yesno
Record graduationyesyes (scoped)yesno
View own enrolmentsn/ayesyesyes (profile only)

"Scoped" means the user only sees enrolments for members in units they manage. The frontend permission policy lives in src/shared/lib/access-policy.ts β€” adjust the schools.write / schools.read keys in Users & Roles if your church uses custom roles.

What gets recorded ​

Each enrolment row stores:

  • School β€” the class.
  • Member β€” the student.
  • Date of enrolment β€” when they joined the cohort.
  • Date of completion β€” set automatically when graduated.
  • Status β€” enrolled, completed, or withdrawn.

Each graduation row stores:

  • School + member.
  • Date graduated.
  • Grade β€” optional decimal score.

Both tables soft-delete (a deleted_at timestamp). Restoring a removed enrolment is a database-level operation β€” ask an admin if you accidentally removed someone mid-term.

Common questions ​

Can the same member be enroled in the same school twice? Not while the first enrolment is still active. GCM blocks duplicate active enrolments. Once the first run is completed or withdrawn, you can re-enrol them for a fresh cohort β€” useful for repeat courses like Foundations.

What happens when I delete a school that has students? A dialog asks: remove the students from this school (soft-delete the junction rows) or reassign them to another school (rewrite the foreign key). The school itself is then soft-deleted. Same flow for bulk deletes.

Can students enrol themselves? Not from the member portal directly β€” enrolments are recorded by staff. If you want self-enrolment, build a form that creates a workflow which then writes the enrolment.

Next steps ​

  1. Add a school β€” set up your first class.
  2. Set objectives β€” define the curriculum.
  3. Enrol members β€” fill your first cohort.
  4. Record graduations β€” close the loop.
  5. School reporting β€” see how cohorts are tracking.