# Features — qoutes (Silicon Overdrive Quotes)

Evidence date: 2026-10-05.

Source: `git@bitbucket.org:overdrive/qoutes.git`, `master` at `0eb2f86` (2019-11-19).

Menu labels are stored in `sysMenuLevel1` and `sysMenuLevel2` and are not in git. A page listed here exists as a controller. Whether it appears on a given user's menu depends on security rows in the database.

Dated copies (`*.20190910.php`, `includes/quote.cls.20190918.php`, `*.bak`) are snapshots in the tree. Live includes point at the unsuffixed files.

## Current features

### Authentication and shell

| Feature | Status | Evidence |
|---|---|---|
| Email and password login | Implemented | `login.php` |
| Logout link in the header | Implemented | `Nemo::Header` uses setting `LogoutRedirect` |
| Session-expired and access-denied messages | Implemented | `message.php` ids `s13`, `s44`, `r09`, `r10` |
| Menu from the database, filtered by view rights | Implemented | `_nemo.menu.cls.php` |
| My profile | Implemented | `my.profile.php`, `User::SaveMyProfile` |
| Usage log for the last week, including failed-login password text | Implemented | `usage.log.php` |
| Settings list and edit (name read-only, value editable) | Implemented | `settings.php` |
| Users | Implemented | `user.php` |
| Security groups and per-page flags view, delete, save, new, special | Implemented | `security.group.php`, `includes/security.group.cls.php` |
| Email outbox: view, save, send, resend, delete | Implemented | `email.php` |
| Email templates | Implemented | `email.template.php` |

### Home

| Feature | Status | Evidence |
|---|---|---|
| Quote list on the home page | Implemented | `index.php` constructs `Quote` and calls `getList` |
| Bar chart of quote counts by sales person and status | Implemented | `index.php` Highcharts container |
| Bar chart of the same counts for the current month | Implemented | `index.php` second chart |
| Today's bookings widget | Removed from the live path (commented) | `index.php` |
| Usage widget on the home page | Removed from the live path (commented) | `index.php`. The standalone `usage.log.php` page remains |

### Quotes

| Feature | Status | Evidence |
|---|---|---|
| Create, edit, save, delete quotes | Implemented | `quote.php`, `Quote::Save`, `Quote::Delete` |
| Quote number `Q` + 7 digits + revision | Implemented | `Quote::Save`, `Quote::NewRevision` |
| Line items with SKU lookup | Implemented | `ajaxfunctions.php` `loadQuoteItemProduct`, `Quote::AddItem` |
| Grouping heading and grouping order | Implemented | `Quote::Save` |
| Markup, exclude-margin, units, cost, ETA | Implemented | `Quote::Save` |
| Currency, with `$` skipping VAT on the inclusive total | Implemented | Comment 2018-11-07 and `Quote::Save` |
| Client and ship-to style address fields copied on duplicate | Implemented | `quote.php` `Duplicate Quote` |
| Duplicate quote | Implemented | `Quote::Duplicate` |
| New revision and revision dropdown | Implemented | `Quote::NewRevision`, `quote.php` |
| Create sectional PDF | Implemented | `Quote::GenerateSectionalPDF` |
| Hide PDF total when emailing | Implemented | `blnRemoveTotal` on `quote.php` |
| Email client or email yourself; successful client/user send sets status `2. Sent` | Implemented | `Quote::EmailQuoteTo` |
| Status change with confirmation | Implemented | `quote.php` jQuery on `strStatus` |
| PO required before `3a. To be Invoiced` | Implemented | `quote.php` |
| Status emails and QuickBooks handler call | Implemented | `Quote::ChangeStatus`, `Quote::EmailQuote` |
| Archive selected quotes to `3b. Rejected` without the rejected email | Implemented | `Quote::SetRejected` |
| Supplier order number from invoice number and client first word | Implemented | `Quote::Save` |
| Get Price breakdown | Implemented | `Quote::GetPrice` |
| Order from supplier | Implemented | `Quote::OrderFromSupplier` |
| Update product from quote line, or quote line from product | Implemented | `quote.php` actions `Update Product`, `Update Quote`, `Update Quote Description` |
| Manual "mark as invoiced" entry that plants an accounts session | Implemented | `quote.php` `MarkQuoteAsInvoiced` |
| Older single "Email Quote" and "Invoice Quote" actions | Removed from the live path (commented) | `quote.php` |

### Catalogue and parties

| Feature | Status | Evidence |
|---|---|---|
| Clients, including new quote from a client | Implemented | `client.php` |
| Import a client from eIT | Implemented | `ajaxfunctions.php` `ImportEitClient`, `loadEitClientDDL` |
| Products, filter by active, archive (deactivate) | Implemented | `product.php`, `Product` archive sets `blnActive = 0` |
| CSV product import | Implemented | `product.import.php`, header sample `productimport.csv` |
| Categories | Implemented | `category.php` |
| Suppliers, including default warranties AJAX | Implemented | `supplier.php`, `ajaxfunctions.php` `getDefaultWarranties` |
| Sales people | Implemented | `sales.person.php` |
| Quote templates and "create quote" / "quote to template" | Implemented | `quote.template.php`, `includes/quote.template.cls.php` |
| Quote bundles (default markup constant 0.13; comment says markup was removed) | Implemented | `quote.bundle.php`, `includes/quote.bundle.cls.php` |

### CSP

