The daily dashboard
Orders, invoices and shipments per day against the same day 52 weeks earlier. It exists twice: as a screen behind the usual permission, and as a token-guarded page anyone with the token can open.
The daily dashboard is the at-a-glance view of what happened today, compared against the matching day a year ago.
What it counts
Per day, for each day in the trailing window:
| Figure | From |
|---|---|
| Sales orders, count and turnover ex VAT | salesorderclassifications joined to salesorders, on the transaction date |
| Invoices, count and turnover ex VAT | invoiceclassifications joined to invoices, on the transaction date, orders only |
| Item fulfillments, count | itemfulfillmentclassifications joined to itemfulfillments, on the creation date |
Two things to know before comparing these columns. Orders and invoices count on the transaction date while fulfillments count on the creation date, so the three are not on the same clock. And the figures are read from the classification tables, so a day that has not been classified yet reads as zero rather than as missing.
The page also shows when the day was last refreshed: the moment the classify_salesorders batch for that date last finished.
The comparison
The comparison day is the same weekday 52 weeks earlier, not the same calendar date. A year is 52 weeks plus a day or two, so this keeps Monday against Monday, which is what retail volume follows.
The comparison is always on. The screen has a compare checkbox, and it has no effect: the value is 1 whether the box is ticked or not.
Controls
| Control | Default |
|---|---|
| Date | Today |
| Trailing days | 7, up to 31 |
| Compare | On, and cannot be switched off |
It exists twice
| The screen | The embedded page | |
|---|---|---|
| URL | /dashboards/daily | public.php with a ?token= |
| Guard | Session, Cloudflare Access, the page permission | The token only |
| Built by | app/http/dashboards/daily.php and a Smarty template | app/public/dashboards/daily.php, which builds its own head and body in PHP |
Anyone holding the token can open the embedded copy, from anywhere, with no user account. That is a different access boundary from the screen, and it is the reason the token is a credential rather than a URL parameter. The embedded copy also carries its own asset list, so a CDN asset changed in templates/head.tpl has to be changed there too.
This screen has no app/data/ endpoint: it renders its figures server-side rather than through a bootstrap-table.
Related
Evidence
Figures, their source tables, the date columns each uses, the 52-week comparison, the controls and their defaults, and the last-updated lookup, all from app/http/dashboards/daily.php. The compare value being fixed at 1 is on the same page, in the $settings['compare'] assignment. The two surfaces and their guards from app/public/dashboards/daily.php and AGENTS.md, Entry points. The duplicated asset list from AGENTS.md, Templating and frontend. Basis: code-checked at 30f5313.
- Type
page - Status
active - Updated
2026-09-14 - Created
2026-09-13 - Covers
dashboards/daily