---
phase: 02-rooms-and-tasks
plan: 01
subsystem: database
tags: [drift, sqlite, dao, scheduling, templates, domain-models]

# Dependency graph
requires:
  - phase: 01-foundation
    provides: AppDatabase with schema v1, NativeDatabase.memory() test pattern, project scaffold
provides:
  - Drift schema v2 with Rooms, Tasks, TaskCompletions tables
  - RoomsDao with CRUD, stream queries, cascade delete, reorder, room stats
  - TasksDao with CRUD, stream queries, completeTask transaction, overdue detection
  - Pure scheduling utility (calculateNextDueDate, catchUpToPresent)
  - Domain enums IntervalType (8 types), EffortLevel (3 levels), FrequencyInterval model
  - formatRelativeDate German formatter
  - curatedRoomIcons icon list with 25 Material Icons
  - TaskTemplate model and roomTemplates for 14 room types
  - detectRoomType name-matching utility with alias support
affects: [02-rooms-and-tasks, 03-daily-plan, 04-notifications]

# Tech tracking
tech-stack:
  added: []
  patterns: [drift-dao-with-stream-queries, pure-scheduling-utility, task-completion-transaction, intEnum-for-enums, cascade-delete-in-transaction, const-template-data]

key-files:
  created:
    - lib/features/tasks/domain/frequency.dart
    - lib/features/tasks/domain/effort_level.dart
    - lib/features/tasks/domain/scheduling.dart
    - lib/features/tasks/domain/relative_date.dart
    - lib/features/rooms/domain/room_icons.dart
    - lib/features/rooms/data/rooms_dao.dart
    - lib/features/tasks/data/tasks_dao.dart
    - lib/features/templates/data/task_templates.dart
    - test/features/tasks/domain/scheduling_test.dart
    - test/features/rooms/data/rooms_dao_test.dart
    - test/features/tasks/data/tasks_dao_test.dart
    - test/features/templates/task_templates_test.dart
    - drift_schemas/household_keeper/drift_schema_v2.json
  modified:
    - lib/core/database/database.dart
    - lib/core/database/database.g.dart
    - test/core/database/database_test.dart

key-decisions:
  - "Scheduling functions are top-level pure functions with DateTime today parameter for testability"
  - "Calendar-anchored intervals use anchorDay nullable field for month-clamping memory"
  - "RoomWithStats computed via asyncMap on watchAllRooms stream, not a custom SQL join"
  - "Templates stored as Dart const map, not JSON assets, for type safety"
  - "detectRoomType uses contains-based matching with alias map for flexible room name detection"

patterns-established:
  - "DAO stream queries with .watch() for reactive UI data"
  - "Cascade delete via transaction (completions -> tasks -> room)"
  - "Task completion as single DAO transaction (record + calculate + catch-up + update)"
  - "intEnum for Dart enum persistence with index stability comments"
  - "In-memory database testing with NativeDatabase.memory()"
  - "Testable date logic via today parameter injection"

requirements-completed: [ROOM-01, ROOM-02, ROOM-03, ROOM-04, ROOM-05, TASK-01, TASK-02, TASK-03, TASK-04, TASK-05, TASK-06, TASK-07, TASK-08, TMPL-01, TMPL-02]

# Metrics
duration: 8min
completed: 2026-03-15
---

# Phase 2 Plan 01: Data Layer Summary

**Drift schema v2 with Rooms/Tasks/TaskCompletions tables, RoomsDao and TasksDao with stream queries and completion transactions, pure scheduling utility with 8 interval types and anchor memory, and 14-room-type German task template library**

## Performance

- **Duration:** 8 min
- **Started:** 2026-03-15T20:44:07Z
- **Completed:** 2026-03-15T20:52:38Z
- **Tasks:** 2
- **Files modified:** 16

