Fix: czas pracy i mapa — dane kierowców GBOX

Filip Borkowski, Backend/Frontend/Fullstack Engineer

Problem: brak danych w czas pracy i na mapie

Moduł czas pracy nie wyświetlał żadnych danych dla kierowców, a mapa GPS nie pokazywała informacji o zalogowanym kierowcy przy pojazdach.

Oba problemy miały tę samą przyczynę: tabela gbox_drivers w Supabase była pusta. Endpoint /api/gbox/drivers próbował ślepo odpytać GBOX API dla ID 1–200 (200 zapytań równolegle), co powodowało timeout funkcji Vercel i błąd 500.

Naprawa: inteligentne pobieranie ID kierowców

Endpoint /api/gbox/drivers został przepisany z nową strategią:

  1. Cache pamięci (1 godzina) — najszybszy tier, omija całą sieć
  2. Cache Supabase (gbox_drivers, 1 godzina) — unika niepotrzebnych wywołań GBOX
  3. Znane ID z historii — zapytanie do driver_working_time o distinct gbox_driver_id (79 znanych ID zamiast ślepego 1–200)
  4. GBOX API — tylko dla znanych ID, w batchach po 20 równolegle
  5. Persist do Supabase — wyniki zapisywane do gbox_drivers dla kolejnych wywołań
  6. Fallback — jeśli brak danych w Supabase, sprawdza przedział 1–150

Każde zapytanie do GBOX ma timeout 5 sekund (AbortSignal.timeout). Błędy Supabase są obsługiwane własnym try/catch — nie przerywają przepływu.

Efekt

  • Tabela gbox_drivers wypełniana automatycznie przy pierwszym wywołaniu
  • Moduł czas pracy poprawnie mapuje pracowników na kierowców GBOX i wyświetla dane tachografu
  • Mapa GPS wyświetla imię i nazwisko kierowcy przy każdym pojeździe z aktywną kartą
  • Endpoint nie zwraca już błędu 500 nawet przy niedostępnym GBOX

Kolejne ulepszenia (20.03, wydanie 07)

Kierowcy historyczni — deleted w GBOX

Odkryto drugą przyczynę brakujących danych: GBOX DriverList oznacza starych kierowców jako deleted=1, przez co były pomijane w sync. Ponieważ nadal generują zdarzenia tachografu, usunięto filtr — teraz wszyscy kierowcy (aktywni i historyczni) trafiają do gbox_drivers z flagą deleted.

Fix mapa — kierowca w aucie

Dwa bugi blokowały wyświetlanie kierowcy na etykiecie pojazdu:

  • idDriver1 = "0" był traktowany jako wartość truthy w JavaScript — lookup przerywał się przed sprawdzeniem cardNo
  • driverById brakowało w tablicy zależności useMemo — mapa nie odświeżała przypisań po załadowaniu listy kierowców

Baza danych

  • Tabela driver_working_time odchudzona: usunięto dane starsze niż 3 tygodnie (53k → 34k rekordów)
  • Dodano automatyczne czyszczenie pg_cron co noc o 02:00 UTC
  • Dodano kolumny deleted i pin do gbox_drivers
  • Zapisano numery kart i PINy tachografu dla 47 kierowców

Kierowcy z bazy Pracownicy na mapie (wydanie 11)

Nowe źródło danych

Mapa wyświetla teraz imię i nazwisko kierowcy bezpośrednio z bazy aplikacji (tabela employees, kolumna driver_card_number), a nie z GBOX. Kolejność identyfikacji:

  1. employees.driver_card_number → imię i nazwisko z bazy Pracownicy
  2. GBOX idDriver1 (numeryczny ID) → fallback
  3. GBOX cardNo → fallback

Uzupełnienie bazy

  • Uzupełniono driver_card_number i pin dla 47 pracowników
  • Poprawiono rozbieżności numerów kart: Borucki, Wiciak, Batruiev
  • Przypisano właściciela (entity_id) dla 57 pojazdów (UTB / TRANS-SPED / RULES)

Pełne pokrycie kierowców na mapie (wydanie 12)

Osiągnięto 50/50 aktywnych pojazdów z dopasowanym kierowcą z bazy Pracownicy:

  • Dodano 17 nowych pracowników do bazy (Traczyński, Kotok, Nowakowski, Kutsil, Sebzda, Woźniak, Maruszczak, Kovalov, Ciesielski, Radny, Furman, Napieralski, Ziarnowski, Marciniak-Kuryś, Lavriv, Kasianov, Borko)
  • Naprawiono błędne imiona przy imporcie: Spalylo, Lobodenko, Danski
  • Entity (UTB/TRANS-SPED/RULES) przypisane automatycznie wg aktualnie prowadzonego pojazdu

Naprawa box_id i uzupełnienie mapy (wydanie 14)

Błędne przypisania box_id

