Files
HouseHoldKeaper/lib/features/tasks/domain/frequency.dart
Jean-Luc Makiola d2e452655c feat(02-01): Drift tables, DAOs, scheduling utility, domain models with tests
- Add Rooms, Tasks, TaskCompletions Drift tables with schema v2 migration
- Create RoomsDao with CRUD, watchAll, watchWithStats, cascade delete, reorder
- Create TasksDao with CRUD, watchInRoom (sorted by due), completeTask, overdue detection
- Implement calculateNextDueDate and catchUpToPresent pure scheduling functions
- Define IntervalType enum (8 types), EffortLevel enum, FrequencyInterval model
- Add formatRelativeDate German formatter and curatedRoomIcons icon list
- Enable PRAGMA foreign_keys in beforeOpen migration strategy
- All 30 unit tests passing (17 scheduling + 6 rooms DAO + 7 tasks DAO)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 21:50:12 +01:00

63 lines
2.1 KiB
Dart

/// Frequency interval types for recurring tasks.
///
/// IMPORTANT: Never reorder or remove values - intEnum stores the .index.
/// Always add new values at the END.
enum IntervalType {
daily, // 0
everyNDays, // 1
weekly, // 2
biweekly, // 3
monthly, // 4
everyNMonths, // 5
quarterly, // 6
yearly, // 7
}
/// A frequency interval combining a type with an optional multiplier.
class FrequencyInterval {
final IntervalType intervalType;
final int days;
const FrequencyInterval({required this.intervalType, this.days = 1});
/// German display label for this interval.
String label() {
switch (intervalType) {
case IntervalType.daily:
return 'Taeglich';
case IntervalType.everyNDays:
if (days == 7) return 'Woechentlich';
if (days == 14) return 'Alle 2 Wochen';
return 'Alle $days Tage';
case IntervalType.weekly:
return 'Woechentlich';
case IntervalType.biweekly:
return 'Alle 2 Wochen';
case IntervalType.monthly:
return 'Monatlich';
case IntervalType.everyNMonths:
if (days == 3) return 'Vierteljaehrlich';
if (days == 6) return 'Halbjaehrlich';
return 'Alle $days Monate';
case IntervalType.quarterly:
return 'Vierteljaehrlich';
case IntervalType.yearly:
return 'Jaehrlich';
}
}
/// All preset frequency intervals per TASK-04.
static const List<FrequencyInterval> presets = [
FrequencyInterval(intervalType: IntervalType.daily),
FrequencyInterval(intervalType: IntervalType.everyNDays, days: 2),
FrequencyInterval(intervalType: IntervalType.everyNDays, days: 3),
FrequencyInterval(intervalType: IntervalType.weekly),
FrequencyInterval(intervalType: IntervalType.biweekly),
FrequencyInterval(intervalType: IntervalType.monthly),
FrequencyInterval(intervalType: IntervalType.everyNMonths, days: 2),
FrequencyInterval(intervalType: IntervalType.quarterly),
FrequencyInterval(intervalType: IntervalType.everyNMonths, days: 6),
FrequencyInterval(intervalType: IntervalType.yearly),
];
}