# Features — convergence_production (Convergence 2017)

Evidence date: 2026-10-18.

Source: `master` at `a91a555` (2021-06-15). Git history after the initial import does not add features. "Recently changed" below uses the dated comments inside the files, not git.

Menu placement is **Unknown**. Items appear only when `sysMenuLevel2.strUrl` points at the page and the user’s group has `blnView = 1`.

## Current features

### Shell and access

| Feature | Status | Evidence |
|---|---|---|
| Email and password sign-in | **Implemented** | `login.php`, `_framework/_nemo.password.cls.php` |
| Session shell with Silicon Overdrive logo | **Implemented** | `layouts/layout.back.incl.php`, `_framework/_nemo.cls.php` |
| Security-group menu | **Implemented** | `_framework/_nemo.menu.cls.php` |
| Five-failure lockout | **Implemented** | `CheckSecurityLock` in `_framework/system.functions.inc.php` |
| Password reset email | **Implemented** | `login.php` calls `ajaxFunctions.php` `type=SendResetEmail` |
| Profile and profile picture | **Implemented** | `my.profile.php`; header reads `sysUser.Profile:PicturePath` |
| Users | **Implemented** | `user.php`, `includes/user.cls.php` (`sysUser`, `hrStaffAux`) |
| Security groups and menu rights | **Implemented** | `security.group.php`, `includes/security.group.cls.php` |
| System settings | **Implemented** | `settings.php`, `includes/settings.cls.php` (`sysSettings`) |
| Under-construction switch | **Implemented** | `system.php`, `under.construction.php` |
| FAQ | **Implemented** | `faq.php`, `faq.console.php`, `includes/faq.cls.php` (`sysFAQ`) |
| Audit log screen | **Implemented** | `audit.log.php`, `includes/audit.log.cls.php` (`sysAuditLog`) |
| Translations | **Implemented** | `_framework/_nemo.translations.inc.php`, `_nemo.menu.translator.cls.php`. Language comes from the user session. Which languages are loaded is **Unknown** |

### Home

| Feature | Status | Evidence |
|---|---|---|
| Dashboard tiles, growth chart, ticket stats, to-do lists | **Implemented** | `index.php`, `includes/dashboard.cls.php` |
| Project WBS on the `lamp` host only | **Implemented** | `Dashboard::RenderProjectWBS`, gated by `SERVER_NAME == "lamp"` |
| HR dashboard | **Implemented** | `hr.dashboard.php`, `includes/hr.dashboard.cls.php` |

### Helpdesk

| Feature | Status | Evidence |
|---|---|---|
| Clients | **Implemented** | `client.php`, `includes/client.cls.php` (`crmClient`) |
| Client wizard | **Implemented** | `client.wizard.php`, `includes/client.wizard.cls.php` |
| Client sites | **Implemented** | `client.site.php`, `includes/client.site.cls.php` (`crmClientSite`) |
| Contacts | **Implemented** | `contact.php`, `includes/contact.cls.php` (`crmContact`) |
| Suppliers | **Implemented** | `supplier.php`, `includes/supplier.cls.php` |
| Tickets, including merge, complete, archive, email | **Implemented** | `ticket.php`, `includes/ticket.cls.php` (`crmTicket`) |
| Ticket wizard | **Implemented** | `ticket.wizard.php`. `schedule.php` "Quick Ticket" clears the wizard session and opens it |
| Ticket templates (negative ticket ids, status not Closed) | **Implemented** | `Ticket::getTicketTemplateList` |
| Client authorise / decline page | **Implemented** | `ticket.ops.php` |
| Tasks, fault codes, fix codes | **Implemented** | `task.php`, `fault.codes.php`, `fix.codes.php` (`crmTask`, `crmTaskFault`, `crmTaskFix`) |
| Service boards | **Implemented** | `service.board.php`, `includes/service.board.cls.php` (`crmServiceBoard`) |
| Departments and per-process statuses | **Implemented** | `department.php`, `department.status.php` (`crmDepartment`, `crmDepartmentStatus`) |
| SLA tickets, tasks, schedules | **Implemented** | `sla.ticket.php`, `sla.task.php`, `sla.schedule.php` |
| Calendar | **Implemented** | `schedule.php`, `includes/schedule.cls.php`. Comment says the calendar was adapted from a FullCalendar CRUD example |
| Time entries | **Implemented** | `time.php`, `includes/time.cls.php` (`crmTime`) |
| Inbound email to ticket | **Implemented** | `cron.email.scry.php`, `emailscry/` |
| Outbound ticket and task notification mail | **Implemented** | `cron.hourly.php` cases `Ticket.New`, `Ticket.Notification`, `Task.Assigned` |

