fix: correct daily work/break calculations and league back button
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:
2026-06-27 23:15:12 +03:30
parent 7dbd9fda12
commit 6f7f5878bf
4 changed files with 55 additions and 6 deletions

View File

@@ -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" {

View File

@@ -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)
}
}