L Ledger Timesheets UI mockup
EV · single user
One Daily Entry per date: regular work, and overtime as its own record.

Design notes

  • TS-03 TS-04 One DailyEntry per date: regular work and the optional Overtime Record are two sides of one row, which is why the day editor is one drawer and the table shows one indented row per pair.
  • TS-06 QF-01 QF-06 The D button and the D key are the same call, so they cannot drift.
  • WS-08 DEC-16 Weekday headers and row-major focus follow firstDayOfWeek; filler cells are never targets and focus stops on the last date.
  • I1 I2 The two snapshots are shown as stored, never re-derived; the diff and Refresh snapshots are Draft-only.
  • TOT-03 TOT-04 TOT-08 Totals divide the summed month once, and the strip shows that arithmetic instead of asking for trust.
  • RDT-02 RDT-05 DEC-19 The confirmation lives in a separate table keyed by (timesheet, date) with no reason column, so the dialog has no field for one.
  • GAP-02 GAP-03 GAP-04 Exported and Locked render no inputs at all; 409 state_locked carries nextAction: unlock and the screen shows that one action.
  • DEC-09 I10 GAP-06 A stale version token is refused with the winner’s value reloaded — never silently overwritten.

Timesheet details

Snapshots in force

Timesheet artifacts

immutable, newest first

History

meaningful revisions, oldest first

    Record work on this date?

    No written reason is asked for or stored. Confirming unlocks this one date in this one timesheet — the next weekend will ask again.

    Export this timesheet

    Permanent and immutable: no edit, no replace, no delete. A correction costs one Amendment Reason and creates the next artifact.

    Edit this timesheet

    Stored verbatim in the history and visible in the panel beside the timesheet. It is not printed on the PDF.

    Lock this timesheet?

    Locking protects an exported timesheet from accidental editing — nothing else. It does not mark anything as sent, delivered, invoiced or closed, the PDF already generated stays exactly as it is, and the month remains reachable.

    Unlocking later requires an Amendment Reason and marks the current artifact superseded. Lock needs an Exported timesheet: 422 lock_requires_exported if it somehow runs in Draft.