### Quoting

| Feature | Status | Evidence |
|---|---|---|
| Proposals, groups, items | **Implemented** | `proposal.php`, `includes/proposal.cls.php` |
| Proposal templates | **Implemented** | `proposal.template.php`, `includes/proposal.template.cls.php` |
| Proposal dashboard | **Implemented** | `proposal.dashboard.php`, `includes/proposal.dashboard.cls.php` |
| Sectional PDF and email | **Implemented** | `Proposal::GenerateSectionalPDF`, `Proposal::EmailProposal` |
| New revision and duplicate | **Implemented** | Status `3c. Revised` on the old row; `Draft` on a duplicate |
| Create tickets from a proposal | **Implemented** | `createTmpTicket`, `createTicketFromTmp` |
| Order from supplier and refresh cost from product | **Implemented** | `Proposal::OrderFromSupplier`, `UpdateProposalItemsCostFromProduct` |
| Products and bundles | **Implemented** | `product.php`, `product.bundle.php` |
| Payment terms | **Implemented** | `payment.terms.php` (`crmPaymentTerms`) |
| Proposal line widgets | **Implemented**, with a hardcoded session | `widget.php` sets `$_SESSION[USER]->ID = -1` before building proposal widgets |

### HR

| Feature | Status | Evidence |
|---|---|---|
| Leave applications | **Implemented** | `hr.leave.application.php`, `includes/hr.leave.application.cls.php` |
| Leave types | **Implemented** | `hr.leave.type.php` (`hrLeaveType`) |
| Public holidays | **Implemented** | `hr.public.holiday.php` (`hrPublicHoliday`) |
| Leave reports (summary, details, annual cycle, sick cycle) | **Implemented** | `report.console.php` and `includes/hr.*.rpt.php` |
| Roles, core values, KPAs, KPIs | **Implemented** | `hr.role.php`, `hr.core.value.php`, `hr.kpa.php`, `hr.kpi.php` |
| KPI Excel import | **Implemented** | `import.php`, `imported.php`, `includes/import.cls.php` |
| Captain’s log | **Implemented** | `hr.captains.log.php` (`hrLog`) |
| Performance reviews and initialise | **Implemented** | `hr.performance.review.php`, `hr.performance.review.initialize.php` |
| My performance review | **Implemented** | `hr.my.performance.review.php` |
| Review wizard | **Implemented** | `hr.survey.wizard.php`, `hr.survey.overview.php` |
| Survey steps | **Implemented** | Hard KPAs and KPIs, soft KPAs and KPIs, job-role objectives, personal development plan, employee satisfaction |

### Education and infrastructure

| Feature | Status | Evidence |
|---|---|---|
| Training courses, materials, certificates | **Implemented** | `edu.training.course.php`, `edu.training.material.php`, `edu.training.certificate.php` |
| Certificate report | **Implemented** | `edu.training.course.certificate.rpt.php` |
| Stored certificate files | **Implemented** | `edulab/training_certificates/` |
| Client servers | **Implemented** | `so.server.php` (`soServer`) |
| Software updates and per-server updates | **Implemented** | `so.update.php`, `so.server.update.php` |
| CSV import of updates | **Implemented** | `includes/import.updates.CSV.cls.php` |

### Jobs, files, and messages

| Feature | Status | Evidence |
|---|---|---|
| Daily reminder and SLA job | **Implemented** | `cron.daily.php` tasks 1–8 |
| Hourly notification job | **Implemented** | `cron.hourly.php` |
| File integrity monitor | **Implemented** | `cron.fim.php`, `_framework/_nemo.fim.cls.php` |
| Email templates and sent-mail log | **Implemented** | `email.php`, `email.template.php` (`tblEmail`, `tblEmailTemplate` on the aux database) |
| Read receipt | **Implemented** | `email.read.receipt.php` |
| SMS send helper | **Implemented** | `SendSMS` in `_framework/system.functions.inc.php` |
| Project summary report | **Implemented** | `includes/project.summary.rpt.php`, registered in `report.console.php` |
| Paint Your Day Green report | **Implemented** | `pydg.report.php` exports an Excel file named `paint_your_day_green_report_*.xls` |

## Completed features

Nothing in git is marked finished and removed. Comment history treats the following as finished inside this tree:

