Time Tracking — skrót zasad biznesowych

Zakres: wszystkie przypadki wpływające na czas pracy poza ręcznym Start/Stop użytkownika.

1) Hibernacja / sen systemu

Sytuacja Co robi system Efekt biznesowy
Wykryto hibernację Kończy bieżący wpis na ostatnim wiarygodnym punkcie przed snem. Brak „sztucznego” naliczania podczas snu komputera.
Dual-entry OFF Powstaje 1 wpis (praca do momentu uśpienia). Okres snu nie jest osobno rejestrowany.
Dual-entry ON i krótka hibernacja (w zakresie progów) Powstają 2 wpisy:
  • praca właściwa
  • czas snu jako nieaktywność
Widoczna informacja o nieaktywności użytkownika.
Dual-entry przez północ 2. wpis jest dzielony per dzień (brak jednego ciągłego wpisu przez północ). Raporty dzienne są spójne.

2) Przejście przez północ — zasada biznesowa docelowa

Jedno okno potwierdzenia pojawia się 30 minut przed północą. Komunikat przed północą: „Zbliża się północ” + odliczanie do 23:59:59. Komunikat po północy (tylko jeśli brak reakcji): „Północ minęła” + dane zamkniętego zadania.
Akcja użytkownika Co robi system Status biznesowy
Kliknięcie „TAK” Zamknięcie starego wpisu o 23:59:59 i automatyczny start nowego o 00:00:00. kontynuacja pracy
Kliknięcie „Zakończ teraz” Natychmiastowe zakończenie naliczania (jak ręczne zatrzymanie). zakończenie przez użytkownika
Brak reakcji do północy Zakończenie o 23:59:59 bez kontynuacji. nieaktywność użytkownika
Start zadania < 15 min przed północą Bez okna; automatyczny split 23:59:59 / 00:00:00. automatyczna kontynuacja

3) Najważniejsze flagi konfiguracyjne

Flaga Znaczenie
HibernationDualEntryEnabled Włącza/wyłącza ścieżkę 2 wpisów po krótkiej hibernacji.
HibernationDualEntryMaxDurationMinutes Maksymalna długość hibernacji kwalifikująca do 2. wpisu.
HibernationHeuristicThresholdSeconds Minimalny próg wykrycia hibernacji (aktualnie 120 sekund = 2 minuty).
MidnightGuardPromptMinutes Aktywny offset pytania o północ (30 min).
MidnightGuardAutoContinueIfStartedWithinMinutes Jeśli zadanie uruchomiono w tym progu przed północą, system nie pyta i robi automatyczny split.
LongWorkingSessionLimitHours Limit długiej sesji; liczony ciągle przez północ po potwierdzeniu usera.
Ciągłość sesji przez północ:
Jeśli user świadomie uruchomił zadanie o 22:00 i kontynuuje pracę przez północ, to limit 4h liczy się od 22:00. Oznacza to alert LongWorkingSessionGuard około 02:00 (a nie 04:00).

4) Długa ciągła praca (LongWorkingSessionGuard)

Sytuacja Co robi system Efekt biznesowy
Przekroczenie limitu ciągłej pracy (domyślnie 4h) Pokazuje okno z decyzją: TAK / Zakończ teraz / Zakończ o HH:mm:ss. Kontrola długiej pracy bez utraty ciągłości sesji.
Long guard: „Zakończ o HH:mm:ss” Zatrzymuje naliczanie na czasie pojawienia się okna (np. 4h, 8h, ... ciągłej sesji). Precyzyjne domknięcie wpisu na granicy cyklu guarda.
Midnight guard aktywny/pending Long guard jest tymczasowo tłumiony. Brak konfliktu wielu okien na raz.
Brak reakcji w oknie long guard Zamyka naliczanie jako nieaktywność. Auto-stop bez ręcznego kliknięcia.

5) Zmiana zegara systemowego