| Feature | Status | Evidence |
|---|---|---|
| CSP dashboard with status, user, and tier filters | Implemented | `csp.dashboard.php`, `includes/csp.dashboard.cls.php` |
| Summary and detailed overview | Implemented | `csp.dashboard.php` `frOverview` |
| Assign more clients | Implemented | `CSPDashboard::assignCSPClients` |
| Export clients as `.xls` for groups 1 and 2 | Implemented | `csp.dashboard.php` (comment 2019-09-10, Rachel) |
| Send for invoicing into the quote system with PO `Office 365` | Implemented | `CSPClient::sendForInvoicing` |
| CSP client maintenance, line items, email client/yourself, create quote | Implemented | `csp.client.php` |
| CSP FAQ | Implemented | `csp.faq.php` |
| CSP import | Implemented | `csp.import.php` |
| CSP SKU lookup | Implemented | `ajaxfunctions.php` `loadCSPClientProductItem` |

### Service 360

| Feature | Status | Evidence |
|---|---|---|
| Service 360 item catalogue | Implemented | `service.360.php` |
| Service 360 groupings | Implemented | `service.360.grouping.php` |
| Per-client Service 360 edit and PDF | Implemented | `client.service.360.php` |

### Reports and scheduled mail

| Feature | Status | Evidence |
|---|---|---|
| ETA report | Implemented | `includes/rpt.eta.php` |
| Quote status report | Implemented | `includes/rpt.quoteStatus.php` |
| Profit report | Implemented | `includes/rpt.profit.php` |
| Report export as `.xls` | Implemented | `report.php` |
| Daily ETA email | Implemented as a script | `cron.daily.php` |
| Stale-status email for `1. New`, `5. Paid`, `0. Error` | Implemented as a script | `cron.daily12.php` |
| Follow-up email for `2. Sent` older than 7 days | Implemented as a script | `cron.monthly27.php` |
| Hourly QuickBooks digest and status copy | Implemented as a script | `cron.hourly.php` |
| File-integrity compare (NemoFIM) on the hourly script | Implemented | `cron.hourly.php` calls `NemoFIM::Compare` |

Commented report registrations for weekly and monthly bookings remain in `report.php` and are not active.

### Documents in the tree

| File | What it is |
|---|---|
| `Sales Workflow.xlsx` | One-sheet process notes for quote status and email. **Documented** process, not executable |
| `System_Proposal_Q00001.1_Notebook_2014-02-13.pdf` | A sample proposal PDF in the repository root |
| `relationships.rtf` | Foreign-key SQL for product, quote, quote item, and quote template item |
| `productimport.csv` | Header row only |

## Planned features

No issue tracker, TODO file, or roadmap is in the repository.

Comments that describe work not present on the live path:

| Item | Evidence | Status |
|---|---|---|
| Additional email attachments on the client quote | `EmailQuoteTo` comment "TODO :: Additional Attachments still need to be added." | **Planned** in a comment |
| Credited status calls `credited.php` | The AJAX block in `ChangeStatus` is commented out | **Planned** or withdrawn. **Requires Confirmation** |
| Home-page usage and booking widgets | Commented in `index.php` | Withdrawn from the home page |
| Booking reports | Commented in `report.php` | Not registered |

`Sales Workflow.xlsx` asks for behaviour the code does not show:

- Do not email when a quote is self-assigned.
- ETA list every day at 16:00.
- Restrict supplier-order actions to named people (the sheet names Ferial, Lynn, and the author).
- A button for follow-up. The list action "Email Client Followup" exists; whether it matches that wish is **Requires Confirmation**.

Those spreadsheet lines are **Documented** wishes or process notes. They are not marked done in code.

## Recently changed features

Git contains one commit, so "recent" is the latest comment dates inside that commit, not a diff.

| Date in comment | Change |
|---|---|
| 2019-09-10 | CSP client export fixed (`csp.dashboard.php`). PDF agreement terms shrinkage fixed (`includes/quote.cls.php` header comment) |
| 2019-02-25 | HTML special characters encoded for Silicon and client notes |
| 2018-11-07 | Currency |
| 2018-04-05 | Scrollbar for the floating toolbar on iPads (`quote.php` header) |
| 2018-03-28 | PDF total calculated from subtotal plus VAT |

## Deprecated or removed

| Item | Evidence |
|---|---|
| `generatePDF` kept, sectional PDF used by the controller | `quote.php` comments say generatePDF was replaced by `GenerateSectionalPDF` for the main actions. `generatePDF` still exists on the class |
| Invoice-quote email action | Commented `Invoice Quote` case |
| QuickBooks credited callback | Commented |
| Invoiced email inside the hourly cron | Commented `Quote::EmailQuote(..., "Invoiced")` |
| Login lockout persistence | `CheckSecurityLock` sets `blnLogin = 0` and then the `Save()` call is commented out. The warning email still sends |
| NemoFIM record and pull-data steps | Commented in `cron.hourly.php`; `Compare` still runs |

## Sandbox and hazard pages

| File | Notes |
|---|---|
| `zindex.php` | Older dashboard sketch. Not linked from `index.php` |
| `zSandBox.php` | Sandbox page |
| `emailcrontest.php` | Small cron/email test page |
| `info.php` | `phpinfo()` with no login check in the file |
| `includes/quote.php` | Older quote controller copy. The live controller is the root `quote.php` |

Provenance: **Implemented** as files. They are not the primary navigation targets.
