Each frequency tier now inherits all reminder days from smaller tiers: - Monthly: 3d, 1d, day-of (was: 3d, day-of) - Quarterly: 7d, 3d, 1d, day-of (was: 7d, 3d, day-of) - Semi-Annual: 14d, 7d, 3d, 1d, day-of (was: 14d, 7d, day-of) - Annual: 30d, 14d, 7d, 3d, 1d, day-of (was: 30d, 14d, 7d, day-of) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
64 lines
2.6 KiB
Go
64 lines
2.6 KiB
Go
package notifications
|
|
|
|
// ============================================================
|
|
// REMINDER CONFIGURATION
|
|
// Edit these values to adjust notification behavior
|
|
// ============================================================
|
|
|
|
// OverdueConfig controls when and how often overdue reminders are sent
|
|
var OverdueConfig = struct {
|
|
DailyReminderDays int // Send daily reminders for first N days overdue
|
|
TaperIntervalDays int // After daily period, remind every N days
|
|
MaxOverdueDays int // Stop reminding after N days overdue
|
|
}{
|
|
DailyReminderDays: 3, // Daily for days 1-3
|
|
TaperIntervalDays: 3, // Then every 3 days (4, 7, 10, 13)
|
|
MaxOverdueDays: 14, // Stop after 14 days
|
|
}
|
|
|
|
// FrequencySchedules - EXPLICIT entry for each of the 9 seeded frequencies
|
|
// Key: interval days (matches TaskFrequency.days in DB, 0 = Once/null)
|
|
// Value: array of days before due date to send reminders (0 = day-of)
|
|
//
|
|
// Schedules are ADDITIVE - each tier inherits all reminders from smaller tiers
|
|
// Example: Monthly (30) gets 3d + 1d + day-of because it includes Bi-Weekly's 1d
|
|
var FrequencySchedules = map[int][]int{
|
|
0: {0}, // 1. Once (null/0): day-of only
|
|
1: {0}, // 2. Daily: day-of only
|
|
7: {0}, // 3. Weekly: day-of only
|
|
14: {1, 0}, // 4. Bi-Weekly: 1d, day-of
|
|
30: {3, 1, 0}, // 5. Monthly: 3d, 1d, day-of
|
|
90: {7, 3, 1, 0}, // 6. Quarterly: 7d, 3d, 1d, day-of
|
|
180: {14, 7, 3, 1, 0}, // 7. Semi-Annually: 14d, 7d, 3d, 1d, day-of
|
|
365: {30, 14, 7, 3, 1, 0}, // 8. Annually: 30d, 14d, 7d, 3d, 1d, day-of
|
|
}
|
|
|
|
// HumanReadableSchedule returns admin-friendly description for each frequency
|
|
// Key: interval days (matches FrequencySchedules keys)
|
|
// Value: human-readable description of the reminder schedule
|
|
var HumanReadableSchedule = map[int]string{
|
|
0: "Day-of → Overdue (tapering)",
|
|
1: "Day-of → Overdue (tapering)",
|
|
7: "Day-of → Overdue (tapering)",
|
|
14: "1d → Day-of → Overdue",
|
|
30: "3d → 1d → Day-of → Overdue",
|
|
90: "7d → 3d → 1d → Day-of → Overdue",
|
|
180: "14d → 7d → 3d → 1d → Day-of → Overdue",
|
|
365: "30d → 14d → 7d → 3d → 1d → Day-of → Overdue",
|
|
}
|
|
|
|
// FrequencyNames maps interval days to frequency names for display
|
|
var FrequencyNames = map[int]string{
|
|
0: "Once",
|
|
1: "Daily",
|
|
7: "Weekly",
|
|
14: "Bi-Weekly",
|
|
30: "Monthly",
|
|
90: "Quarterly",
|
|
180: "Semi-Annually",
|
|
365: "Annually",
|
|
}
|
|
|
|
// OrderedFrequencies defines the display order for frequencies
|
|
var OrderedFrequencies = []int{0, 1, 7, 14, 30, 90, 180, 365}
|