{"id":52,"date":"2026-04-18T01:29:04","date_gmt":"2026-04-18T00:29:04","guid":{"rendered":"https:\/\/sla.ovh\/?p=52"},"modified":"2026-04-18T01:31:10","modified_gmt":"2026-04-18T00:31:10","slug":"52","status":"publish","type":"post","link":"https:\/\/sla.ovh\/index.php\/2026\/04\/18\/52\/","title":{"rendered":"GPS tracker"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">&nbsp;Priorytet A \u2014 brakuj\u0105ce podstawy SaaS<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">#<\/th><th class=\"has-text-align-left\" data-align=\"left\">Funkcja<\/th><th class=\"has-text-align-left\" data-align=\"left\">Dlaczego<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">1<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Dziennik zdarze\u0144 (audit log)<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Kto, kiedy, co zmieni\u0142 \u2014 logowania, edycje user\u00f3w, zmiany plan\u00f3w, usuni\u0119cia. Tabela&nbsp;<code>audit_log<\/code>&nbsp;+ widok w adminie z filtrami<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">2<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Centrum powiadomie\u0144 (\ud83d\udd14 w topbarze)<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Alerty z geofence, koniec trialu, p\u0142atno\u015bci \u2014 teraz l\u0105duj\u0105 tylko w emailach. Dzwoneczek z licznikiem + dropdown<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">3<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>TOTP 2FA z aplikacji (Google\/Microsoft Authenticator)<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">DB ju\u017c ma&nbsp;<code>totp_secret<\/code>,&nbsp;<code>totp_backup_codes<\/code>,&nbsp;<code>twofa_method<\/code>&nbsp;\u2014 brakuje tylko UI (QR do zeskanowania + weryfikacja). Jest ju\u017c&nbsp;<code>qrcode<\/code>&nbsp;i&nbsp;<code>otpauth<\/code>&nbsp;w package.json<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">4<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Generowanie faktur PDF<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">NIP i firma s\u0105 zbierane, p\u0142atno\u015bci s\u0105, ale faktur brak.&nbsp;<code>pdfkit<\/code>&nbsp;lub&nbsp;<code>puppeteer<\/code>&nbsp;\u2192 faktura po udanej p\u0142atno\u015bci, download z panelu<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">5<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Eksport danych u\u017cytkownika (RODO)<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Ju\u017c jest w adminie \u2014 brakuje dla u\u017cytkownika (prawo dost\u0119pu), przycisk &#8222;Pobierz moje dane&#8221; w Profilu<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">6<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Usuni\u0119cie konta (RODO)<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Obowi\u0105zek prawny \u2014 self-service w Profilu z potwierdzeniem has\u0142a, kasuje usera i kaskadowo trackery<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\ude97 Priorytet B \u2014 u\u017cyteczne dla floty<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">#<\/th><th class=\"has-text-align-left\" data-align=\"left\">Funkcja<\/th><th class=\"has-text-align-left\" data-align=\"left\">Dlaczego<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">7<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Grupy tracker\u00f3w (floty)<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Kategoryzacja: &#8222;Ci\u0119\u017car\u00f3wki&#8221;, &#8222;Osobowe&#8221;. Filtrowanie na mapie, raporty per grupa<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">8<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Analityka zachowania kierowcy<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Z posiadanych danych GPS: przyspieszenia, ostre hamowanie, przekroczenia pr\u0119dko\u015bci, ranking tracker\u00f3w<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">9<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Scheduled reports<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Raporty PDF co tydzie\u0144\/miesi\u0105c automatycznie na email (cron + pdfkit) \u2014 ju\u017c jest&nbsp;<code>\/reports<\/code>, brakuje scheduler<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">10<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Ksi\u0119ga serwisowa pojazdu<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Historia przegl\u0105d\u00f3w\/napraw\/tankowa\u0144 per tracker + przypomnienia o terminach (OC, przegl\u0105d, wymiana oleju)<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">11<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>POI \/ ksi\u0105\u017cka adres\u00f3w<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Zapisane miejsca na mapie (dom, biuro, magazyn) \u2014 dropdown w widoku i w alertach<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udee1\ufe0f Priorytet C \u2014 bezpiecze\u0144stwo \/ ops<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">#<\/th><th class=\"has-text-align-left\" data-align=\"left\">Funkcja<\/th><th class=\"has-text-align-left\" data-align=\"left\">Dlaczego<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">12<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Dziennik nieudanych pr\u00f3b logowania<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Tabela&nbsp;<code>failed_logins<\/code>&nbsp;z IP + user-agent, panel admina z filtrami i opcj\u0105 blokady IP<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">13<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>IP whitelist dla panelu admina<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Middleware sprawdzaj\u0105cy&nbsp;<code>req.ip<\/code>&nbsp;przed&nbsp;<code>requireAdmin<\/code>&nbsp;\u2014 ochrona przed brute-force<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">14<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Log viewer w adminie<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Tailowanie&nbsp;<code>docker logs backend<\/code>&nbsp;przez web UI \u2014 diagnostyka bez SSH. Express SSE +&nbsp;<code>docker logs --tail --follow<\/code><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">15<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Status monitoring<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Widget w AdminDashboard: MQTT \u017cyje? Redis ping? gps-server na porcie 5001 odpowiada?<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd0c Priorytet D \u2014 integracje<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">#<\/th><th class=\"has-text-align-left\" data-align=\"left\">Funkcja<\/th><th class=\"has-text-align-left\" data-align=\"left\">Dlaczego<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">16<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Mened\u017cer webhook\u00f3w<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">User konfiguruje URL + eventy (pozycja, alert, geofence enter\/exit). Ju\u017c jest&nbsp;<code>\/webhooks<\/code>&nbsp;dla Stripe \u2014 rozszerzy\u0107 na customowe<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">17<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>API rate limit per klucz + dashboard zu\u017cycia<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Wykres wywo\u0142a\u0144 \/ 24h per klucz w AdminApiKeys<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">18<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Tracker sharing przez link + token<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Jest&nbsp;<code>\/share\/:token<\/code>&nbsp;\u2014 brakuje UI generowania z wyborem d\u0142ugo\u015bci (1h \/ 1d \/ tydzie\u0144) i ogranicze\u0144 (read-only mapa \/ z histori\u0105)<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">19<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Offline mapy na Androidzie<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>mapbox-sdk-js<\/code>&nbsp;lub tile cache \u2014 dla teren\u00f3w bez zasi\u0119gu<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcf1 Priorytet E \u2014 UX \/ wygl\u0105d<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">#<\/th><th class=\"has-text-align-left\" data-align=\"left\">Funkcja<\/th><th class=\"has-text-align-left\" data-align=\"left\">Dlaczego<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">20<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Responsywny dashboard mobile<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Obecny jest desktop-only \u2014 hamburger menu, stackowane karty<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">21<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Wieloj\u0119zyczno\u015b\u0107 (PL\/EN\/DE)<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Android ju\u017c ma&nbsp;<code>i18n.js<\/code>, browser tylko PL \u2014 i18next + selektor w navbarze<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">22<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Broadcast do u\u017cytkownik\u00f3w<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Admin wysy\u0142a komunikat (baner pod topbarem lub toast) do wszystkich \u2014 np. planowana konserwacja<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">23<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Custom ikony tracker\u00f3w<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">User wybiera emoji\/kolor per tracker \u2192 widoczne na mapie zamiast domy\u015blnego pina<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcb0 Priorytet F \u2014 monetyzacja<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">#<\/th><th class=\"has-text-align-left\" data-align=\"left\">Funkcja<\/th><th class=\"has-text-align-left\" data-align=\"left\">Dlaczego<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">24<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Program partnerski \/ referrals<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Link z kodem, po rejestracji \u2192 -10% dla polecaj\u0105cego i nowego. Tabela&nbsp;<code>referrals<\/code>, rozliczenie miesi\u0119czne<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">25<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Wielowalutowo\u015b\u0107<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Kolumna&nbsp;<code>currency<\/code>&nbsp;w&nbsp;<code>subscription_plans<\/code>, exchange rate z NBP API, automatyczna konwersja<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">26<\/td><td class=\"has-text-align-left\" data-align=\"left\"><strong>Kupony rabatowe<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Panel admina: utw\u00f3rz kupon&nbsp;<code>-20% na pierwszy rok<\/code>, sprawdzenie przy checkout<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Moja rekomendacja \u2014 next 3<\/h2>\n\n\n\n<p>Gdybym mia\u0142 wybra\u0107&nbsp;<strong>trzy<\/strong>&nbsp;na ten tydzie\u0144:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Audit log<\/strong>\u00a0(#1) \u2014 dziwnie, \u017ce go jeszcze nie ma; przy wielu adminach\/resellerach konieczny<\/li>\n\n\n\n<li><strong>Centrum powiadomie\u0144<\/strong>\u00a0(#2) \u2014 realnie poprawia codzienne u\u017cywanie (alerty l\u0105duj\u0105 tylko w emailu)<\/li>\n\n\n\n<li><strong>TOTP 2FA UI<\/strong>\u00a0(#3) \u2014 DB ju\u017c wszystko ma, to &#8222;tylko&#8221; 2 ekrany: w\u0142\u0105czenie z QR + weryfikacja przy logowaniu<\/li>\n<\/ol>\n\n\n\n<p><strong>Albo<\/strong>&nbsp;jeden konkretny biznesowy:&nbsp;<strong>faktury PDF<\/strong>&nbsp;(#4) \u2014 bez tego nie sprzedasz polskim firmom w og\u00f3le.<\/p>\n\n\n\n<p>Kt\u00f3ry klocek robimy?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp;Priorytet A \u2014 brakuj\u0105ce podstawy SaaS # Funkcja Dlaczego 1 Dziennik zdarze\u0144 (audit log) Kto, kiedy, co zmieni\u0142 \u2014 logowania,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-52","post","type-post","status-publish","format-standard","hentry","category-aplikacje-android"],"_links":{"self":[{"href":"https:\/\/sla.ovh\/index.php\/wp-json\/wp\/v2\/posts\/52","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sla.ovh\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sla.ovh\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sla.ovh\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sla.ovh\/index.php\/wp-json\/wp\/v2\/comments?post=52"}],"version-history":[{"count":3,"href":"https:\/\/sla.ovh\/index.php\/wp-json\/wp\/v2\/posts\/52\/revisions"}],"predecessor-version":[{"id":56,"href":"https:\/\/sla.ovh\/index.php\/wp-json\/wp\/v2\/posts\/52\/revisions\/56"}],"wp:attachment":[{"href":"https:\/\/sla.ovh\/index.php\/wp-json\/wp\/v2\/media?parent=52"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sla.ovh\/index.php\/wp-json\/wp\/v2\/categories?post=52"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sla.ovh\/index.php\/wp-json\/wp\/v2\/tags?post=52"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}