Sytuacja Co robi system Efekt biznesowy
Wykryta istotna anomalia czasu (clock skew) Automatycznie kończy aktywne naliczanie i pokazuje komunikat. Eliminacja błędnego naliczania po zmianie zegara.

6) Zniknięcie zadania z API (MissingTask)

Sytuacja Co robi system Efekt biznesowy
Aktywny wpis lokalnie, brak aktywnego odpowiednika po stronie API Synchronizacyjnie zatrzymuje lokalne naliczanie i pokazuje okno MissingTask. Spójność z backendem + jasna informacja dla użytkownika.
API zwraca pustą listę zadań Pusty payload listy zadań jest ignorowany (cache lokalny zostaje). Brak pochopnego usuwania listy zadań po stronie klienta.

7) Zdarzenia techniczne (restart / update / fallback)

Sytuacja Co robi system Status biznesowy
Restart aplikacji z lokalnym aktywnym wpisem Domyka wpis automatycznie przy starcie. AutoFinishAfterAppRestart (2)
Aktualizacja aplikacji / techniczna konsolidacja aktywnych wpisów Domyka technicznie wpisy wymagające porządku i synchronizacji. AutoFinishDueToAppUpdate (4)
Fallback Quartz po północy (> 5 min po 00:00) Awaryjnie domyka wpis na 23:59:59 poprzedniego dnia. AutoFinishAfterSystemRestart (3)
Quartz wykryje długą przerwę aktywności przy zmianie doby Zamyka wpis na znaczniku ostatniej aktywności. AutoFinishDueToUserInactivity (5)

8) Macierz kompletności przypadków

Obszar Czy zmienia WorkTime Pokrycie
Hibernacja / sen Tak Tak
Północ Tak Tak
Długa praca Pośrednio / Tak Tak
Zmiana zegara Tak Tak
Zniknięcie zadania z API Tak Tak
Restart / update / fallback Quartz Tak Tak

9) Wszystkie okna komunikatów widoczne dla użytkownika

Poniżej makiety wszystkich okien guardów/komunikatów, utrzymane w stylu aplikacji.

HibernationGuard (uśpienie systemu)
Wykryto uśpienie systemu.
Zadanie: TASK-1234 | Przykładowe zadanie
Zatrzymano o: 12:45:10
Przepracowany czas: 02:15:40
OK
ClocksDifferenceGuard (manipulacja czasem)
Wykryto zmianę godziny w systemie.
Zadanie: TASK-1234 | Przykładowe zadanie
Zadanie uruchomione o: 10:20:00
Zadanie zostało zatrzymane w wyniku nieprawidłowości czasu systemowego.
OK
WorkWithoutTimeRegisterGuard
Nie rejestrujesz czasu pracy.
OK
MissingTaskMessage
Zadanie: TASK-1234 | Przykładowe zadanie
Zatrzymano o: 14:03:22
Zadanie nie jest już dostępne.
OK
MidnightContinuationGuard (przed północą)
Zbliża się północ. Czy nadal pracujesz nad tym zadaniem?
Pozostało na reakcję: 00:18:42
TAK
Zakończ teraz
MidnightContinuationGuard (po północy, brak reakcji)
Północ minęła.
Zatrzymano o: 23:59:59
z powodu braku aktywności użytkownika
OK
LongWorkingSessionGuard (okno decyzyjne)
Zadanie uruchomione o: 22:00:00
Czy nadal nad nim pracujesz?
Pozostało na reakcję: 00:29:12
TAK
Zakończ teraz
Zakończ o 02:00:00
Godzina w trzecim przycisku to czas pojawienia się okna (granica 4h, 8h, ... ciągłej sesji).
LongWorkingSessionGuard (podsumowanie po auto-stop)
Zadanie: TASK-1234 | Przykładowe zadanie
Zatrzymano o: 02:30:00
z powodu braku aktywności użytkownika
OK