# Features — doh_sims

Evidence date: 2026-10-16.

Source: `main` at `5747dca4` (2026-10-07).

Status words: **Current** means the code is in this tree. **Installed** on a server is a database flag and was not observed. No feature in this file is marked planned unless a document explicitly describes future work. None does.

## How to read module versions

Gibbon shows the version from the module's `version.php` and/or `manifest.php`. Where those files disagree, both values are listed.

## Overdrive and DOH features (current)

### DOH custom fields — v0.0.14

Path: `modules/DOHCustomFields/`.

Author line: Wessels De Wet for Silicon Overdrive. Category: DOH.

| Feature | Status | Evidence |
|---|---|---|
| SA ID format, Luhn, date, and uniqueness checks (browser and AJAX) | Current | README, `validateSAIdAjax.php` named there |
| Date of birth cross-check against the ID | Current | README |
| Student number format `YY#####`, auto-generation, Emergency Care random number | Current, README | README. README is written at v0.0.06 |
| Unique nullable `gibbonPerson.studentID` | Current | CHANGELOG v0.0.06 |
| Admissions edit excluded from duplicate checks | Current | CHANGELOG v0.0.07 |
| Class roles `Registrar` and `Programme Coordinator (Campus)` | Current | CHANGELOG v0.0.10, v0.0.11 |
| DOH Settings menu and unique-email setting inside this module | Removed in v0.0.14 | CHANGELOG: unique email is only under User Admin → Manage Settings |

`index.php` line 39 requires `modules/DOHCustomFields/moduleFunctions.php` on each request. **Implemented**.

### Registrations — v1.5.101

Path: `modules/Registrations/`. Eligibility engine: `src/Domain/ReEnrolment/ProgressionEligibilityService.php` (core `src/`, not under the module folder).

| Feature | Status | Evidence |
|---|---|---|
| Re-enrolment renamed to Registrations | Current | README upgrade SQL |
| Settings: enable, target year, open/close, extra field label | Current | README |
| Sections: Student, Enrolment + modules, Documents, Invoice, Final details | Current | README |
| Staff manage and confirm on behalf | Current | README |
| Proof of registration print | Current | `print_proof_of_registration.php` |
| Programme-to-form-group filter | Current | README |
| Module credits, pass mark, core flag on classes | Current as a documented UI on Timetable Admin. Service now also reads `gibbonCourse.credits`, `gibbonCourse.pass_mark`, `gibbonCourse.is_core` | README vs service |
| WIL hours, proof upload, staff approval | Current | README, `wilHours_manage.php`, `wilHours_my.php` |
| Progression blocking | Current | Service + `registration_eligibility_helper.php` named in the README |
| Second-failure exclusion | Current in code. README still says the method is a stub that returns false | `isExcludedSecondFailure` |
| Supplementary band (`SP` / `SUPP` or numeric min/max on the course) excluded from hard fails | Current | Service |
| Accept application → class enrolments and house from campus `custom0207` | Current | README, Admissions accept process |
| Proforma invoice on registration submit | Current, depends on Invoice Customizer | README |
| Test page `test_eligibility.php` | Documented | README. Treat as a staff diagnostic, not a product screen for students |

### Multi-campus — version.php 2.1.00, README titled 2.0.0

Path: `modules/MultiCampus/`.

| Feature | Status | Evidence |
|---|---|---|
| Houses used as campuses | Current | README v2.0.0 section |
| 13 DOH campus roles | Current | `manifest.php` INSERT |
| Staff-to-campus assignment, primary campus | Documented | README |
| Settings `enableMultiCampus`, `enforceCampusAccess` default Y, `allowCrossCampusView` default N | Documented | README |
| Campus staff report, students-by-campus report, CSV | Documented | README |
| My Campuses, settings dashboard | Documented | README |
| English (US) and Afrikaans (South Africa) strings | Documented | `i18n/en_US.php`, `i18n/af_ZA.php` named in README |
| AJAX `campus_api.php` with 60 requests/minute/session | Documented | README |
| Hooks into Students, Staff, External Assessment, Individual Needs, Behaviour, Attendance, Activities, Markbook, Data Updater, Reports | Documented as scripts that edit core files | `modules/MultiCampus/scripts/` |
| Bootstrap loaded from `index.php` | Not in this git tree | `index.php` has no `MultiCampus/bootstrap.php` require. Scripts exist to inject it |
| Automated tests under the module | Current files | `modules/MultiCampus/tests/` |

