# Features — indawo

Evidence date: 2026-10-12. Tree: `master` at `ed7defd`.

"Current" means the file is on that commit and a page or cron includes it, or the page is a top-level script a browser can request. Copy files are listed separately. Planned means a comment or document describes work that the tree does not contain.

## Current features (`master`)

### Access and administration

| Feature | Where | Status |
|---|---|---|
| Login with email, password, and shared PIN | `login.php`, `_nemo.password.cls.php` | **Implemented** |
| Forgot-password panel on the login page | `login.php` | **Implemented** |
| Password policy (length, strength, history, restricted words, optional max age) | `_nemo.password.cls.php`, `sysSettings` keys | **Implemented**. Live values are in the database |
| Login audit | `tblLoginInsert` calls in `login.php` | **Implemented** |
| Lock after repeated failures | `CheckSecurityLock` in `system.functions.inc.php` | **Implemented**, and the result string does not match `login.php`. See business rules |
| Monthly PIN email | `Cron.daily.1.Lookups.php` | **Implemented** when `EnablePINPolicy` is `True` |
| Users | `user.php`, `includes/user.cls.php` | **Implemented**. Export hidden when security group id is greater than 2 |
| Weak-password list | `user.php` action `GetWeakPasswordList` | **Implemented** |
| Security groups and menu rights | `security.group.php`, `includes/security.group.cls.php`, `_nemo.menu.cls.php` | **Implemented** |
| Companies | `company.php`, `includes/company.cls.php` | **Implemented** |
| Sales people | `sales.person.php`, `includes/sales.person.cls.php` | **Implemented** |
| Settings | `settings.php`, `includes/settings.cls.php` | **Implemented** |
| User settings | `user.settings.php` | **Implemented** |
| Email templates and send | `email.php`, `email.template.php`, `includes/email.cls.php`, `includes/email.template.cls.php`, `_nemo.email.cls.php` | **Implemented** |
| Read receipt and online read pages | `email.read.receipt.php`, `email.read.online.php` | **Implemented** |
| Messages | `message.php`, `message.incl.php` | **Implemented** |
| Usage log | `usage.log.php` | **Implemented** |
| Archived | `archived.php` | **Implemented** page. What it archives is the class it includes; not fully read |

### Commercial and job operations

| Feature | Where | Status |
|---|---|---|
| Clients | `client.php`, `includes/client.cls.php` | **Implemented** |
| Contacts | `contact.php`, `includes/contact.cls.php` | **Implemented** |
| Contact log | `contact.log.php`, `includes/contact.log.cls.php` | **Implemented** |
| Enquiries | `enquiry.php` | **Implemented** |
| Jobs (Foreman) | `job.php`, `includes/foreman.cls.php` | **Implemented** |
| Job types | `job.type.php`, `includes/job.type.cls.php` | **Implemented** |
| Job suggestions, accept and decline | `job.suggestion.php`, `includes/job.suggestion.cls.php` | **Implemented** |
| Orders | `order.php`, `includes/order.cls.php` | **Implemented** |
| Order authorisation (admin and production) | `order.authorisation.php`, `includes/order.authorisation.cls.php` | **Implemented** |
| Raise invoice | `raiseInvoice.php`, `includes/raiseInvoice.cls.php`, `includes/invoicePDF.cls.php` | **Implemented** |
| Pre-start agreements | `prestart.agreement.php`, `includes/prestart.agreement.cls.php` | **Implemented** |
| Budget adjustments | `budget.adjustment.php`, `includes/budget.adjustment.cls.php` | **Implemented**. `budget.adjustment.1.php` and `includes/budget.adjustment.cls.1.php` are extra copies |
| Assets: list, contact, movement | `asset.list.php`, `asset.contact.php`, `asset.movement.php` and matching classes | **Implemented** |
| My tasks queues | `my.tasks.php`, `includes/my.tasks.cls.php` | **Implemented** |
| Search | `Search.php` | **Implemented** |
| File upload of company logo on suggestion save | `JobSuggestion::Save` writes into `$SystemSettings[CompanyLogoDir]` | **Implemented** |

### Dashboards and reports

| Feature | Where | Status |
|---|---|---|
| Sales dashboard on home for group 5 | `home.php`, `includes/dashboard.home.sp.cls.php` | **Implemented** |
| Manager dashboard | `kpi.php` for groups `-1`, `1`, `2`; class `includes/dashboard.home.manager.cls.php`. The call on `home.php` is commented out | **Implemented** on KPI. **Removed** from home |
| Contract-manager and sales dashboards as their own pages | `dashboard.cm.php`, `dashboard.sp.php`, `dashboard.php` | **Implemented** pages |
| Dashboard user class (cash-flow figures) | `includes/dashboard.users.cls.php` | **Implemented** |
| Highcharts on the dashboards that include it | `plugins/Highcharts/js/highcharts.js` | **Implemented** |
| Foreman reports (budget versus actual, labour versus invoiced, ratios, overspend) | `reportForeman.php`, `includes/reports/foreman/` | **Implemented** |
| Other reports (contact-log follow-up, enquiry follow-up, online usage, referred by) | `report.php`, `includes/reports/other/` | **Implemented** |
| QS incentive | `reportQSIncentive.php`, `includes/reports/qsincentive/` | **Implemented**. Groups `-1` and `1` are the ids checked in that page |
| Asset management report | `reportAssetManagement.php`, `includes/reports/assetmanagement/` | **Implemented** |
| Cash-flow PDF cron | `cron.CashFlow.php`, `GenerateCashFlowPDF` in `project.functions.inc.php` | **Implemented** |
| Committed cash-flow PDF samples | `Cash Flow Report/` folders `1-INDAWO CAPE (PTY) LTD`, `2-INDAWO_GAUTENG`, `4-INGOZI`, `5-INDAWO_CONSTRUCTION`, `6-owINDAWO_GAUTENG`, `7-PRODUCTIONPOWERCC`, `8-WARAC`, `9-LUVTHIS INDAWO CONSTRUCTION` | **Implemented** as files. There is no folder `3-`. These names are not a substitute for `sysCompany` |