Porównanie GBOX VehicleList z bazą danych ujawniło 3 błędne przypisania box_id:

  • FZI0645C miało box 92837 — w GBOX to WGM4972U (Krajniak Marcin)
  • WPR4575U miało box 92836 — w GBOX to WGM4823U (Danski/Kozłowski)
  • FZI9829A miało box 93834 — w GBOX to WPR6975V (Liszczyński Tomasz)

Trzy pojazdy nie posiadają urządzenia GBOX — ich box_id ustawiono na NULL.

Nowe pojazdy na mapie

Dodano 3 brakujące pojazdy UTB: WGM4972U, WGM4823U, WPR6975V — teraz widoczne na mapie z danymi kierowcy.

Nazwy kierowców uppercase

Wszystkie nazwy kierowców (zarówno z bazy Pracownicy jak i GBOX fallback) wyświetlane są teraz wielkimi literami.

Fix krytyczny — brak kierowców na mapie (wydanie 15)

Wykryto i naprawiono krytyczny błąd powodujący, że żadne imię kierowcy nie wyświetlało się na mapie — zarówno lokalnie (po wymuszeniu filtra) jak i na produkcji.

Przyczyna: filtr pracowników używał nazwy pola w formacie snake_case (driver_card_number), podczas gdy endpoint /api/admin/employees zwraca dane w formacie camelCase (driverCardNumber). W efekcie undefined jest zawsze wartością falsy — wszyscy pracownicy byli odrzucani przez filtr, mapa pracowników była pusta i żaden pojazd nie otrzymywał przypisanego kierowcy.

Naprawa: filtr sprawdza teraz oba formaty — e.driverCardNumber || e.driver_card_number — co eliminuje problem i przywraca pełne wyświetlanie danych kierowców (m.in. Patalas Daniel na WGM7124N).

Fix czas pracy — brakujące dni tygodnia (wydanie 16)

Przyczyna braku danych

Dane historyczne w panelu czas pracy pobierane są z tabeli Supabase driver_working_time. Do tej tabeli trafiają tylko dane z dni, gdy aplikacja była aktywna — GBOX live jest wywoływany z parametrem since = dziś północ, więc poprzednie dni są zapisywane do Supabase jedynie wtedy, gdy ktoś otworzył stronę w tamtym dniu. Dni nieodwiedzone = brak danych.

Naprawa: backfill tygodniowy

Przy każdym załadowaniu strony (raz na tydzień, nie przy każdym odświeżeniu) pobierane są dane z GBOX od poniedziałku do teraz. Wynik trafia bezpośrednio do stanu komponentu — bez oczekiwania na zapis do Supabase. Efekt: wtorek, środa, czwartek i wszystkie kolejne dni są teraz widoczne.

Fix panel szczegółów — wykresy aktywności

Panel szczegółów kierowcy (kliknięcie w wiersz) pokazywał wykresy aktywności tylko dla dzisiaj — używał danych z GBOX live zamiast połączenia historii i live. Naprawiono: panel korzysta teraz z selectedDriverData, które łączy historię tygodniową z danymi bieżącego dnia.

Trwałe dane historyczne w Supabase (wydanie 17)

Fundamentalna naprawa architektury przechowywania danych tachografu.

Poprzedni problem: persistToSupabase działało jako fire-and-forget — zapis do bazy szedł w tle, ale route zwracał odpowiedź zanim zapis się zakończył. W efekcie dane historyczne były dostępne w Supabase tylko gdy ktoś odwiedził stronę czas pracy dokładnie w danym dniu. Dni nieodwiedzone = brak danych na zawsze.

Naprawa w working-time/route.js: persist jest teraz awaitowany — dane gwarantowanie trafiają do Supabase przed zwróceniem odpowiedzi. Dodano parametr ?limit= (domyślnie 5000, backfill używa 20000 dla pełnego tygodnia wszystkich kierowców).

Naprawa w czas-pracy/page.jsx: nowa logika załadowania tygodnia:

  1. Odczytaj z Supabase
  2. Jeśli Supabase puste → pobierz z GBOX od poniedziałku (await persist) → ponowny odczyt Supabase
  3. Dane historyczne (pon–wczoraj) się nie zmieniają — raz zapisane, zawsze dostępne bez ponownego wywoływania GBOX API

Więcej artykułów

Naprawa OCR cron, dropdown statusu, animacje tabeli zleceń

Naprawa crona OCR, dropdown statusu z ustawieniami, logika Przetwarzanie AI → in Planing, animacje pulsacji wierszy i wykrzykniki brakujących danych.

Czytaj więcej

Akordeonowy widok korespondencji email i poprawki WorkDesk

Nowy wątkowy widok emaili z animowanymi akordeonami, podgląd treści wiadomości, poprawki WorkDesk i Biblioteki danych.

Czytaj więcej