# Features — neoafrica_qa

Evidence date: 2026-10-09.

Source: `git@bitbucket.org:overdrive/neoafrica_qa.git`, `main` at `3f8d683` (2026-06-19).

Status labels: **Current** means the code or script is on `main`. **Documented** means an in-repo markdown or SQL comment describes it. There is no separate backlog file. Planned items are only those the e-hailing note calls future or not yet wired.

## Current features

### Identity and access

| Feature | Status | Where |
|---|---|---|
| Forms sign-in, sign-out, 30-minute sliding session | Current | `Neo.LegitimateLicences.Web/Controllers/Auth/`, `Web.config` |
| Forgot password via security question | Current | `AuthController.ForgotPassword.cs` |
| Change password while signed in | Current | `AuthController.ResetPassword.cs` |
| Optional fingerprint capture (DigitalPersona) | Current | `AuthController.SignIn.cs` (`CaptureFingerPrint`, `SaveFingerPrintTemplate`); app setting `FingerprintAuthenticationEnabled` |
| Role and profile providers (`DomainRoleProvider`, `DomainProfileProvider`, application name `Neo Legitimate`) | Current | `Web.config` |
| User administration console (details, roles, security, settings, activity, buddies) | Current | `Views/UserConsole/` |
| Office location console | Current | `Neo.LegitimateLicences.OfficeLocationConsole` |
| Anonymous access denied | Current | `Web.config` `<deny users="?" />` |

### Operating licences and applications

| Feature | Status | Where |
|---|---|---|
| Start and work an application | Current | `Neo.LegitimateLicences.Applications`, `Neo.LegitimateLicences.ApplicationRequest` |
| Application type catalogue (seeded types 1–38, plus 60–63) | Current | `DBUp/Scripts/Migration/Step 1 - OLAS Data Seed.sql` and later type scripts |
| Workflow task actions: approve, reject, cancel, escalate, request change, return escalation, submit | Current | `Views/Shared/Afx/Actions/` |
| Verification queue with live updates | Current | `Hubs/MessageHub.cs`, `AfxController.Verification.cs` |
| Referrals and authority letters | Current | 2024 referral scripts; NPTR referral letter reports |
| Gazette console and gazette print | Current | `Neo.LegitimateLicences.GazetteConsole`; `Pr_PrintGazetteReport` bugfix script |
| Inspections list, inspector list, scheduling with applicant name and SMS | Current | `Pr_ApplicationsAwaitingInspectionsGet.sql`, `1164_InspectionScheduling_ApplicantNameAndSms.sql` |
| Adjudication console | Current | `Neo.LegitimateLicences.AdjudicationConsole` |
| Licence issue and cancel requests | Current | `LicenceIssueRequest`, `LicenceCancelRequest` |
| Operating licence console and register | Current | `OperatingLicenceConsole`, `OperatingLicences` |
| New route request and route console | Current | `NewRouteRequest`, `RouteConsole`, `Routes` |
| Business-rule bypass request | Current | `Neo.LegitimateLicences.BusinessRuleBypassRequest` |
| Data purification (member update, change application type) | Current | `Neo.LegitimateLicences.Purifaction` (folder spelling), views under `Views/Purification` |
| MD approval request | Current | `MDApprovalRequest`, `MDApprovals` |
| Inter-department views | Current | `Neo.LegitimateLicences.InterDepartment` |
| Pre-check and step-check SQL (application and licence-issue steps) | Current | `Fn_ApplicationStep*`, `Fn_LicenceIssueStep*`, `Pr_ApplicationPrecheckCreate` |
| Duplicate licence-exception checks | Current | `106_Fix_Fn_GetLicenceExceptions_DuplicateChecks.sql` |
| Source-system licence lookup (OLAS / imported / LTPS XML) | Current | API `GetVerifiedLicenceToUseXml`, `GetImportedLicenceToUseXml`, `LTPSApplicationXmlSearch`, `GetApplications` |

### Accreditations, people, vehicles, stationery

| Feature | Status | Where |
|---|---|---|
| Accreditation issue, cancel, console | Current | `Accreditation*` projects |
| Members and associations | Current | `Members`, `MemberConsole`, `Associations`, `AssociationConsole` |
| Vehicles, including eNatis description columns | Current | `Vehicles`, `VehicleConsole`; `109_AddVehicleENatisDescriptionColumns.sql` |
| eNatis vehicle check | Current | `Web.config` eNatis keys; commits from 2025-01-17 onward |
| Document types console | Current | `DocumentTypeConsole` |
| Stationery batches, transfer, retrieve, issued and available stock | Current | `Views/Stationery/`, `Neo.LegitimateLicences.Stationery` |
| Document upload, title edit, scan page | Current | `AfxController.Documents.cs`, `Views/Shared/Afx/Documents/` |

