Dla dyrektora cyfrowego

Architektura i API

Jak platforma Hub łączy salon, sklep i panel dealera z systemami, które już działają w grupie. Co jest w prototypie, co jest realne w MVP, a co zależy od umów i dostępu do cudzych systemów.

1. Schemat systemu

Trzy warstwy: klienci, platforma Hub, integracje. Linia ciągła - integracja w MVP, kreskowana - faza 2, kropkowana - faza 3. Na telefonie schemat przewija się w bok.

Schemat architektury Hub Klienci (salon, sklep, panel dealera) komunikują się z platformą Hub (API, kolejka zgłoszeń, katalog, silnik wycen), a ta z dziewięcioma systemami zewnętrznymi. KLIENCI Salonauta, jazda próbna, wycena, rezerwacja Sklepczęści i akcesoria, B2C i B2B Panel dealerahandlowcy, serwis, zarząd HTTPS, JSON PLATFORMA HUB APIREST/JSON, role,limity, dziennik Kolejka zgłoszeńleady, statusy,powiadomienia Katalogauta, części, dopasowaniepo modelu i VIN Silnik wycenleasing, ubezpieczenie,rata, wykup INTEGRACJE System importeraplik/REST - MVP DMS dealeraeksport/most - faza 2 CEPiK / dekoder VINfaza 3 KSeFprzez DMS - faza 2 Partnerzy leasingowikalkulator - MVP Ubezpieczycielefaza 2 Płatnościbramka - faza 2 E-mail / SMSMVP Kluczkomatyfaza 3 Hub nie zastępuje DMS ani systemu importera - synchronizuje się z nimi i ich nie omija.

2. Integracje - co jest realne

Ocena ryzyka to nasze założenia robocze, nie wynik rozmów z dostawcami. Prawie każda pozycja zależy od umowy lub zgody właściciela systemu - to główne ryzyko harmonogramu, nie sama technika.

SystemKierunek danychTrybDaneRyzyko i plan BFaza
System importeraimporter do Hubplik CSV/XML (SFTP, e-mail); REST tylko jeśli importer go udostępniastany, ceny katalogowe, warianty, gwarancjeDostęp do danych importera wymaga umowy i jest u każdej marki inny. Plan B: ręczny import pliku z panelu dealera; ceny publiczne tylko jako orientacyjne.MVP
DMS dealeradwukierunkowo, w MVP tylko DMS do Hubeksport bazy / most bazodanowy (widok SQL, replika do odczytu); REST/SOAP rzadkoklienci, faktury, magazyn, zlecenia serwisoweWiele DMS nie ma API. Dostawca może wymagać zgody lub opłaty, a zapis zwrotny jest ryzykowny. Plan B: nocny eksport plikiem, zlecenia wpisywane w DMS ręcznie.2
CEPiK / dekoder VINHub do zewnętrznegoAPI komercyjne dekodera; CEPiK tylko przy podstawie prawnejdekodowanie VIN, wyposażenie fabryczneDostęp do CEPiK jest ograniczony prawnie - nie zakładamy go w MVP. Dla nowych aut wystarcza VIN i dane z systemu importera. W prototypie: atrapa.3
KSeFwysyłka z DMS, Hub czyta statusAPI Ministerstwa Finansów, zwykle przez DMSe-faktury, numery KSeF, statusyTerminy obowiązku wdrażane etapami - do sprawdzenia aktualnie. Faktury wystawia DMS; Hub nie powinien dublować tej roli. Plan B: numer faktury wpisywany ręcznie.2
Partnerzy leasingowiHub do partnera i z powrotemREST kalkulatora albo portal partnerski; e-mail z wnioskiemcena, wkład, wykup, okres, rata, status wnioskuNie każda firma leasingowa ma API. Plan B: własny kalkulator na tabelach stawek (wycena indykatywna) i wniosek wysyłany do partnera.MVP
UbezpieczycieleHub do ubezpieczycielaREST agregatora lub brokeradane pojazdu i ubezpieczanego, oferty OC/ACSprzedaż polis wymaga statusu agenta lub współpracy z brokerem (regulacje). Plan B: formularz zgłoszeniowy przekazywany brokerowi.2
Płatności onlineHub do bramki, webhook zwrotnybramka płatnicza (redirect, webhook)zadatek za rezerwację, płatność za częściNiskie ryzyko techniczne; dane karty zostają po stronie bramki. Plan B: przelew z tytułem i ręczne potwierdzenie.2
E-mail / SMSHub do klientaSMTP, bramka SMSpotwierdzenia, przypomnienia, kodyNiskie ryzyko. Wymagane zgody (RODO, komunikacja marketingowa). Plan B: powiadomienie tylko w panelu.MVP
KluczkomatyHub do sterownikaAPI producenta lub kody jednorazowekod odbioru, okno czasowe, potwierdzenie wydaniaZależy od modelu urządzenia; część nie ma API. Plan B: kod generuje i wpisuje pracownik.3

