- 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>
63 lines
2.1 KiB
Dart
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),
|
|
];
|
|
}
|