- Guest access removed (2017-03-07, `_nemo.cls.php`).
- mysqli database class adopted for the include path (2014-11-26 comment; `system.functions.inc.php` includes `_nemo.database2.cls.php`).
- Password hashes in `sysPassword` instead of a clear-text comparison (2016-09-21).
- Ticket complete, task complete, and ticket archive actions (2019-01-17 comments on `ticket.php`).

Provenance: **Inferred** from comments that describe the change as done. No issue tracker is in the repository.

## Planned or unfinished in the tree

| Item | Evidence | Status |
|---|---|---|
| Opportunity list | `includes/opportunity1.cls.php` and `opportunity2.cls.php` return a fixed HTML table (sample subjects, agent names Russel, Gael, PJ). No `NemoDatabase` table | **Prototype**. Not a stored opportunity pipeline |
| `opportunity.php` | Same structure as an older `ticket.php`, includes `includes/ticket.cls.php`. Missing the 2019-01-17 complete/archive comments that `ticket.php` has | **Superseded copy** of the ticket page. Not a separate product |
| Hourly leave emails | `Leave.Submit`, `Leave.Decline`, `Leave.ApproveHR`, `Leave.ApproveMAN` in `cron.hourly.php` are inside block comments | **Removed from the hourly page**. Daily leave reminders remain |
| `Task.Update` hourly mail | Case is commented out in `cron.hourly.php` | **Removed from the hourly page** |
| Second project-summary report | `project2.summary.rpt` registration is commented out in `report.console.php` | **Not registered** |
| VAT rate from `sysVAT` | The lookup in `system.php` is commented out (2018-03-27) | **Not active** |
| Predictive-order chart | `predictive.order.nemo.js.chart.rpt.php` calls `checkPharmacyKey` and reads `$_SESSION[USER]->PHARMACYKEY` | **Inherited Nemo/pharmacy report**. No Convergence caller was found. **Unknown** whether the menu points at it |
| `widget.php` session override | Sets the user id to `-1` | **Implemented** and unsafe if the URL is reachable |

## In development at the 2021 import

No branch other than `master`. No TODO that names an owner and a date after June 2021. The opportunity mock (October 2019 comment on `opportunity1.cls.php`) is the last unfinished screen the comments describe.

## Changed shortly before the import

Dated copies sit beside the live files. They are snapshots, not a second application.

| Copy | Beside |
|---|---|
| `PHPExcel20210315/` | `PHPExcel/` |
| `includes/mpdf20210315/` | `includes/mpdf/` |
| `project.functions.inc.php20210315` | `project.functions.inc.php` |
| `_nemo.details.cls.php20210315`, `_nemo.details2.cls.php20210315`, `_nemo.details2.cls.php20200302` | the undated details classes |

Git commits on 2021-06-15 add an SLA column (`9737929`, `162985d`, `dfc8673`) and import tables (`a33b4fb`, `a91a555`). The column change is in those commits’ messages. The SQL itself is not a file in the tip.

## Deprecated or backup copies

These files are in the tree. Nothing deletes them. Whether the menu still links to them is **Unknown**.

| File | What it is |
|---|---|
| `includes/proposal.bak.cls.php` | Older proposal class |
| `sla.ticket.backup.php` | Older SLA ticket page |
| `time.bkp20180910.php` | Time page backup, 2018-09-10 |
| `ajaxFunctions.pj.php` | Alternate ajax file |
| `controls.pj.php`, `controls.russel.php`, `controls.cls.php` | Alternate control experiments. `controls.cls.php` uses table `tblTest` |
| `hr.leave.application.russel.php`, `hr.leave.type.pj.php`, `hr.leave.type.russel.php`, `hr.public.holiday.russel.php` | Named copies of HR pages |
| `includes/hr.leave.application.cls.russel.php` and the matching `.pj` / `.russel` classes | Named copies of HR classes |
| `includes/pydg.report.cls.alt.dont.delete.php` | Alternate Paint Your Day Green class. The filename says not to delete it |
| `clientTest.php`, `includes/clientTest.cls.php` | Client wizard experiment using `NemoDetails` |
| `test.php` | Dashboard experiment that calls `getDepartmentStatus("Task", 6.1, 1)` |
| `email.test.php` | Sends a message with two test attachments |
| `_framework/_nemo.report.pfizer.cls.php` | Report class named for Pfizer. No Convergence page was found that includes it |

## Not features

- `vendors/` is third-party UI code (Bootstrap, jQuery, DataTables, FullCalendar, Select2, Chart.js, echarts, Morris, Parsley, Dropzone, and others).
- `uploads/`, `profilepictures/`, and `edulab/training_certificates/` are stored files, not features.
- `build/css` and `build/js` are built theme assets. No build script was found at the repository root.