## Accomplishments
- Database schema v2 with three tables (Rooms, Tasks, TaskCompletions), foreign keys enabled via PRAGMA, and v1-to-v2 migration strategy
- RoomsDao with full CRUD, stream-based watchAll and watchWithStats (cleanliness ratio), cascade delete, and sortOrder reorder
- TasksDao with CRUD, due-date-sorted stream queries, atomic completeTask transaction (records completion, calculates next due, catches up to present), and overdue detection
- Pure scheduling utility handling daily, everyNDays, weekly, biweekly, monthly, everyNMonths, quarterly, yearly intervals with calendar-anchored clamping and anchor memory
- Domain models: IntervalType enum (8 values), EffortLevel enum (3 values), FrequencyInterval with German labels, formatRelativeDate German formatter, curatedRoomIcons with 25 Material Icons
- 14 room types with 3-6 German task templates each, plus detectRoomType with alias-based name matching
- 41 data layer unit tests all passing, full suite of 59 tests green

## Task Commits

Each task was committed atomically:

1. **Task 1: Define Drift tables, migration, DAOs, and domain models** - `d2e4526` (feat)
2. **Task 2: Create task template data and template tests** - `da270e5` (feat)

## Files Created/Modified
- `lib/core/database/database.dart` - Drift tables (Rooms, Tasks, TaskCompletions), schema v2, migration strategy, foreign keys PRAGMA
- `lib/features/tasks/domain/frequency.dart` - IntervalType enum (8 values), FrequencyInterval model with German labels
- `lib/features/tasks/domain/effort_level.dart` - EffortLevel enum (low/medium/high) with German labels
- `lib/features/tasks/domain/scheduling.dart` - calculateNextDueDate and catchUpToPresent pure functions
- `lib/features/tasks/domain/relative_date.dart` - formatRelativeDate German formatter (Heute, Morgen, in X Tagen, Uberfaellig)
- `lib/features/rooms/domain/room_icons.dart` - curatedRoomIcons (25 Material Icons) and mapIconName utility
- `lib/features/rooms/data/rooms_dao.dart` - RoomsDao with CRUD, watchAll, watchWithStats, cascade delete, reorder
- `lib/features/tasks/data/tasks_dao.dart` - TasksDao with CRUD, watchInRoom, completeTask, overdue detection
- `lib/features/templates/data/task_templates.dart` - TaskTemplate class, roomTemplates for 14 types, detectRoomType
- `test/features/tasks/domain/scheduling_test.dart` - 17 tests for scheduling and relative date formatting
- `test/features/rooms/data/rooms_dao_test.dart` - 6 tests for rooms DAO operations
- `test/features/tasks/data/tasks_dao_test.dart` - 7 tests for tasks DAO operations
- `test/features/templates/task_templates_test.dart` - 11 tests for templates and detectRoomType

## Decisions Made
- Scheduling functions are top-level pure functions (not in a class) with DateTime today parameter for testability
- Calendar-anchored intervals use a nullable anchorDay field on Tasks table for month-clamping memory
- RoomWithStats computed via asyncMap on the watchAllRooms stream rather than a complex SQL join
- Templates stored as Dart const map for type safety and zero parsing overhead
- detectRoomType uses contains-based matching with an alias map for flexible room name detection

## Deviations from Plan

None - plan executed exactly as written.

## Issues Encountered
None

## User Setup Required

None - no external service configuration required.

## Next Phase Readiness
- All data layer contracts ready for Room CRUD UI (02-02), Task CRUD UI (02-03), and Template selection (02-04)
- Stream-based DAO queries ready for Riverpod stream providers
- Scheduling utility ready to be called from TasksDao.completeTask
- Template data ready for template picker bottom sheet
- All existing Phase 1 tests continue to pass

## Self-Check: PASSED

All 13 key files verified present. Both task commits (d2e4526, da270e5) verified in git log. 59 tests passing. dart analyze clean.

---
*Phase: 02-rooms-and-tasks*
*Completed: 2026-03-15*
