The daily dashboard

TL;DR

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:

FigureFrom
Sales orders, count and turnover ex VATsalesorderclassifications joined to salesorders, on the transaction date
Invoices, count and turnover ex VATinvoiceclassifications joined to invoices, on the transaction date, orders only
Item fulfillments, countitemfulfillmentclassifications 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

ControlDefault
DateToday
Trailing days7, up to 31
CompareOn, and cannot be switched off

It exists twice

The screenThe embedded page
URL/dashboards/dailypublic.php with a ?token=
GuardSession, Cloudflare Access, the page permissionThe token only
Built byapp/http/dashboards/daily.php and a Smarty templateapp/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.

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.

About this document
  • Type
    page
  • Status
    active
  • Updated
    2026-09-14
  • Created
    2026-09-13
  • Covers
    dashboards/daily