# Features — ieb-inde-1

Evidence date: 2026-10-13. Inspected revision: `main` at `9bf5ac3`.

Provenance: **Implemented** unless a row says otherwise. Paths are under `INDE-1/Evolution Software Unified Framework/Evolution Software Unified Framework/` unless noted.

No feature roadmap, changelog, or removed-feature list exists in the repository. "Planned" and "deprecated" below are only what the tree itself shows.

## Current features

### Examination subject

| Feature | Where | Notes |
|---|---|---|
| Subject year, type, level, paper, name, code, document password, status, time since status change | `oExaminationAuthoringandModeration`, `ExaminationAuthoringandModeration_{form,grid,view}` | Custom populate dated 2018-02-06. |
| Five resources: examiner, reviewer, internal moderator, external moderator, assessment specialist | Same form, `examNums.SubjectResourceRole` | Ids are strings holding a user `recId`. |
| Generated document password and copy-to-clipboard | `PerformCustomPopulateAddOn` | Filled only when the password text is empty. Field is read-only. |
| Lock identity fields after the item exists | Same method | Code, year, type, level, paper, subject name. |
| Reviewer-only status dropdown | Same method | Enabled only when the user is the stored reviewer. |
| SuperUser-only resource editing and save buttons | Same method | Below SuperUser, resource dropdowns disabled and save buttons hidden. |
| Role-based new document-pack button | Child button `3037` | Shown for examiner and reviewer. Hidden for the other three roles. |
| Status-change log and email | Custom include dated 2018-02-08, `examHandler.EmailExamStatus` | Requires reviewer, an existing item, and an active document pack. See business rules for which statuses send mail. |

### Document packs

| Feature | Where | Notes |
|---|---|---|
| Pack number and revision | Four document-pack forms | `{year}-{type}-{level}-{paper}-{subject code}-Rev{n}`. |
| Lookup `customCode` preferred | Exam Documents, Internal Moderation, External Moderation forms | Display-text fallbacks for year-end, grades 8–12, papers 1–6. |
| Display-text only | `ExaminationDocumentPack_form.ascx.cs` | Ignores `customCode`. Which form is live is unknown. |
| Auto-save of a new pack on first open | All four forms | `PerformSave` when `recId` is 0. |
| Upload-complete action | `ExaminationDocumentPack_ExamDocs_form.ascx.cs` button handler | Examiner sets status 1083. Reviewer sets status 1084. Writes an internal log. |
| Examiner/reviewer-only upload controls | Same form populate | New-document button and upload-complete button. |

### Moderation

| Feature | Where | Notes |
|---|---|---|
| Criteria 1–7 question paper, 8–10 marking guideline, 11 impression, 12 overall | Internal and external document-pack forms | Progress-save buttons per criterion. Criterion 12 is "Save Moderation". |
| Internal moderator can edit; others read-only | `ExaminationDocumentPack_InternalMod_form.ascx.cs` `SetState` | Save buttons hidden. |
| External moderator can edit; others read-only | `ExaminationDocumentPack_ExternalMod_form.ascx.cs` | Same pattern. |
| Completion log | Custom include on each save | Internal log or external log. Sets the completion date. Copies lookup display onto the pack status text. Does not change subject status. |
| Compliance colours | `examHandler.ReturnComplianceClass`, `ReturnOverallComplianceClass` | Red, orange, green CSS classes. |
| Compliance summary with per-criterion feedback | `ReturnComplianceSummary` | Shown only after overall compliance id is greater than 0. Child surface ids are hardcoded. |
| Feedback rows | `sp_INDE_GetCriterionFeedbackData` | Number, reason for non-compliance, recommendation. Procedure script is not in Git. |

### Collaboration and files