### E-hailing

| Feature | Status | Where |
|---|---|---|
| Feature flag `ehailing.providers.enabled` | Current, **Documented** | `docs/EhailingProviders.md`, `0928_System_Settings_EhailingProviders.sql` |
| Types 60, 61, 62 (new, renewal, amend conditions) | Current | `0923_NPTR_EhailingProviderRegistration.sql`, title cleanup `1103_Update_NPTR_ApplicationRequestTypes_RemovePrefix.sql` |
| Platform provider and certificate tables, registry view | Current | `Verified.PlatformProviders`, `Verified.ProviderCertificates`, `Verified.Vw_ProviderRegistry` |
| Registry search UI and `GET /ProvidersRegistry/Search` | Current, **Documented** | `Neo.LegitimateLicences.ProvidersRegistry`, e-hailing doc |
| Issue and reissue certificate, email templates | Current, **Documented** | issue/reissue procedures, `0927_Crm_MessageTemplates_Providers.sql` |
| App-provider issuing workflow | Current | `Neo.LegitimateLicences.AppProviderIssueRequest` and `1106`–`1150` SQL |
| 14-day NPTR e-hailing gazette period; PRE stays 21 days | Current, **Documented** | `System_Settings_GazetteEhailing.sql` |
| Gazette expiry bypass flag for dev/test | Current, **Documented** | same script; default inserted value TRUE |
| Metered taxi to e-hailing conversion (type 63, PRE) | Current | `Md.ApplicationRequestTypes_63_Conversion_EHailing.sql`, `App.Pr_ConversionApplyEhailing.sql` |
| E-hailing and tuk-tuk service types | Current | `0722_Add_EHailing_TukTuk_ServiceTypes.sql` |
| QA test pack (cases, sample providers, SQL probes) | Current | `QA/TestPlan_EhailingProviders/` |
| Provider certificate print DTO | Current | `LegitimateLicencesApiController.Printing.cs` |

### Reporting, dashboard, communications

| Feature | Status | Where |
|---|---|---|
| Report browser | Current | `ReportsController`, `Neo.LegitimateLicences.Reports` (Application, General, Hidden, IT audit, Member, NPTR, OL, Route) |
| Dashboards | Current | `Neo.LegitimateLicences.Dashboards`; provider issuing summary procedures |
| Templated email | Current | `Pr_MessageCreateTemplatedEmails` |
| SMS via Clickatell wrapper | Current | `Neo.Afx.WinService.Messages/SmsVodazone.cs` |
| In-app correspondence and comments | Current | `AfxController.Correspondence.cs`, `AfxController.Comments.cs` |
| Audit list | Current | `AfxController.Audit.cs` |
| Home search | Current | `HomeController.Search` |
| Profile edit | Current | `ProfileController` |

### Clients and operations

| Feature | Status | Where |
|---|---|---|
| Web API ping, print data, scan data, scan upload, verified XML | Current | `Neo.LegitimateLicences.Api` |
| Desktop client and updater | Current | `Neo.LegitimateLicences.Desktop`, `Neo.LegitimateLicences.DesktopUpdater` |
| ActiveX print and installer | Current | `Neo.LegitimateLicences.ActiveX.Printing`, `ActiveX.Installer` |
| Verifier web project | Current | `Neo.LegitimateLicences.Verifier` |
| Windows service job scheduler | Current | `Neo.LegitimateLicences.WinService` |
| DbUp on web startup | Current | `DBUp/DatabaseUpdator.cs`, called from `Global.asax.cs` |
| Sentry error reporting | Current | `Global.asax.cs`, packages `Sentry` 4.6.0 |
| CDN static assets | Current | `Neo.LegitimateLicences.Cdn` |
| AFX services web host | Current | `Neo.Afx.Services.Web` |
| OLAS migration scripts | Current | `DBUp/Scripts/Migration/` |
| Environment readiness checklist and root checklist CSV | Current | `Environment_Readiness_Checklist.md`, `checklist.csv` |
| SonarQube pipeline on `main` | Current | `bitbucket-pipelines.yml`, `sonar-project.properties` |
| Azure DevOps YAML (development web, API, CDN) | Current as files | `azure-pipelines.yml`, `NeoAfricaDevelopmentWeb.yaml`, `NeoAfricaDevelopmentApi.yaml`, `NeoAfricaDevelopmentCdn.yaml` |

