Ports two modules from the friend's Google Apps Script build (kept as
reference in gscript/) onto the TypeScript stack, rewritten cleanly against
this app's own data model rather than copied 1:1:
- Shift planning: weekly template (Sun-Thu evening, Fri/Sat two slots),
lazy idempotent generation per period (no cron needed), employee
signup/cancel with collision + capacity checks, admin calendar view with
slot editing and manual assignment.
- Month closure + payroll: employee confirms the month (blocked while a
shift is still open), admin locks and finalizes pay (base hours * rate +
tips/bonus/other), reopen to undo a premature lock, mark paid. Pay rates
are versioned by date, defaulting the first-ever rate to apply
retroactively to the employee's whole history.
- A shift left open more than 12h (forgotten clock-out) is auto-closed at
clock_in + 12h, checked lazily on read instead of a background job.
- Full dark, sharp-edged modern restyle (theme.css replaces tui.css) with
an amber accent, keeping every existing class name so no component
logic needed to change.
Backend test coverage (jest) for all three workflows: shift planning,
closure/payroll, and the forgotten-clock-out auto-close.