Core and API: multi-pattern presence model, migration and routes (schema 9) #231

6 Commits
Author SHA1 Message Date
overseerandClaude Opus 5.5 0d763519a0 Allow saving presence patterns that cover no weekday
The pattern editor disabled Save unless a weekday was selected, but an
all-empty weekday set is valid in the core model and the API, and
migration 9 produces one for a legacy all-absent schedule. Save now only
requires a name (plus a valid anchor date and a change to save).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 20:03:03 -04:00
overseerandClaude Opus 5.5 b91ecbd5f6 Reject non-integer weekday values in presence pattern requests
The create and edit pattern models typed weekday values as lax int, so
JSON true, "1" and 1.0 were coerced to weekday 1. Type them StrictInt
so each is a 422 naming the pattern field, and add create and edit
regression cases for bool, string, float and out-of-range weekdays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 19:55:43 -04:00
overseerandClaude Opus 5.5 39417615a2 Move the Admin PWA Schedule tab to multi-pattern presence
The admin client still called the removed one-per-child
/presence-schedule route, so the Schedule tab could not load or save
(review finding F1 on PR #231). The client now uses the presence-pattern
routes: list and create under /children/{id}/presence-patterns, and
PATCH / DELETE on /presence-patterns/{id}.

The Schedule screen lists every pattern of the selected child (name,
Home/Away, cycle length, weekday set) with Add, Edit and Delete, and a
pushed pattern editor sets name, kind, cycle length, anchor date and the
per-week weekday set. Edits send only the changed fields. The month grid
shows the combined presence with the core's first-match rule: override,
then any covering away pattern, then any covering home pattern, then
away when the child has a home pattern, else home. The grid keeps the
Sunday-first week; stored weekdays stay Monday=0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 19:45:53 -04:00
overseer 1c2a7222b3 Merge remote-tracking branch 'origin/dev' into task/multi-pattern-presence-model_e63a8e64-2f1a-4818-baf2-0d0431bcd014 2026-09-24 19:39:22 -04:00
dev_agent d3c52974f5 Feature 19 follow-up: calendar week starts on Sunday (#230)
Co-authored-by: dev_agent <17+dev_agent@code.cubecraftcreations.com>
Co-committed-by: dev_agent <17+dev_agent@code.cubecraftcreations.com>
2026-09-24 19:33:22 -04:00
overseerandClaude Opus 5.5 ef6940d937 Replace presence schedules with multiple presence patterns per child (schema 9)
A child now carries zero or more home/away presence patterns instead of
at most one schedule. Migration 9 creates presence_patterns, copies every
presence_schedules row across as a 'home' pattern named "Home schedule"
(cycle, anchor and pattern verbatim), and drops the old table in one
transaction. Migration 1 keeps creating the retired table from a frozen
copy of its DDL; schema.py no longer declares it.

PresenceEngine resolves override -> any covering away pattern (absent)
-> any covering home pattern (present) -> otherwise absent when the child
has a home pattern, else present. The home-pattern default keeps every
migrated child's presence unchanged.

The admin plane's one-per-child presence-schedule routes are replaced by
pattern CRUD: GET/POST /children/{child_id}/presence-patterns and
PATCH/DELETE /presence-patterns/{pattern_id}.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 19:31:34 -04:00