## Completed features

Nothing in the repository is marked completed-and-removed as a product phase. The following are finished changes that are on `main`:

- Initial import (2024-12-03).
- eNatis integration and later validation fixes (2025-01 through 2025-04, plus later feature branches merged toward `Test` / `main`).
- E-hailing provider MVP scripts and doc (2025-09 series through issuing workflow scripts).
- Metered-taxi conversion module merged in PR #3 (2026-03-30).
- Professional Drivers Permit mandatory checks commented out in `110_Fn_ApplicationStep3Checks.sql` and `111_Fn_LicenceIssueStep2Checks.sql`. Commit message on PR #4 (2026-03-31): "Make Professional Drivers Permit optional for vehicle validation".
- Scholar contracted-service gazetting question merged 2026-06-10 (PR #49) and included in the `Test` merge to `main` (PR #53, 2026-06-19).

## Planned or only partly done

| Item | Evidence | Status |
|---|---|---|
| Provider API for real-time suspensions and expulsions | `docs/EhailingProviders.md` known limitations: "future" | **Planned** (documented as not in the MVP) |
| Returned-for-correction email for providers | Same doc: "not wired yet" | **Documented** as missing |
| QR code on the provider certificate | Same doc: client asked to skip | **Documented** as out of scope, not a backlog item |
| User guides and administrator guides | Checklist section 11 boxes are unchecked template items | **Unknown** whether anyone intends to write them. They are not in the repo |
| Dedicated registry securable | E-hailing doc: "optional dedicated securable can be added later" | **Planned** only as an option |

## Recently changed (on the path into `main`, 2026)

| When | Change | Evidence |
|---|---|---|
| 2026-03-30 | Metered taxi to e-hailing conversion included | PR #3, commit message |
| 2026-03-31 | PrDP made optional | PR #4 |
| 2026-04-20 | Character-encoding follow-up on that branch | `85ba2c5` |
| 2026-05 | Annexure font changes, referral period, removal of operator pick for region, secondary applications | PR #10, #11, #13, #29 and related hotfix branch names |
| 2026-05-29 to 2026-06-04 | Ticket batches #113, #123, #127, #134 merged toward `Test` | PR #35–#47 |
| 2026-06-08 to 2026-06-10 | Scholar gazetting question; duplicate-row removal | PR #49, commit `04dcd01` |
| 2026-06-10 to 2026-06-11 | Ticket #40 deployed to test | PR #51 |
| 2026-06-19 | `Test` merged to `main` | PR #53, `3f8d683` |

Branch names that were not opened file-by-file (behaviour is **Inferred** from the name until a human confirms the merge contents): user province segregation, office-location administrator role, reports 10025 and 10027, in-progress report step filter, eNatis error handling, licence validity change, secondary applications, national letter fonts.

## Deprecated or removed

| Item | Evidence | Status |
|---|---|---|
| `NPTR:` prefix on e-hailing type titles | `1103_Update_NPTR_ApplicationRequestTypes_RemovePrefix.sql` updates titles only when the old title is still present | **Changed**. Old title is the match condition, so a database that already has the new title is left as-is |
| Active PrDP "document required" checks in two step functions | Checks are commented in the 2026 function scripts | **Changed** in those scripts. Other procedures still read `ProfessionalDriversPermitDocID`. A full removal was not proven |
| `sonarqube_scan.bat` and `repos/` | Listed at task creation, absent from git history | **Not in git**. Not evidence of a removed feature |
| Commented `ServiceBase.Run` in `WinService/Program.cs` | Replaced by Topshelf `HostFactory.Run` in `ConfigureService` | **Changed**. The process still starts a service host |

## Not features of this repository

- SonarQube itself. This repo only requests a scan.
- The Neo.Afx product source. This repo vendors projects and can copy compiled assemblies from another tree.
- A public self-service portal.

## Unknown

- Which remote branches after 2026-06-19 contain commits that are not in `main`.
- Which reports in `Neo.LegitimateLicences.Reports/Hidden` are suppressed in the UI.
- Whether the desktop updater is used in production.
- Whether `Neo.LegitimateLicences.Verifier` is deployed separately from the main web app.