| Feature | Where | Notes |
|---|---|---|
| Internal log field 93 and external log field 94 | `examNums.CollaborationLogField` | Note titles "Internal Moderation Log" and "External Moderation Log". |
| Role-based log email | `controls/module/surfaceNotes.ascx.cs` `HandleEmailLog` | Template `Examination Moderation Log`. |
| Reviewer email on system log save | `examHandler.SaveCollaborationLog` | Always the reviewer. Role label "System Post". |
| Attachment add limits | `controls/admin/attachments.ascx.cs` | New button hidden for assessment specialist and both moderators. |
| Assessment specialist cannot open the file link | Same file, surface module | Icon only. |
| Edit and remove hidden for specialist and both moderators | Same file | Remove also hidden below SuperUser. |
| Edit column hidden on examination document files | Session field `ExaminationDocuments_ExaminationDocumentDetails_Files` | CSS `noShow`. |
| Upload path requires a session | `App_Code/FileProtectionHandler.cs` | Handler path `upload`. |

### Subject list

| Feature | Where | Notes |
|---|---|---|
| Subject name, code, level | `oSubjectManagement`, `SubjectManagement_{form,grid,view}` | Status mail reads the name from `publ_SubjectManagement` by the subject's name field. |
| STUD-1 profile button text | `SubjectManagement_form.ascx.cs` populate | Runs only when setup code is `STUD-1`. Not an INDE-1 exam rule. |

### Mail templates

| Feature | Where | Notes |
|---|---|---|
| Examination Moderation Log HTML | `data/Scripts/INDE-1/2020-05-04-DP-INDE-1-update-template.sql` | Placeholders `{name}`, `{Subject Name}`, `{User Name}`, `{Date}`, `{LogPost}`, `{SubjectWebAddress}`. Sign-off "IEB Team". |
| Examination Moderation Status HTML | Same script | Placeholder `{StatusBlock}` and `{SubjectWebAddress}`. |

### Shared framework still in the tree

Admin sign-in, users, canvases, surfaces, templates, content, products, cart, campaigns, loyalty, FAQ, gallery, job cards, SMS credit, support, and the WCF service are part of the shipped website. They are framework features. They are not described as exam requirements here.

`controls/module_custom/CriterionFeedback.ascx` and `billingInstructions.ascx` are in the site. Exam summary HTML is built in `examHandler`, not by a call found from those controls into the status workflow. Whether a canvas still hosts them is **Unknown / Requires Confirmation**.

## Completed features

Nothing in Git is marked completed or released as a product version beyond the import itself. `release/1.0.0.1` and `release/1.0.5` each contain `files.zip` and `scripts.zip`. They were not unpacked. Provenance of those zips relative to INDE-1 exams is **Unknown / Requires Confirmation**.

The 2020-05-04 script is the only INDE-1 SQL change in the tree. Custom form comments stop at 2018-02 and one 2019-03-12 status comment.

## Planned features

None documented. No TODO in the exam classes describes a future exam feature. Generated comments that say "Handle any custom control saving here... TO DO" are framework boilerplate.

## In development

No `develop` branch exists in this repository. The pipeline is written to run on `main` and `develop` if those branches receive a build. Only `main` is present.

## Recently changed

The only commit is `9bf5ac3` on 2025-07-03, "Initial commit". There is no earlier commit to diff. Comments and the SQL filename are the only change history, and they are not Git history.

## Deprecated or removed

No removal list exists. These are present and look unused by the exam workflow:

| Item | Why it is listed here |
|---|---|
| `SubjectManagement` STUD-1 branch | Guarded by setup code `STUD-1`. |
| MediSwitch app settings and scheduler web reference | Not called by `examHandler` or the exam custom regions that were read. |
| Country web-service URLs | Same. |
| Commented recipient `graham@evolutionsoftware.co.za` | Left in `EmailExamStatus` and `EmailLogStatus`. Not executed. |
| `PaletteOne.pubxml` | A third publish profile beside `INDE-1.pubxml` and `INDE-1-IEB.pubxml`. Not referenced by exam code. |
| `sonarqube_scan.bat` | Named when the onboarding task was created. Not in `9bf5ac3`. |

## Not a feature of this repository

INDE-2, INDE-4, INDE-5, INDE-6, INDE-8, and INDE-9 are named in the readme and have their own repositories. SQL script folders for other client codes shipped inside `data/Scripts` because the SQL project is shared.
