The /hk-planner/api/auth/ → central auth nginx block was missing, causing
logout to hit the app backend. Also corrects the logout URL and switches from
window.location.href='/' to reload(). Shows name + email in sidebar footer.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The planner needs to know who is available and for how long (scheduling),
not paid hours after payroll deductions. Workforce was returning explicit
break data for some shifts (e.g. a 30-min break on a 12:00–14:00 shift),
causing those hours to display short. Strip all break logic and use raw
start→finish duration.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Workforce's automatic_break_length is a payroll deduction setting, not a
scheduling field — applying it when no explicit breaks are present was silently
shortening all shifts (e.g. a 2h shift showing as 1.5h). Now only deducts
explicit break records from s.breaks. Also adds BUILD_VERSION to /health and
an UpdateBanner that prompts staff to reload when a new deploy lands.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Six PUT /api/config/* routes were missing per-route capability checks —
any authenticated hk-planner user could modify staff, time requirements,
pickup data, tasks, adjustments, and last-reviewed regardless of their cap.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Rename 'Category Settings' to 'Settings' (nav, page title, component)
- Move Recurring General Tasks and Time Requirements editing to Settings page
- Planner still loads both for calcRequired calculations
- Add date-specific Adjustments section to Planner: per-date +/- hour
offsets keyed by YYYY-MM-DD (non-recurring); feed into Required Hours total
- Adjustments row shown in Required Hours tfoot when non-zero
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pulls HK staff shifts from Workforce.com API into the staff rota section.
Rota rows (read-only, WF badge, times+hours per day) appear above manual rows;
manual name inputs get a datalist populated from WF staff. Sync triggered via
button with stale-week detection. Dept selection stored per-app in CategorySettings.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
▲/▼ indicators relate to occupied rooms, not D/S/A breakdown,
so move them to the top of the Rooms cell in both CatRows and TotalRows.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 2px left border on Rooms th/td marks each day boundary clearly
- Saturday/Sunday columns get a subtle blue-tinted background
- Occupied number shows pickup-change context + prior week stats on hover
- '+' pickup button shows prior week line (matching original WP plugin logic)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Match the original WP plugin layout — left cell has occupied count, vac,
and pickup controls; right cell has departs/stays/arrivals stacked
vertically, right-aligned, with delta indicators above them.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The frontend nginx proxies to 'backend:3001', so services must be named
backend/frontend. Drop the external hnf_net network (each app runs in its
own LXC) and add apparmor=unconfined for docker-in-LXC.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Housekeeping workload and hours planning app — port of the WP hotel
housekeeping hours calculator plugin. 7-day occupancy planner with
Newbook PMS integration, staff rota, time requirements, and pickup tracking.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>