fix: weekbased calculation pdf report
with this change the time calculations for pdf reports should be better line with the reports send as "week_report"
This commit is contained in:
@@ -20,6 +20,10 @@ func GetEnv(key, fallback string) string {
|
||||
return fallback
|
||||
}
|
||||
|
||||
func IsDebug() bool {
|
||||
return GetEnv("GO_ENV", "production") == "debug"
|
||||
}
|
||||
|
||||
type CacheItem struct {
|
||||
value any
|
||||
expiration time.Time
|
||||
|
||||
@@ -4,6 +4,7 @@ package helper
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"slices"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -18,6 +19,64 @@ func GetMonday(ts time.Time) time.Time {
|
||||
return ts
|
||||
}
|
||||
|
||||
func GetMondays(allDays []time.Time, onlyInRange bool) []time.Time {
|
||||
var mondays []time.Time
|
||||
var start, end time.Time
|
||||
|
||||
for _, day := range allDays {
|
||||
mondays = append(mondays, GetMonday(day))
|
||||
|
||||
if start.IsZero() || day.Before(start) {
|
||||
start = day
|
||||
}
|
||||
if end.IsZero() || day.After(end) {
|
||||
end = day
|
||||
}
|
||||
}
|
||||
mondays = slices.Compact(mondays)
|
||||
if onlyInRange {
|
||||
return DaysInRange(mondays, start, end)
|
||||
}
|
||||
return mondays
|
||||
}
|
||||
|
||||
func DaysInRange(days []time.Time, startDate, endDate time.Time) []time.Time {
|
||||
filtered := []time.Time{}
|
||||
startDate = startDate.Add(-time.Minute)
|
||||
endDate = endDate.Add(time.Minute)
|
||||
|
||||
for _, day := range days {
|
||||
if day.After(startDate) && day.Before(endDate) {
|
||||
filtered = append(filtered, day)
|
||||
}
|
||||
}
|
||||
return filtered
|
||||
}
|
||||
|
||||
func IsMonday(day time.Time) bool {
|
||||
return day.Weekday() == time.Monday
|
||||
}
|
||||
|
||||
// GenerateDateRange returns a slice of all dates between start and end (inclusive).
|
||||
func GenerateDateRange(start, end time.Time) []time.Time {
|
||||
var dates []time.Time
|
||||
|
||||
// Ensure start is before or equal to end
|
||||
if start.After(end) {
|
||||
return dates
|
||||
}
|
||||
|
||||
// Normalize times to midnight
|
||||
current := start.Truncate(time.Hour * 24)
|
||||
end = end.Truncate(time.Hour * 24)
|
||||
|
||||
for !current.After(end) {
|
||||
dates = append(dates, current)
|
||||
current = current.AddDate(0, 0, 1) // Add one day
|
||||
}
|
||||
return dates
|
||||
}
|
||||
|
||||
func GetFirstOfMonth(ts time.Time) time.Time {
|
||||
if ts.Day() > 1 {
|
||||
return ts.AddDate(0, 0, -(ts.Day() - 1))
|
||||
|
||||
@@ -26,6 +26,101 @@ func TestGetMonday(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsMonday_ReturnsTrueForMonday(t *testing.T) {
|
||||
monday := time.Date(2023, 4, 3, 0, 0, 0, 0, time.UTC)
|
||||
|
||||
if !IsMonday(monday) {
|
||||
t.Errorf("Expected IsMonday to return true for Monday, got false")
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsMonday_ReturnsFalseForNonMonday(t *testing.T) {
|
||||
tuesday := time.Date(2023, 4, 4, 0, 0, 0, 0, time.UTC)
|
||||
|
||||
if IsMonday(tuesday) {
|
||||
t.Errorf("Expected IsMonday to return false for Tuesday, got true")
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateDateRange(t *testing.T) {
|
||||
start := time.Date(2026, 2, 9, 0, 0, 0, 0, time.UTC)
|
||||
end := time.Date(2026, 2, 11, 0, 0, 0, 0, time.UTC)
|
||||
|
||||
dates := GenerateDateRange(start, end)
|
||||
|
||||
if len(dates) != 3 {
|
||||
t.Fatalf("expected 3 dates, got %d", len(dates))
|
||||
}
|
||||
|
||||
expected := []string{"2026-02-09", "2026-02-10", "2026-02-11"}
|
||||
for i, d := range dates {
|
||||
got := d.Format("2006-01-02")
|
||||
if got != expected[i] {
|
||||
t.Errorf("expected %s, got %s", expected[i], got)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetMondays_ReturnsOnlyMondays(t *testing.T) {
|
||||
startDate := time.Date(2026, 01, 01, 0, 0, 0, 0, time.UTC)
|
||||
endDate := time.Date(2026, 01, 31, 0, 0, 0, 0, time.UTC)
|
||||
|
||||
daysInMonth := GenerateDateRange(startDate, endDate)
|
||||
result := GetMondays(daysInMonth, false)
|
||||
if len(result) < 5 {
|
||||
t.Errorf("Expected 5 monday, got %d", len(result))
|
||||
} else if len(result) > 5 {
|
||||
t.Errorf("Expected 5 monday, got %d", len(result))
|
||||
}
|
||||
|
||||
if result[0] != time.Date(2025, 12, 29, 0, 0, 0, 0, time.UTC) {
|
||||
t.Errorf("Expected first monday to be %v, got %v", "2025-12-29", result[0])
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetMondays_ReturnsOnlyMondaysInRange(t *testing.T) {
|
||||
startDate := time.Date(2026, 01, 01, 0, 0, 0, 0, time.UTC)
|
||||
endDate := time.Date(2026, 01, 31, 0, 0, 0, 0, time.UTC)
|
||||
|
||||
daysInMonth := GenerateDateRange(startDate, endDate)
|
||||
result := GetMondays(daysInMonth, true)
|
||||
if len(result) < 4 {
|
||||
t.Errorf("Expected 4 monday, got %d", len(result))
|
||||
} else if len(result) > 4 {
|
||||
t.Errorf("Expected 4 monday, got %d", len(result))
|
||||
}
|
||||
|
||||
if result[0] != time.Date(2026, 1, 5, 0, 0, 0, 0, time.UTC) {
|
||||
t.Errorf("Expected first monday to be %v, got %v", "2026-01-05", result[0])
|
||||
}
|
||||
}
|
||||
|
||||
func TestDaysInRange(t *testing.T) {
|
||||
days := []time.Time{
|
||||
time.Date(2023, 4, 3, 0, 0, 0, 0, time.UTC), // Tuesday
|
||||
time.Date(2023, 4, 4, 0, 0, 0, 0, time.UTC), // Wednesday
|
||||
time.Date(2023, 4, 5, 0, 0, 0, 0, time.UTC), // Thursday
|
||||
time.Date(2023, 4, 6, 0, 0, 0, 0, time.UTC), // Friday
|
||||
}
|
||||
|
||||
start := time.Date(2023, 4, 3, 0, 0, 0, 0, time.UTC)
|
||||
end := time.Date(2023, 4, 5, 0, 0, 0, 0, time.UTC)
|
||||
|
||||
daysInRange := DaysInRange(days, start, end)
|
||||
|
||||
if len(daysInRange) != 3 {
|
||||
t.Errorf("Expected 3 days in range, got %d", len(daysInRange))
|
||||
}
|
||||
|
||||
if daysInRange[0] != days[0] {
|
||||
t.Errorf("Expected first day in range to be %v, got %v", days[0], daysInRange[0])
|
||||
}
|
||||
|
||||
if daysInRange[2] != days[2] {
|
||||
t.Errorf("Expected third day in range to be %v, got %v", days[2], daysInRange[2])
|
||||
}
|
||||
}
|
||||
|
||||
func TestFormatDurationFill(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
|
||||
@@ -24,7 +24,7 @@ func SetCors(w http.ResponseWriter) {
|
||||
|
||||
func RequiresLogin(session *scs.SessionManager, w http.ResponseWriter, r *http.Request) {
|
||||
r = r.WithContext(context.WithValue(r.Context(), "session", session))
|
||||
if GetEnv("GO_ENV", "production") == "debug" {
|
||||
if IsDebug() {
|
||||
return
|
||||
}
|
||||
if session.Exists(r.Context(), "user") {
|
||||
|
||||
Reference in New Issue
Block a user