fix: correct daily work/break calculations and league back button
All checks were successful
CI / build (push) Successful in 38s
All checks were successful
CI / build (push) Successful in 38s
- ComputeDailyTotals: only assume working from dayStart when first event is 'out' (cross-midnight session); otherwise start idle. Fixes inflated work/break counts in reports, status, export, burnout, salary, and RPG. - leagueToggleCallback: add settings back keyboard when RPG is disabled. - webhook: add graceful HTTP server shutdown on context cancellation.
This commit is contained in:
@@ -18,7 +18,7 @@ func ComputeDailyTotals(events []Event, minBreakThreshold int64, dayStart, dayEn
|
||||
state := StateIdle
|
||||
var workStart, breakStart int64
|
||||
|
||||
if dayStart > 0 {
|
||||
if dayStart > 0 && sorted[0].EventType == "out" {
|
||||
state = StateWorking
|
||||
workStart = dayStart
|
||||
} else if sorted[0].EventType == "out" {
|
||||
|
||||
@@ -36,7 +36,7 @@ func TestComputeDailyTotals_SingleInOut(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestComputeDailyTotals_MissingFirstIn(t *testing.T) {
|
||||
func TestComputeDailyTotals_DayStartWithOutFirst(t *testing.T) {
|
||||
events := []Event{
|
||||
mkEvent("out", 200),
|
||||
mkEvent("in", 300),
|
||||
@@ -44,7 +44,39 @@ func TestComputeDailyTotals_MissingFirstIn(t *testing.T) {
|
||||
}
|
||||
got := ComputeDailyTotals(events, 0, 100, 500)
|
||||
if got.TotalSeconds != 200 {
|
||||
t.Errorf("missing first in: TotalSeconds=%d, want 200", got.TotalSeconds)
|
||||
t.Errorf("dayStart with out first: TotalSeconds=%d, want 200", got.TotalSeconds)
|
||||
}
|
||||
}
|
||||
|
||||
func TestComputeDailyTotals_DayStartWithInFirst(t *testing.T) {
|
||||
events := []Event{
|
||||
mkEvent("in", 100),
|
||||
mkEvent("out", 200),
|
||||
mkEvent("in", 300),
|
||||
mkEvent("out", 400),
|
||||
}
|
||||
got := ComputeDailyTotals(events, 0, 50, 500)
|
||||
if got.TotalSeconds != 200 {
|
||||
t.Errorf("dayStart with in first: TotalSeconds=%d, want 200", got.TotalSeconds)
|
||||
}
|
||||
if got.BreakSeconds != 200 {
|
||||
t.Errorf("dayStart with in first: BreakSeconds=%d, want 200", got.BreakSeconds)
|
||||
}
|
||||
}
|
||||
|
||||
func TestComputeDailyTotals_DayStartInFirstRealistic(t *testing.T) {
|
||||
events := []Event{
|
||||
mkEvent("in", 33060),
|
||||
mkEvent("out", 47100),
|
||||
mkEvent("in", 48780),
|
||||
mkEvent("out", 74460),
|
||||
}
|
||||
got := ComputeDailyTotals(events, 0, 0, 86399)
|
||||
if got.TotalSeconds != 39720 {
|
||||
t.Errorf("realistic day: TotalSeconds=%d, want 39720 (11h 02m)", got.TotalSeconds)
|
||||
}
|
||||
if got.BreakSeconds != 13619 {
|
||||
t.Errorf("realistic day: BreakSeconds=%d, want 13619 (3h 19m)", got.BreakSeconds)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user