# 09 — Reporting

Reporting is not a feature bolted on at the end; it is the reason the owner buys the
system. With five branches in three cities, **the owner manages by report, not by
presence**.

Design principles:

1. **Every report is filterable by branch and comparable across branches.** A number
   without a peer to compare against is not actionable.
2. **Every report resolves to the same numbers as the immutable documents.** Reports read
   from the ledger of orders/charges/invoices/movements — never from separate counters that
   can drift.
3. **Time is by `business_day`**, not calendar timestamp (doc 06 §5).
   **Comparisons and averages use trading days only** — owner-declared closures are excluded
   and the report states which comparison day it used ([10 §3.1](10-cross-cutting-rules.md)).
   Comparing a trading day against a closed day produces a meaningless −100%.
4. **Currency is normalised to IQD** for comparison, with the original currency retained.
5. **Push, don't pull.** The daily digest arrives on the owner's phone; they should not
   have to log in to know something is wrong.

---

## 1. The owner's daily digest

One message, every morning, per branch and consolidated. If only one thing ships in Phase 1
reporting, ship this.

```
BAGHDAD MAIN — 4 Aug 2026
Sales            1,845,000 IQD   ▲ 6% vs 28 Jul (last trading Mon)
  Paid              980,000
  On account        865,000
Orders                   214     Avg ticket  8,621
Cash variance         −2,000 IQD  ✓ within tolerance
Voids                 3 (0.8%)   Discounts  1 (12,000)
Waste                26,000 IQD  (1.4% of sales)
Receivables       12,480,000 IQD  ▲   Overdue  1,905,000
Caps                 2 employees at 90%+ of allowance
Low stock                     3 items
```

On a declared closure the digest still sends, stating the closure and its reason, so silence
is never ambiguous — a branch that sends nothing means a branch that is offline, and that is
a different problem.

---

## 2. Sales & operations

| Report | Answers | Key dimensions |
|---|---|---|
| **Daily sales summary (Z-report)** | What happened yesterday | Branch, day |
| **Sales by hour of day** | When to staff, when to schedule breaks | Branch, weekday |
| **Sales by item / category** | What sells, what to delist | Branch, period |
| **Sales by buyer type** | Walk-in vs account vs staff mix | Branch, period |
| **Average ticket & items per order** | Upselling effectiveness | Branch, cashier |
| **Prep time distribution** | Speed of service, p50/p90 | Branch, station, hour |
| **Modifier take-up** | Which paid extras actually sell | Item |
| **Order volume by fulfilment** | Counter vs delivered-to-office | Branch |
| **Delivery-to-office load** | Whether a runner is justified | Branch, hour |

### Branch comparison (the report the owner opens first)

| Metric | Per branch |
|---|---|
| Net sales, and vs same period last month/year | |
| Orders, average ticket | |
| Gross margin % (sales − COGS) | |
| Labour cost % | |
| Rent as % of sales | |
| Waste % | |
| Cash variance (absolute and per shift) | |
| Void % and discount % | |
| Receivables balance and overdue % | |
| **Branch net profit** | |

Ranked, with the best and worst highlighted. Five branches in one table is the entire
management dashboard.

---

## 3. Financial

| Report | Content |
|---|---|
| **Branch P&L** | Sales − COGS − Rent (accrued) − Payroll − Other opex = Branch profit |
| **Consolidated P&L** | All branches plus head-office costs |
| **Gross margin by item** | Selling price vs recipe cost; ranked. Drives menu decisions. |
| **COGS reconciliation** | Theoretical (recipes) vs actual (stock movement) |
| **Tender mix** | Cash / card / wallet / transfer / on-account, by branch |
| **Cash-flow forecast** | Upcoming receipts vs obligations, 30/60/90 days (doc 08 §7) |
| **Expense breakdown** | By category, by branch, with month-over-month trend |
| **FX exposure** | USD-denominated obligations (rent, imported supplies) at current rate |

---

## 4. Receivables (see doc 05 §8)

