runRotaSync: only protect today's timesheet row when it has real
clocked-out hours (hours > 0), so stale ?/0h rows and empty rows
are healed by the next rota sync without needing manual intervention.
runTimesheetSync: revert to SKIP for today when no completed shifts —
writing an empty row was overwriting the rota schedule with nothing.
Frontend: fetch wfShifts for the full week after a timesheet pull
(not just up to today), so future rota rows aren't dropped from state.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds thisMonday() helper and uses it as the fallback wherever the
week start was previously today. The Today button also snaps back
to this week's Monday rather than the literal current date.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>