3. Konsola API na żywo

Wybierz endpoint, popraw parametry i wyślij. Wywołanie idzie przez window.API - ten sam obiekt, którego używają pozostałe strony prototypu. Wywołania trafiają do prawdziwego serwera Hub (baza SQLite, logowanie, role); endpointy wymagające roli pokażą okno logowania.

Endpointy
    Żądanie
    Brak wywołania.
    Wysłano
    -
    Odpowiedź
    -

    Dziennik wywołań

    Pokazuje wszystkie wywołania API wykonane na tej stronie, także statusy integracji i synchronizację. Dziennik jest w pamięci strony - po przejściu na inną podstronę zaczyna się od zera.

    Brak wywołań.

    4. Status integracji

    Stan z API.integrations(). Wartości są symulowane - w produkcji pochodziłyby z testów połączeń i ostatnich udanych wymian danych.

    Ładuję status...

    5. Przykładowe kontrakty

    Propozycja kontraktów docelowych. Atrapa w prototypie implementuje je częściowo: nie wymusza zgód, nagłówków ani walidacji pól.

    POST /v1/leads

    Nagłówki Authorization: Bearer <token> Idempotency-Key: <uuid> Body { "type": "jazda-probna", // wymagane: jazda-probna | rezerwacja | // wynajem | leasing | ubezpieczenie | serwis | // kluczkomat | zamowienie-b2c | zamowienie-b2b | wycena "vehicleId": "V101", // opcjonalne "salon": "poz", // opcjonalne, id salonu "data": { "name": "string", "phone": "string", "email": "string" }, "consent": { "contact": true, "marketing": false } // contact wymagane } 201 Created { "id": "L-2001", "type": "jazda-probna", "status": "Nowe", "ts": "2026-11-03T10:15:00Z", "data": { ... } } Błędy 400 validation_error brak pola lub zły typ 401 unauthorized brak lub zły token 403 forbidden_role rola bez prawa zapisu zgłoszeń 409 duplicate_request ten Idempotency-Key już użyty 422 consent_missing brak zgody na kontakt 429 rate_limited za dużo żądań

    POST /v1/quotes/leasing

    Body { "vehicleId": "V101", // opcjonalne "price": 159900, // brutto, PLN, wymagane "downPct": 10, // wpłata własna, 0-50 "balloonPct": 20, // wykup, 0-50 "months": 48 // 12-84 } 200 OK { "priceNet": 129999, "offers": [ { "provider": "Partner leasingowy A", "rateNet": 2310, "rateGross": 2841, "apr": 0.067, // w atrapie: oprocentowanie // nominalne, nie RRSO "fee": 1300 } ], "partial": false, // true gdy część partnerów nie odpowiedziała "note": "Wycena indykatywna, nie oferta." } Błędy 400 validation_error np. downPct + balloonPct > 80 404 vehicle_not_found nieznany vehicleId 502 partner_unavailable żaden partner nie odpowiedział 504 partner_timeout przekroczony czas (np. 8 s)

    Webhook vehicle.reserved

    POST <adres subskrybenta, np. DMS lub system importera> X-Hub-Event: vehicle.reserved X-Hub-Delivery: <uuid dostarczenia> X-Hub-Signature: sha256=<HMAC-SHA256 ciała żądania, wspólny sekret> { "event": "vehicle.reserved", "id": "evt_8f3a...", // klucz do deduplikacji "ts": "2026-11-03T10:20:00Z", "data": { "vehicleId": "V101", "vin": "LDEMO...", "leadId": "L-2001", "salon": "poz", "channel": "salon", // salon | panel "reservedUntil": "2026-11-06T10:20:00Z" } } Odpowiedź odbiorcy 2xx przyjęte (odpowiedz w ciągu 10 s) 410 odbiorca wyłącza subskrypcję inne i brak odpowiedzi: ponowienie z rosnącym odstępem (np. 1 min, 5 min, 30 min, 6 h), potem wpis w kolejce błędów widoczny w panelu. Dostarczenie jest "co najmniej raz" - odbiorca deduplikuje po polu id.

    6. Model uprawnień

    Propozycja ról. "Własny salon" oznacza dane ograniczone do salonów przypisanych użytkownikowi.

    RolaAutaZgłoszeniaWycenySync importeraZamówieniaDane osobowe
    Dealer (zarząd grupy)wszystkie salonyodczyt i zapis, wszystkietaktaktaktak
    Handlowiecwłasny salonwłasny salontakniewłasny salonwłasne zgłoszenia
    Serwisnietylko serwis i kluczkomatnienieczęści, własny salonwłasne zgłoszenia
    Importer (tylko odczyt)stany i sprzedaż, zbiorczonienienienienie
    Partner B2Bnienienieniewłasne, z limitem kredytowymtylko własna firma

    Zasada nadrzędna: importer nie widzi danych osobowych klientów dealera. Logowanie i cztery role (admin, handlowiec, serwis, warsztat B2B) już działają; podział na własny salon i rola importera to opis docelowy.

    7. Co trzeba zbudować naprawdę

    Hub ma dziś działający backend, logowanie, role, import plikowy i pomiar leadów, ale nie ma prawdziwych integracji z systemami zewnętrznymi (DMS, CEPiK, KSeF, leasing, ubezpieczenia, płatności). Poniżej lista prac, część już zrobiona w wersji demonstracyjnej. Kolumna z tygodniami to szacunek przy założeniu małego zespołu (2-3 programistów), bez doliczania czasu oczekiwania na umowy i dostępy - nie jest wynikiem analizy projektowej.

    PracaCo obejmujeSzacunek, tygodnie
    Backend i APIbaza danych, REST, uwierzytelnianie, role z sekcji 6, dziennik audytuszacunek: 4-6
    Katalog i stanymodel aut i części, dopasowanie po modelu/VIN, rezerwacjeszacunek: 3-4
    Import z systemu importeraparser plików, mapowanie na własny model, obsługa błędów i zmian censzacunek: 3-5 po uzyskaniu dostępu
    Kolejka zgłoszeństatusy, przypisanie do salonu, powiadomienia e-mail/SMS, zgody RODOszacunek: 3
    Silnik wycen leasingutabele stawek, kalkulator, później API partnerówszacunek: 4-6
    Most do DMSeksport lub replika odczytowa, mapowanie klientów i zleceń; zapis zwrotny dopiero późniejszacunek: 4-8, zależy od DMS
    Ubezpieczeniaintegracja z brokerem/agregatorem, zgodność z regulacjamiszacunek: 4-8
    Płatności i KSeFbramka z webhookami; podgląd statusów KSeF przez DMSszacunek: 4-6 łącznie
    Kluczkomatyintegracja ze sterownikiem lub generator kodówszacunek: 3-6
    Bezpieczeństwo, monitoring, testy, pilotaż w jednym saloniekopie zapasowe, alerty, testy integracji, szkolenie, poprawki po pilotażuszacunek: 6-8

    8. Radar leadów i katalog systemów

    Dwa moduły z panelu (zakładki Radar i Systemy). Radar liczy czas reakcji, lejek i utraconą wartość z danych Hub albo z importu CSV; katalog zbiera systemy, z których dealerzy w Polsce korzystają, i te, które wymagają producenci, importerzy oraz przepisy.

    EndpointRolaCo robi
    GET /v1/radar?scope=demo|live|all&days=7|30|60|90personelKPI, lejek, tabele wg źródła, marki, oddziału i typu, trend tygodniowy, przed i po wdrożeniu, kolejka leadów bez kontaktu, metodyka
    PUT /v1/radar/assumptionsadminSLA, godziny pracy, próg zaniechania, minimalna próba, data wdrożenia, wartości leadów (puste = brak, [X])
    POST /v1/radar/importadminCSV lub JSON z CRM, tylko metadane (ts, type, source, brand, salon, first_contact_ts, status, closed_ts); ?dry=1 sprawdza bez zapisu
    POST /v1/radar/demo/reseedadmingeneruje dane DEMO od nowa (prawdziwe zgłoszenia zostają)
    GET /v1/systems, /v1/systems/connectorspersonelkatalog systemów z dowodami i pewnością W/S/N oraz łączniki Hub ze statusem działa, atrapa lub plan

    Dane DEMO Radaru są generowane i zależność szybszej reakcji od konwersji jest w nich założona z góry, więc ekran pokazuje obliczenia, a nie fakt o rynku. Szacunek utraconych PLN to korelacja, nie dowód przyczynowy. Pełny opis: docs/SZKIELET.md w repozytorium.