### CHE reports — v1.0.63

Path: `modules/CHEReports/`.

| Feature | Status | Evidence |
|---|---|---|
| Editable HEMIS codes and Excel export of the code list | Current | README |
| Provider code and ETQA id per campus (house) | Current | README. Older per-form-group table is dropped on update |
| Files 61, 63, 65, 66, 67, 68 and a consolidated workbook | Current | `docs/CHE_File_Reports.md` |
| Campus filter aligned with Advanced Reports / MultiCampus | Current | same doc |
| Submission to an external CHE system | Not present | README: extracts only |

### Invoice customizer — v1.4.4

Path: `modules/InvoiceCustomizer/`.

| Feature | Status | Evidence |
|---|---|---|
| Custom print page that does not require core hooks | Current | CHANGELOG 1.2.0 |
| Invoice list with year, status, and search | Current | CHANGELOG |
| Auto proforma on application submit, email, PDF attachment | Current | CHANGELOG 1.3.0 and 1.3.1 |
| Logo URL and theme colour settings | Current | CHANGELOG 1.3.1 |
| Fee lines limited to Finance fees that match a selected module name, including R0.00 | Current, marked Unreleased in CHANGELOG while `version.php` is 1.4.4 | CHANGELOG top section |
| Generate final invoice action | Current file | `invoices_manage_generateFinal.php` |
| Proforma email log | Current file | `proforma_email_log.php` |

### Payment status — version.php 1.0.02, README 1.0.00

Path: `modules/Payment Status/`.

| Feature | Status | Evidence |
|---|---|---|
| Public email lookup of outstanding application balances | Current | README |
| Welcome flag `paymentStatusEnabled` | Current | `index.php` |
| Resend invoice | Current file | `paymentStatusResendInvoiceProcess.php` |
| Proof-of-payment upload | Current files | `applicationPaymentUpload.php` |
| MFA on payment flows | Documented at core v29.0.01 | Root README points at `modules/Admissions/publicMfaChallenge.php` |

### LMS sync — v1.5.9

Path: `modules/LMSSync/`.

| Feature | Status | Evidence |
|---|---|---|
| Pull students and grades from Moodle REST | Current | `SETUP.md`, `lib/MoodleAPI.php`, `lib/SyncStudents.php`, `lib/SyncGrades.php` |
| Course mapping UI | Current | `actions/manageMappings.php` |
| Manual sync and token-protected HTTP cron, plus CLI | Current | `actions/syncNow.php`, `actions/syncCron.php`, `CRON.md` |
| Interval skip | Documented | `CRON.md` |
| Sync log | Current | `actions/sync_log.php`, `lib/SyncLog.php` |
| Moodle plugin that implements the web services | Not in this repo | `SETUP.md` |

### Moodle SQL views

| Module | Version | Status | Evidence |
|---|---|---|---|
| Moodle (Gibbon Foundation) | 1.1.02 | Current. Prerequisite for cohorts | `modules/Moodle/` |
| Moodle Cohorts (Silicon Overdrive) | 1.1.04 | Current. Replaces `moodleUser` to add `gibbonPersonID`. Adds cohort, member, course, credit, and year-group credit views | `modules/Moodle Cohorts/README.md` |

Credit views require Registrations v1.5+ columns. **Documented**.

### Advanced reports — manifest 1.5.01, version.php 1.3.00

Path: `modules/Advanced Reports/`. Author: Silicon Overdrive.

Current menu actions (manifest): New Enrolments, Qualification List, Qualification Enrolment Comprehensive, Campus Student Demographic, Students Registered for Module, Contract / Student Type, Completion Statistics Comprehensive, Completion Statistics Demographic, Module Registration Summary, Modules Registration Details.

Spreadsheet export scripts are paired in the manifest. Extra PDF scripts exist for qualification list, new enrolments, module student list, and contract/student type.

Default audience in the manifest: Admin and Support. Teachers, students, and parents are off by default.

## Gibbon core features present in this tree (current)

These folders are the upstream Gibbon modules shipped inside the fork. Behaviour is Gibbon 29.0.02 unless a local hook or `src/Domain/ReEnrolment/` says otherwise. A full diff against https://github.com/GibbonEdu/core was not done.