| Report | Answers |
|---|---|
| **AR aging** | Who owes what, how late |
| **Unbilled charges** | Exposure not yet invoiced |
| **DSO** | How long cash takes to arrive |
| **Account statement** | The tenant-facing document |
| **Top accounts by revenue** | Concentration risk — losing one tenant may be losing 20% of a branch |
| **Consumption by authorized person** | The tenant's own question, answered before they ask |
| **Cap utilization** | Who is near or over their company-funded allowance, mid-cycle |
| **Cap exceptions** | Overage approvals and who authorised them |
| **Funded vs personal split** | How much of account-linked volume the companies actually pay for |
| **Credit exceptions** | Overrides, provisional offline charges |
| **Write-offs & credit notes** | Losses, by approver |

---

## 5. Inventory

| Report | Answers |
|---|---|
| **Stock on hand & value** | Per branch, per category |
| **Stock count variance** | Where physical disagrees with system |
| **Shrinkage (theoretical vs actual usage)** | The loss signal (doc 07 §8) |
| **Waste analysis** | By reason, item, branch, employee |
| **Purchase price variance by branch** | *Basrah pays 12% more for the same milk* |
| **Supplier performance** | On-time %, short-delivery %, price stability |
| **Slow-moving / dead stock** | Cash sitting in the store room |
| **Reorder due** | What to order today |
| **Inter-branch transfer log** | Frequency and discrepancies |

---

## 6. People

| Report | Answers |
|---|---|
| **Labour cost %** | Payroll ÷ sales, per branch, trended |
| **Sales per labour hour** | Productivity, comparable across branches |
| **Attendance & lateness** | Per employee, per branch |
| **Outstanding advances** | Real money out, by employee and branch |
| **Sales per cashier** | Volume, average ticket, items per order |
| **Staff consumption value** | Per employee |

---

## 7. Exception & control reports

These are the ones that pay for the system. They should be **generated automatically and
pushed**, not waiting to be discovered in a menu.

| Report | Signal |
|---|---|
| **Cash variance by cashier, trended** | Consistent small shortages |
| **Voids by cashier** — count, value, % | Ring-up-then-void cash extraction |
| **Voids after READY** | Goods left the counter unpaid |
| **Discounts by cashier** | Unauthorised friend pricing |
| **Cash refunds against card sales** | Classic extraction route |
| **No-sale drawer opens** | Drawer access without transactions |
| **Pay-outs without an attached receipt** | Fictitious expenses |
| **Credit limit overrides** | Who is waving charges through |
| **Manual stock adjustments** | By user, by reason, ranked by value |
| **Negative stock events** | Data integrity or theft |
| **Price changes** | Who changed what, when |
| **Late-syncing orders** | Devices staying offline unusually long |
| **Zero-variance-always cashiers** | Statistically implausible; count is being back-fitted |
| **Off-hours activity** | Sales or adjustments outside trading hours |

All comparative across the five branches. Ranking is what makes them actionable — an owner
in Baghdad cannot judge whether Karbala's 0.9% void rate is bad without seeing that the
other four run at 0.3%.

---

## 8. Delivery & access

| Channel | Use |
|---|---|
| **In-app dashboards** | Owner and Accountant, all branches; Manager, own branch |
| **Scheduled push (WhatsApp / Telegram / email)** | Daily digest, weekly summary, monthly P&L |
| **Real-time alerts** | Credit limit breach, large void, large variance, low stock, rent due |
| **Export** | Excel/CSV for the external accountant; PDF for statements and P&L |
| **Print** | Z-report, shift report, statements, PO — Arabic-first |

### Non-functional

- Reports run on the **central** database, never on a POS terminal.
- Yesterday-and-earlier reports read from **pre-aggregated daily rollups** per branch —
  scanning raw order lines for a year-to-date comparison across five branches will not stay
  fast, and this is the one place to invest in aggregation early.
- Rollups are **rebuildable from source documents**, so a late-syncing branch triggers a
  recompute of the affected days rather than a permanently wrong number.
- Every report shows **"data as of"** and flags branches whose last sync is stale — a
  consolidated number silently missing an offline branch is worse than no number.
