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ą:
- Cache pamięci (1 godzina) — najszybszy tier, omija całą sieć
- Cache Supabase (
gbox_drivers, 1 godzina) — unika niepotrzebnych wywołań GBOX - Znane ID z historii — zapytanie do
driver_working_timeo distinctgbox_driver_id(79 znanych ID zamiast ślepego 1–200) - GBOX API — tylko dla znanych ID, w batchach po 20 równolegle
- Persist do Supabase — wyniki zapisywane do
gbox_driversdla kolejnych wywołań - 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_driverswypeł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 sprawdzeniemcardNodriverByIdbrakowało w tablicy zależnościuseMemo— mapa nie odświeżała przypisań po załadowaniu listy kierowców
Baza danych
- Tabela
driver_working_timeodchudzona: usunięto dane starsze niż 3 tygodnie (53k → 34k rekordów) - Dodano automatyczne czyszczenie pg_cron co noc o 02:00 UTC
- Dodano kolumny
deletedipindogbox_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:
employees.driver_card_number→ imię i nazwisko z bazy Pracownicy- GBOX
idDriver1(numeryczny ID) → fallback - GBOX
cardNo→ fallback
Uzupełnienie bazy
- Uzupełniono
driver_card_numberipindla 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:
- Odczytaj z Supabase
- Jeśli Supabase puste → pobierz z GBOX od poniedziałku (await persist) → ponowny odczyt Supabase
- Dane historyczne (pon–wczoraj) się nie zmieniają — raz zapisane, zawsze dostępne bez ponownego wywoływania GBOX API