| 12345678910111213141516171819202122232425262728293031 |
- -- Phase 12: per-week weekday selection drives Arbeitstage.
- --
- -- Admins pick which of Mo/Di/Mi/Do/Fr are workdays for each week. The count
- -- of selected days (0..5) replaces the previously free-form
- -- max_working_days number input on the sprint view.
- --
- -- Bit layout of active_days_mask:
- -- bit 0 = Mo, bit 1 = Di, bit 2 = Mi, bit 3 = Do, bit 4 = Fr
- -- Default 31 = 0b11111 → Mo–Fr all active.
- --
- -- Backfill rule: clamp existing max_working_days to the nearest integer in
- -- 0..5 (rounding .5 up) and light up that many leading bits. Half-days go
- -- away at the week level; per-worker day cells still carry 0.5 granularity.
- ALTER TABLE sprint_weeks
- ADD COLUMN active_days_mask INTEGER NOT NULL DEFAULT 31;
- -- Backfill existing rows. CAST(x+0.5 AS INTEGER) is SQLite's "round half up"
- -- for non-negative x; clamp into 0..5 and derive a mask with the first N
- -- bits set: (1 << N) - 1.
- UPDATE sprint_weeks
- SET active_days_mask = CASE
- WHEN CAST(max_working_days + 0.5 AS INTEGER) <= 0 THEN 0
- WHEN CAST(max_working_days + 0.5 AS INTEGER) >= 5 THEN 31
- ELSE (1 << CAST(max_working_days + 0.5 AS INTEGER)) - 1
- END,
- max_working_days = CASE
- WHEN CAST(max_working_days + 0.5 AS INTEGER) <= 0 THEN 0
- WHEN CAST(max_working_days + 0.5 AS INTEGER) >= 5 THEN 5
- ELSE CAST(max_working_days + 0.5 AS INTEGER)
- END;
|