# Features — gladafrica2020

Evidence date: 2026-10-13.

Source: `git@bitbucket.org:overdrive/gladafrica2020.git`, `master` at `d60d7aa` (2020-08-05). `qa` adds a favicon and keeps the QA database host. `prod` adds that favicon and keeps the production database host. See `project-plan.md`.

No features document existed in the source repository. Status labels mean:

- **Current** — reachable from the public controllers and wired to a view or side effect.
- **Completed** — present and not marked unfinished. This repository has no ticket tracker, so "completed" means the same as current unless noted.
- **In development** — none found. Last commit on `qa`/`prod` is 2020-08-05.
- **Planned** — none found. No TODO list, roadmap, or issue file.
- **Deprecated / removed** — removed, commented, or left over from the Sun Met / PSL Operations copy.

## Current features

### Public application wizard

**Status:** Current, completed.

**Where:** Home page `application/modules/default/views/scripts/index/index.phtml` posts to `ApplicationController::applyAction`. Layout title in `application/layouts/default.phtml`: "PSL GladAfrica (2020) - Accreditation Portal". Footer "© PSL GladAfrica".

**Behaviour:** Stepped form (jQuery Steps): Personal, Organisation, Photo, Apply, Finish. Home submit URL is `/application/apply/code/{code}`.

The home controller pins the code to `5F28FF73F30AF`. `applyAction` uses the code in the URL and renders `application/apply.phtml`, whose form action is `/accreditations/application/apply/code/{code}`.

### Event branding from the accreditation record

**Status:** Current.

**Where:** `Model_AccreditationList::getProfile` reads `Accreditations_view` by `aCode`. `getAccreditationName` in both controllers builds the heading from `AccreditationName`, fixture teams when `FID > 0` (`SquadName1 VS SquadName2`), otherwise `DateFrom`/`DateTo`, and `Location` or `FixtureLocation`. Banner image is `AccreBanner`.

### Closed-event page

**Status:** Current.

**Where:** `application/modules/default/views/scripts/application/closed.phtml`. Selected when `CloseDate` 24:00 is in the past (`applyAction`, `IndexController::indexAction`, `applymultipleAction`, `applytestAction`).

**Limit:** The switch does not stop a POST from inserting. See business rules.

### Reference number and confirmation modal

**Status:** Current.

**Where:** `random_id` in `ApplicationController`. The home page `ajaxForm` success handler writes `xhr.responseText` into `#refnumber` and reloads after 5 seconds.

### Optional linked-event applications

**Status:** Current.

**Where:** Apply step in `index/index.phtml`. Links from `Model_AccreditationLinks::getAllWhere` on `LinkedAccreditations`. Extra inserts in `applyAction` when `apply[]` is posted.

### Duplicate-email warning

**Status:** Current. Client only.

**Where:** `check_if_Email_Exist` in `index/index.phtml` calls `/index/checkemail`. `IndexController::checkemailAction` and `ApplicationController::checkemailAction`.

### Applicant sign-in

**Status:** Current.

**Where:** Layout link `/application/login`. View `login.phtml`. `loginnowAction` and session `user_session`. Sign out is `/application/logout`.

### Application profile

**Status:** Current.

**Where:** `profile.phtml`, `profileAction`. Shows reference, status label, photo, services, zones, and an edit form. Edit posts to `/application/update/aaid/{AAID}`.

### Headshot upload to Footprint

**Status:** Current on the real submit path.

**Where:** `applyAction` calls `sendImage`, which POSTs to `https://www.footprintapp.net/accreditations/application/updateimage`. Profile re-reads `https://www.footprintapp.net/accre/photos/{Ref}.jpg`. A later change from the profile posts to `/application/updateimage`, which calls the same `sendImage`.

`SavePhoto` (local file under undefined constant `AC_PATH`) is commented out in `applyAction` and still called from `applytestAction`.

### Applicant email

**Status:** Current when the accreditation row has a template.

**Where:** `EmailApplicant`, `EmailApplicantDeclined`, `sendMail`. From address `accreditation@magus.events`, display name "Accreditation - PSL GladAfrica", subject "PSL GladAfrica Notification".

### Attendance confirm and cancel

**Status:** Current if something outside this repo issues an `AttendanceKey`.

**Where:** `attendanceAction`, `attendance.phtml`. Cancel sets `Status` to 2 and `History` to "Declined by Applicant".

### Terms

**Status:** Current.

**Where:** Finish step in `index/index.phtml`. Checkbox `data[acceptTerms]`. The paragraph says PSL GladAfrica decides the level of access and cites the Safety of Sports and Recreational Events Act of 2009. A second checkbox prints `AccreditationNote` from the database.

Changed in commit `e1ec899` from PSL Operations wording to PSL GladAfrica wording.