| Module path | What it is for (upstream purpose, confirmed by folder presence and changelog headlines) |
|---|---|
| `modules/Activities` | Activities and attendance |
| `modules/Admissions` | Applications. Local accept process loads Registrations |
| `modules/Attendance` | Attendance |
| `modules/Behaviour` | Behaviour records, including an Observation type added in v29 |
| `modules/Crowd Assessment` | Peer assessment |
| `modules/Data Updater` | Family data updates |
| `modules/Departments` | Departments |
| `modules/Finance` | Fees, invoices, expenses, petty cash (v29 headline) |
| `modules/Form Groups` | Form groups (roll groups in older versions) |
| `modules/Formal Assessment` | External assessment |
| `modules/Individual Needs` | Individual needs |
| `modules/Library` | Library lending |
| `modules/Markbook` | Marks. Colour-coded columns are a v29 headline |
| `modules/Messenger` | Messages. Required from `index.php` |
| `modules/Planner` | Lesson planner |
| `modules/Reports` | Report templates and archive (mPDF default in v29) |
| `modules/Rubrics` | Rubrics |
| `modules/School Admin` | School structure, years, houses, form groups |
| `modules/Staff` | Staff directory, coverage, absences |
| `modules/Students` | Student profiles, enrolment |
| `modules/System Admin` | Modules, settings, import, logs, impersonation |
| `modules/Timetable` | Timetable. v29 headline is a responsive UI |
| `modules/Timetable Admin` | Courses, classes, timetable construction |
| `modules/Tracking` | Tracking |
| `modules/User Admin` | Users, families, MFA reset |

### Core behaviour called out in v29 changelog (current in CHANGELOG.txt)

Headlines for 29.0.00: responsive timetable, library borrowing on the student profile, adding recipients to an existing message, colour-coded markbook, petty cash.

Security: nonce and CSRF on POST forms (see `gibbon.php`). TOTP MFA in 29.0.01. Impersonation in 29.0.02 (`modules/System Admin/impersonateUser.php`).

`CHANGELOG.txt` also records a deprecation: `sendNotificationsAsBcc` removed from `NotificationSender`.

## Recently changed, as far as this clone can show

The shallow clone has one commit: `5747dca4` on 2026-10-07, "Merged in rachel_work (pull request #45)". The file list of that merge was not expanded. Relative to the 2026-09-28 onboarding snapshot:

| Item | Then | Now |
|---|---|---|
| Named commit | `e50c5fd0` (bitbucket-pipelines.yml edited online) | `5747dca4` |
| `bitbucket-pipelines.yml` | Listed at repo root | Absent |
| `azure-pipelines.yml` | Not in the snapshot file list | Present |

What pull request 45 changed inside the product is **Unknown** without a non-shallow history.

DOHCustomFields changelog v0.0.14 (unique email removed from DOH Settings) and Registrations v1.5.101 are the newest module labels in those packages. Dates for those labels are not in the version files.

## Deprecated or removed

| Item | Evidence |
|---|---|
| Module name Re-enrolment | README: renamed to Registrations. Upgrade SQL is documented, not a delete of data |
| `gibbonCHEReportProviderByForm` | README: dropped when provider mapping moved to campus/house |
| DOH Settings menu action | DOHCustomFields CHANGELOG v0.0.14 |
| `sendNotificationsAsBcc` | Core CHANGELOG v29.0.00 |
| `bitbucket-pipelines.yml` | Absent at HEAD. Was listed on 2026-09-28. Removal is **Inferred** from the two snapshots, not from a commit diff |

## Not features of this repository

- Certified CHE submission.
- The Moodle `local_gibbon_sync` plugin.
- A written product roadmap. **Planned** items: none found.
- Root Codeception/PHPUnit suite. `composer.json` references `tests/`. That directory is not in the tree.

## Discrepancies

1. Advanced Reports `manifest.php` says 1.5.01 and `version.php` says 1.3.00. Gibbon's installer usually reads the manifest. Which number the database shows after install is **Requires confirmation**.
2. Registrations README says `isExcludedSecondFailure` is a stub. The method in `src/Domain/ReEnrolment/ProgressionEligibilityService.php` counts hard fails across two school years.
3. Registrations README diploma example of 1970 clinical credits is not the parameter default in `isEligibleForDiploma`.
4. MultiCampus and Registrations READMEs require bootstrap lines in `index.php` / `gibbon.php` that this commit does not contain.
5. DOHCustomFields README (v0.0.06) says the student number is required. Changelog v0.0.06 allows NULL. `version.php` is 0.0.14, and the README body still says 0.0.06.