### Sync and operations

| Feature | Where | Status |
|---|---|---|
| Nightly lookup, client, Foreman, and data-dump sync | `Cron.daily.1.Lookups.php` through `Cron.daily.6.DataDumps.php`, `_sync.cls.php` | **Implemented** |
| Per-record Foreman update on suggestion accept | `includes/job.suggestion.cls.php` | **Implemented** |
| Order-authorisation reminder email | `cron.daily.orderauth.php` | **Implemented** |
| Monthly cancel of new orders for company 1 | `cron.daily.ordercancel.php` | **Implemented** |
| Manual and repeater cron variants | `cron.daily.manuel.php`, `cron.daily.repeater.php`, `cron.daily2.php`, `cron.DataDumps.php` | **Implemented** files. Which one a host scheduled is **Unknown** |
| FTP deploy pipeline | `bitbucket-pipelines.yml` | **Implemented** |
| PHP info page | `phpinfo.php` | **Implemented**. It is a public script if the web root is this tree |
| Sandbox page | `zSandBox.php` | **Implemented** |

## Recently changed

On `master`, the last product commit before the library update is `7692ad1` (2019-08-06, "Fix repo & and Upgrade project to PHP7"). The tip `ed7defd` (2020-06-03) updates PHPExcel and mpdf and adds `vendor/` (`mpdf/mpdf` v8.0.4, `setasign/fpdi` v2.2.0). Application pages still include `mpdf/mpdf.php` and `PHPExcel/Classes/PHPExcel.php`.

`origin/Jacques` (`53997b4`, 2020-06-17) is the newest remote commit. It is not on `master`. Files it changes are listed in the project plan. Behaviour of that diff was not reviewed line by line.

`origin/development` (`dfe637c`, 2019-09-20) contains "Fix issue with PDF generation" and is not an ancestor that was re-read for this set. `master` does not contain that commit.

## Planned

No TODO, roadmap, or issue list in this repository describes unfinished product work.

The README's AWS CodeDeploy steps are written as setup instructions, not as a future feature, and the files they need are absent. Treat that as a documentation mismatch, not as a planned feature.

MFA, realtime sync, and PHP 8.4 work appear in later Silicon Ark sets for other repositories. They are not planned items inside this repository.

## Deprecated, copied, or unused-looking files

These are committed. A page that was traced includes the unsuffixed name. The copies are still requestable if the document root is the repository root. Whether any copy is the one operations actually run is **Unknown / Requires Confirmation**.

- Login: `login (2).php`, `login - New.php`, `login - Working.php`.
- Jobs: `job - Copy.php`, `job - Copy (2).php`.
- Project functions: `project.functions.inc - Copy.php`.
- Pre-start: `prestart.agreement - Copy.php` and two class copies.
- Reports: `report - Copy.php`, `reportQSIncentive - Copy.php`, several asset-list report copies.
- Orders and invoices: `includes/order.cls - Copy.php`, `order.cls - B VAT.php`, `order.cls - B VAT Update.php`, and the same pattern on `raiseInvoice.cls`, `foreman.cls`, `dashboard.users.cls`.
- Budget: `budget.adjustment.1.php`, `includes/budget.adjustment.cls.1.php`, `includes/budget.adjustment.cls - Copy.php`.
- Assets: `asset.movement - Copy.php`, `asset.movement - Copy (2).php`.
- Crons: `Cron.daily.2.Clients - Copy.php`, `cron.CashFlow - Copy.php`, `cron.CashFlow - B VAT.php`, `cron.CashFlow - B VAT Update.php`, `cron.daily.jobs - Copy.php`, `cron.daily.manuel - Copy.php`, `cron.daily.bak.php`, `cron.daily.ordercancel_old.php`, `cron.daily.ordercancel.test.php`, `Cron.daily.update_not_use.php`, `cron.daily.repeater.update.php`.
- Email class: `_nemo.email.cls - Copy.php`.
- Dashboard: `includes/dashboard.home.sp.cls - Copy.php`, `includes/recovered/dashboard.home.manager.cls.php`, `includes/restorebackup/dashboard.users.cls.php`, `includes/zdashboard.cls.php`.
- Legacy PDF tree: `mpdf_PHP5.6_version/`. The include in `project.functions.inc.php` is `mpdf/mpdf.php`.
- Composer mPDF 8 under `vendor/`. No application file requires `vendor/autoload.php`.
- `xhome.php` is an empty file in git (zero-byte diff in the failed-checkout stat). Not a feature.
- Spreadsheets `Contact Log.xls` and `results.xls`, and `a_test_attachment1.txt`, `a_test_attachment2.txt`, are committed data files, not screens.

`home.php` manager-dashboard code is commented out. **Removed** from that page. The same dashboard remains on `kpi.php`.