### Media days and producer fields

**Status:** Current when the accreditation row says so.

**Where:** `index/index.phtml`. If `MediaOnly == 1`, the media block is shown and producer name and email carry the `required` class. If `DaysDuration > 1`, day checkboxes fill `data[DaysAttending]`. If `MediaOnly` is 0 and the visitor picks category id `1`, `ChangeSelectCat` shows the same block.

### Error page

**Status:** Current.

**Where:** `ErrorController::errorAction`. 404 message "Page not found". Other errors "Application error". `displayExceptions` is 1 in the production section of the bak ini.

### Deployment

**Status:** Current as pipeline config. Last used in Git on 2020-08-05. Whether a host still runs it is **Unknown / Requires Confirmation**.

**Where:** `bitbucket-pipelines.yml` (branches `qa` and `prod` only), `codedeploy_deploy.py`, `appspec.yml`, `scripts/`. Destination directory `gladafrica2020.magus.events`.

## Features present in code and not on the public path

These exist in the tree. Nothing in the layout links to them.

| Feature | Where | Note |
|---|---|---|
| Role list page | `ApplicationController::indexAction`, `application/index.phtml` | Lists every row from `AccreditationRoles`. Separate from the wizard |
| Multi-applicant form | `applymultipleAction`, `applymultiple.phtml` | Field names `app[]` are not what `applyAction` reads. Uses `$this->DATA` which is unset |
| Apply test | `applytestAction`, `applytest.phtml` | Still calls `SavePhoto` |
| Attendance test | `testattendanceAction`, `testattendance.phtml` | Same writes as attendance, prints exceptions |
| Mail test | `testAction` | Sends to a hard-coded address |
| Barcode image | `barcodeAction` | Draws a fixed code `FD5T67`. Includes `Barcode39.php`, which was not found next to the controller |
| Placeholder image action | `imageAction` | Returns a hard-coded GIF |
| Sean view | `views/scripts/sean/index.phtml` | No `SeanController` |
| Partners action | `partnersAction` | Empty |
| Permit, gate, loading, and service models | `application/models/AccreditationPermits.php` and neighbours | No controller in this repo calls them. **Inferred** leftovers from the shared accreditation schema |
| Tournament notifications | `library/Other/Notifications.php` | Class `Notications`. `SquadAddedToTournamnt` is empty |

## Deprecated or removed

### Openfield and Roth Media invitation

**Status:** Removed from the live form. The radios remain inside an HTML comment in `index/index.phtml` (values 1 Openfield, 2 Roth Media).

**Evidence:** Commit `cf9251d` (2020-01-13) "Remove Openfield / Roth media from Sunmet media", and the comment markers in the current view.

### Maintenance splash

**Status:** Commented out.

**Where:** Top of `public/index.php`. A "technical difficulties" message and `exit` are commented. The app boots.

### HTTPS and www redirect

**Status:** Commented out.

**Where:** Root `.htaccess`. The active rule only prefixes `/public/`.

### Supplier registration nav item

**Status:** Commented out in the header. The SA Rugby supplier sentence still appears when a role has `SupplierReg` 1.

**Where:** `default.phtml` comment around `http://supplier.sarugby.online/register`.

### Local photo save on the live submit

**Status:** Commented out in `applyAction` (`SavePhoto`). Replaced by the Footprint POST.

### PSL Operations naming

**Status:** Replaced on this repository.

**Where:** Commit `e1ec899` (2020-08-05) changes the title, footer, terms paragraph, mail display name, mail subject, and hard-coded code. The previous strings ("PSL Operations", code `5F27014B26D5F`) remain in Git history and are what `silicon_ark/psl2020/` documents for the sibling repository.

## Changed relative to the shared `007bc5a` tree

Commit `2fc8b1b` (2020-08-05):

- CodeDeploy destination from `psl2020.magus.events` to `gladafrica2020.magus.events`.
- Tracked database host from `db.footprintapp.net` to `qadb.footprintapp.net` (reversed on `master` and `prod` by `d60d7aa`; still the `qa` host).

Commit `e1ec899` (2020-08-05, "Update ID and Name"):

- Page title and footer name PSL GladAfrica.
- Hard-coded accreditation code changed from `5F27014B26D5F` to `5F28FF73F30AF`.
- Mail display name "Accreditation - PSL GladAfrica" and subject "PSL GladAfrica Notification".
- Terms paragraph names PSL GladAfrica.

Commit `d60d7aa` (2020-08-05, `master` tip): bak host set to `db.footprintapp.net`.

## Not found

- Planned features, feature flags, or a changelog.
- Admin approval, printing of passes, or barcode scanning of a real applicant barcode.
- Member accounts with passwords.
- Automated tests.
