System Administrator Playbook
You bring the School module to life and keep it healthy. This playbook is your
operational checklist: enable module_school and run the per-tenant
migrations, grant permissions with the segregation of duties the module depends on,
configure the portals and the default grading policy, provision and troubleshoot portal
logins, and switch on the optional integrations. Everything here is grounded in the live
module — reproduce it exactly.
Who you are
You hold school_settings and, typically, the full permission set — you are the
person who turns the module on for a tenant and decides who can do what inside it. You do
not have to be a teacher or registrar; you are the operator. Your two most important jobs
are making the module reachable on every tenant and separating the grade-release
duties so no one can publish their own grades.
The permissions you work with
Permissions are granted in the core Roles editor. The base permit is
school; each of the 14 pages has its own “Enabled” toggle, and sensitive
actions add restricted or segregated permits. You will spend most of your time on the
handful below.
| Permit | What it unlocks | Notes |
|---|---|---|
school | Base access + the School Dashboard | Everyone who uses School needs this. |
school_settings | The School Settings page | Your own permit. Saving settings is audited. |
school_grade_release | Submit grades for release | Give to the encoder/teacher. |
school_grade_approve | Approve & release grades and generate report cards | Give to the head — a different person. |
school_health | Learner health / medical (view) | Restricted; every view is audited. |
school_child_protection | Confidential safeguarding cases (+ _create/_update) | Restricted, segregated; every read is audited. |
school_export | Compliance downloads (masterlist) | Every export is audited. |
The complete permission list — page enablers, CRUD children, and restricted permits — is in the Screen, Route & Data Reference, and the suggested per-role presets are in the Roles & Access Map.
SOP 1 — Enable the module and migrate every tenant
The school_* tables are created per tenant. Turning the module on in
Settings does not create the tables — you must run the module migrations on each tenant
database, and validate them there, before staff use the pages.
-
Turn the module on
Go to Settings → Manage Modules and enable School. This flips the
module_schoolsetting for the current tenant. -
Run the module migrations
From the project root, run the migration command so the
school_*tables (tracked inmigrations_school) are created on this tenant:php erpat migrate:modules -
Repeat and validate on every tenant
Because school tables are per-tenant, run and confirm the migrations on each tenant database where School will be used. A tenant that has
module_schoolon but no migrations run will show empty pages or errors. -
Confirm the sidebar
Sign in as a user with the
schoolpermit and confirm the single School menu group (graduation-cap icon) appears with its pages.
php erpat migrate:modules against each tenant DB and verify the pages load
before handing over. School depends on Learn (courses) only for the
optional LMS bridge, which is fail-safe when Learn is off — you do not need Learn to run
grading or the portals.
SOP 2 — Grant permissions and enforce segregation of duties
Grant the base school permit plus the page enablers each role needs, then be
deliberate about the two grade permits and the restricted domains.
-
Give each role its pages
In the Roles editor, enable the page permits the role needs — for example the registrar gets
school_enrollment,school_learners,school_guardians,school_academicsand their create/update children; a teacher getsschool_attendance+school_attendance_updateandschool_grades+school_grades_update. -
Split the grade duties across two people
Grant
school_grade_releaseto the encoder/teacher andschool_grade_approveto the school head — never to the same person. The encoder submits; the head approves and releases. The system prevents a person from approving their own grades. -
Lock down the sensitive domains
Grant
school_health(clinic/nurse) andschool_child_protection(guidance) only to the specific people who need them. Every view of those records is written to the audit trail.
draft → submitted → approved → released with no skipping.
school_grade_release can only submit;
school_grade_approve approves and releases. Keeping them on different accounts
is what makes “no self-publishing” real. See
the grading governance.
SOP 3 — Configure School Settings
The School Settings page (school/settings) carries a small set of
toggles and the default grading policy. Saving is audited (update_settings).
| Setting | Values | Effect |
|---|---|---|
school_parent_portal_enabled | on / off | Shows or hides the parent portal at school/parent. |
school_student_portal_enabled | on / off | Shows or hides the student portal at school/student. |
school_visitor_pass_enabled | on / off | Shows or hides the Visitor Pass page in the sidebar. |
school_default_grading_policy | do8_2015 (default) · matatag_do10_2024 | The default policy the grade engine resolves schemes against. |
is_current). That flag drives every “current SY” query — the
portals, rosters, attendance registers, and report cards all follow it.
SOP 4 — Turn on customer sign-in and reach the portals
The parent and student portals reuse the existing customer sign-in, so they also
depend on the core allow_customer_signin setting being enabled. With that on
and the relevant portal toggle enabled, the portals are reachable.
-
Enable customer sign-in
Confirm the core
allow_customer_signinsetting is on. Without it, a provisioned parent or student account cannot log in even though the portal is enabled. -
Point people to the portal
Once customer sign-in and the matching portal toggle are on, a provisioned parent signs in and lands on the parent portal at
school/parent, and a student atschool/student(theschool/portaldispatcher also routes a signed-in customer to the right one). Each portal controller enforces its own access checks — a parent only ever sees their verified children and only released grades; a student only their own record. If the portal setting is off, the route returns “not found”.
SOP 5 — Provision and troubleshoot portal logins
A portal account is created from a person’s profile, not signed up by them. Parent
logins are provisioned from the guardian record
(“Provision portal login”, needs school_guardians_update); student logins from
the learner record (needs school_learners_update).
-
Make sure the profile has an email
Provisioning creates a customer user from the guardian’s or learner’s email address. No email → provisioning is refused.
-
Provision the login
On the profile, choose Provision portal login. The system creates a customer account with a temporary password.
-
Have the person set their own password
Tell the parent/student to open the sign-in page and use forgot password to set their own password. They never need to know the temporary one.
-
For parents — verify the guardian link first
A parent will only see a child once that guardian ↔ learner link is verified. Verification is a separate registrar action on the guardian record; provisioning the login alone does not grant visibility.
| Provisioning is refused when… | Fix |
|---|---|
| The guardian/learner has no email on their profile | Add an email to the profile, then provision. |
| That email is already used by another account | Use a different, unused email for the profile. |
| The profile already has a portal account | Nothing to do — the login already exists; use forgot-password to reset. |
Point parents and students at their own friendly guides — the Parent Portal Playbook and the Student Portal Playbook — for signing in and reading their data.
SOP 6 — Enable the optional integrations
School deliberately reuses the rest of ERPat rather than rebuilding it. Each integration is optional and fail-safe — when the partner module is off, the School screen shows a notice and its actions no-op; grading and the portals are unaffected.
| School surface | Reuses | Enable | When off |
|---|---|---|---|
LMS Bridge (school/lms_bridge) | Learn | module_courses | Page shows a notice; actions no-op. |
| Facilities tickets | Helpdesk | module_ticket | Facility tickets unavailable; room summary still shows. |
| Announcements tile | core Announcements | module_announcement | Tile hidden. |
| Messages tile | core Messages | module_message | Tile hidden. |
| Events / calendar tile | core Events | module_event | Tile hidden. |
Grade schemes are configuration, not code
The grade engine (School_grade_engine) is pure and config-driven — it holds no
database and no hardcoded weights. The applicable scheme (policy + WW/PT/QA weights +
transmutation rule + passing floor) is resolved from seeded configuration by subject
group, grade level, and school year. Two things to keep straight:
- The default policy setting
school_default_grading_policychooses DepEd Order 8, s.2015 or MATATAG DO10, s.2024 as the default the engine resolves against.- The per-grade scheme
- The actual weights come from the resolved scheme for that grade level and subject group. If no scheme exists for a grade/subject-group/year, saving a class record errors with “no scheme” — that is a configuration gap, not a bug. Never hardcode weights.
The full policy comparison, weight buckets, and transmutation behavior are in the Grading Engine page.
Keeping the module healthy across tenants
Treat every tenant as its own school. When you make a change, ask whether it needs to reach each tenant DB.
Run migrations, seed the year, and configure settings per tenant. Nothing is shared across tenants automatically.
Parents and students are core customer users distinguished by their guardian/learner link — not staff logins.
Sensitive actions write to system_logs: verify_guardian, release_grades, view_health, view_safeguarding, scan_visitor, export, update_settings, and the enrollment decisions.
school and page permits granted · grade release/approve on different
people · portal toggles + allow_customer_signin set · default grading policy
chosen · current School Year marked in Academics · integrations enabled as needed. Then
provision a couple of test portal logins and confirm they see the right (and only the
right) data.