# Update Log ## 2026-08-16 - **Creation**: Shift planning module — `shift_slots`/`shift_signups` tables, weekly-template generation (lazy, idempotent, no cron), employee signup/cancel with collision + capacity checks, admin calendar UI (`MonthCalendar`, `ShiftPlanning`, `ShiftPlanManager`). Ported from `gscript/ShiftPlanningService.js`, rewritten against this app's own data model rather than copied. - **Creation**: Month closure + payroll module — `pay_rates`, `month_closures`, `payroll` tables; employee confirms the month, admin locks/reopens/marks paid, tips/bonus/other adjustments, CSV export. Collapses the source system's multi-role (ADMIN/MANAGER/ACCOUNTANT) approval chain down to fit this app's single-admin reality. Ported from `gscript/ClosureService.js` + `gscript/PayrollService.js`. - **Fix**: A shift left open more than 12h (forgotten clock-out) is now auto-closed at `clock_in + 12h`, checked lazily on read (`attendance.ts`) — no admin action or scheduler needed. - **Fix**: The first pay rate ever set for an employee now applies retroactively to their whole history instead of defaulting to "today" — caught live when an admin set a rate after the employee had already worked hours that month. - **Fix**: Locking a month closure with `saveDraftAdjustments` afterward now correctly reports "already locked" instead of the misleading "not confirmed yet" — the two guard conditions used to overlap. - **Addition**: jest + ts-jest added to `backend/` (previously no test runner); coverage for shift planning, closure/payroll, and the forgotten-clock-out auto-close, each against a throwaway temp SQLite DB. - **Update**: Full dark, sharp-edged redesign (`tui.css` → `theme.css`), replacing the light monochrome TUI look with a dark modern SaaS style — amber accent used sparingly, no rounded corners, no colored accent borders. Every existing CSS class name kept, so no component logic needed to change. See [Design system](./frontend/design-system.md). - **Note**: `docker compose` on one of the deploy hosts is now broken even for `up` (not just `ps`/`logs`/`down` as before) — redeploy there with plain `docker run` instead; documented in [Deployment](./architecture/deployment.md). ## 2026-08-12 - **Update**: Documented the actual production shipping workflow in [Build & deployment](./architecture/deployment.md) — build locally for the target platform, `docker save`/`load` over ssh (never copy source to the server), ship only `compose.yaml` + `.env`, nginx reverse proxy template in `deploy/`. - **Creation**: Initial OKF bundle documenting the EatMe attendance system — architecture, data model, API surface, frontend structure, and deployment.