L Ledger Timesheets UI mockup
EV · single user
Generated output · document language nl

One document model, on paper

The month table on the timesheet screen and the exported PDF are both rendered from GET /api/timesheets/{id}/document. These four sheets are the same structure in four states, so the omission rules cannot disagree between screen and paper. Interface language stays English everywhere else in the product — including the chrome around this preview.

A4 · 210 × 297 mm labels from a nl bundle — a second language is a new bundle file, not a model change

Label bundle (nl)

no label literal is allowed in the renderer
Verification replaces this file with a sentinel bundle and expects only keys and data values back — that is the cheapest way to keep hard-coded labels out of a generated document.

What the paper proves

  • Invoice reference on every artifact, at the value it had when generated — the join key for the Peppol application, and nothing else about invoicing.
  • Overtime is a visibly separate row for the same date, never merged into the regular line, and never appears unless someone entered it.
  • Summary column absent when no regular or overtime summary exists; clock columns absent when the client's policy is off.
  • Totals as durations and day equivalents — no rate, no amount, no VAT.
  • Identity block from the timesheet's own Party Details snapshot, with a text-only fallback when no logo exists.
  • Superseded artifacts keep their bytes: the stamp is applied by the viewer for this preview, never written into the stored PDF.

Design notes — document