diff options
Diffstat (limited to 'internal/reports/daterange.go')
-rw-r--r-- | internal/reports/daterange.go | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/internal/reports/daterange.go b/internal/reports/daterange.go index adeb48b..040023e 100644 --- a/internal/reports/daterange.go +++ b/internal/reports/daterange.go @@ -67,16 +67,22 @@ func ParseDateRange(dateStr string) (DateRange, error) { return dateRange, nil } + // Check for "since YYYY-MM-DD" format + if strings.HasPrefix(lowerDateStr, "since ") { + return parseSinceDateRange(dateStr) + } + // Check for custom date range format: "YYYY-MM-DD to YYYY-MM-DD" - if strings.Contains(dateStr, " to ") { + if strings.Contains(lowerDateStr, " to ") { return parseCustomDateRange(dateStr) } - return DateRange{}, fmt.Errorf("unsupported date range: %s (supported: 'this week', 'this month', 'last week', 'last month', month names like 'february', 'month year' like 'july 2023', or 'YYYY-MM-DD to YYYY-MM-DD')", dateStr) + return DateRange{}, fmt.Errorf("unsupported date range: %s (supported: 'this week', 'this month', 'last week', 'last month', month names like 'february', 'month year' like 'july 2023', 'since YYYY-MM-DD', or 'YYYY-MM-DD to YYYY-MM-DD')", dateStr) } func parseCustomDateRange(dateStr string) (DateRange, error) { - parts := strings.Split(dateStr, " to ") + lowerDateStr := strings.ToLower(dateStr) + parts := strings.Split(lowerDateStr, " to ") if len(parts) != 2 { return DateRange{}, fmt.Errorf("invalid date range format: expected 'YYYY-MM-DD to YYYY-MM-DD'") } @@ -248,3 +254,28 @@ func getMonthRange(year int, month time.Month) DateRange { } } +func parseSinceDateRange(dateStr string) (DateRange, error) { + // Remove "since " prefix (case-insensitive) + lowerDateStr := strings.ToLower(dateStr) + if !strings.HasPrefix(lowerDateStr, "since ") { + return DateRange{}, fmt.Errorf("invalid since format: expected 'since YYYY-MM-DD'") + } + + dateOnly := strings.TrimSpace(dateStr[6:]) // Remove "since " prefix + + // Parse start date + startDate, err := time.Parse("2006-01-02", dateOnly) + if err != nil { + return DateRange{}, fmt.Errorf("invalid start date '%s' in since format: expected YYYY-MM-DD format", dateOnly) + } + + // Convert to UTC and set start time to beginning of day (00:00:00) + startUTC := time.Date(startDate.Year(), startDate.Month(), startDate.Day(), 0, 0, 0, 0, time.UTC) + + // No end date for "since" format - return zero time for End to indicate open-ended + return DateRange{ + Start: startUTC, + End: time.Time{}, // Zero time indicates no end date + }, nil +} + |