Ten dokument opisuje w przystępny sposób, z jakimi zewnętrznymi usługami współpracuje system SerwisRun, jak wymienia z nimi dane i jak te połączenia są zabezpieczone.

Gdy w systemie zaplanowana jest konserwacja, automatycznie pojawia się ona w kalendarzu Google przypisanego technika. Technik widzi swoje zadania w telefonie, na zegarku, w przeglądarce — wszędzie, gdzie korzysta z Google Calendar.
| Sytuacja | Co robi system |
|---|---|
| Nowa konserwacja (3 dni) | Tworzy 3 osobne wydarzenia w kalendarzu (jedno na każdy dzień roboczy) |
| Zmiana terminu | Kasuje stare wydarzenia, tworzy nowe w nowym terminie |
| Anulowanie konserwacji | Usuwa przyszłe wydarzenia (przeszłe pozostawia jako historię) |
| Konserwacja 4-godzinna | Tworzy jedno wydarzenie 7:30–11:30 (proporcjonalnie do czasu) |
Przed dodaniem wydarzenia system sprawdza, czy technik nie jest zajęty w tym terminie (przez mechanizm Google FreeBusy). Jeśli wykryje konflikt:
| Mechanizm | Opis |
|---|---|
| OAuth2 | System nigdy nie zna hasła do konta Google — otrzymuje jednorazowy „klucz dostępu" (token), który można w każdej chwili odwołać |
| Auto-odświeżanie tokenu | Token wygasa co godzinę — system automatycznie go odnawia, bez udziału użytkownika |
| Minimalne uprawnienia | System ma dostęp tylko do kalendarza, nie do poczty, plików czy kontaktów (chyba że osobno upoważniony) |
| Szyfrowanie | Cała komunikacja z Google odbywa się przez HTTPS |
Porównanie: To ten sam mechanizm autoryzacji OAuth2, jakiego używają aplikacje typu Calendly, Zoom, czy Slack do integracji z Google Calendar. Używa oficjalnego SDK Google — nie jest to „obejście" czy niestandardowe rozwiązanie.

System wysyła e-maile w Twoim imieniu — np. protokoły konserwacji do klientów, przypomnienia o terminach, potwierdzenia rejestracji. Obsługuje trzy niezależne kanały wysyłki w hierarchii awaryjnej:
Próba 1: Resend API ──(jeśli skonfigurowany)──▸ wysłane ✓
│ (niedostępny)
▼
Próba 2: Gmail API ──(jeśli autoryzowany)────▸ wysłane ✓
│ (niedostępny)
▼
Próba 3: SMTP ──(serwer pocztowy)───────▸ wysłane ✓
| Kanał | Jak działa | Dla kogo |
|---|---|---|
| Resend API | Profesjonalna usługa do wysyłki e-mail. Wysoka dostarczalność, śledzenie statusu | Firmy wysyłające dużo e-maili (>100/dzień) |
| Gmail API | Wysyłka bezpośrednio z konta Gmail firmy. E-mail wygląda jakby wysłany z Gmaila | Firmy korzystające z Google Workspace |
| SMTP | Klasyczny serwer pocztowy (np. firmowy serwer e-mail, hosting) | Firmy z własnym serwerem pocztowym |
| Mechanizm | Opis |
|---|---|
| OAuth2 (Gmail) | Brak hasła w systemie — token autoryzacyjny z automatycznym odświeżaniem |
| Szyfrowanie TLS (SMTP) | Połączenie z serwerem pocztowym jest szyfrowane |
| Klucz API (Resend) | Bezpieczny token, przechowywany w zmiennych środowiskowych serwera |
| Fallback chain | Jeśli jeden kanał nie działa, system automatycznie próbuje następnego |
| Weryfikacja połączenia | Przed pierwszym użyciem system testuje, czy konfiguracja pocztowa działa |
Porównanie: Trzypoziomowy fallback to rozwiązanie stosowane w systemach klasy enterprise (np. Salesforce, HubSpot). Większość prostszych systemów obsługuje tylko jeden kanał — jeśli nie działa, e-maile nie wychodzą.

Umożliwia dwukierunkową synchronizację kontaktów między systemem SerwisRun a kontaktami Google:
| Kierunek | Co się dzieje |
|---|---|
| Import (Google → SerwisRun) | Pobiera kontakty z konta Google i dodaje je do bazy systemu |
| Eksport (SerwisRun → Google) | Wysyła kontakty z systemu do kontaktów Google |
| Pole w systemie | Pole w Google |
|---|---|
| Imię, nazwisko | Nazwa kontaktu |
| E-mail służbowy | Adres e-mail |
| Telefon komórkowy | Telefon mobilny |
| Telefon stacjonarny | Telefon domowy |
| Stanowisko, firma | Organizacja |
| Notatki | Opis kontaktu |
Porównanie: Synchronizacja kontaktów na poziomie People API to ten sam mechanizm, jakiego używają CRM-y (HubSpot, Pipedrive) i komunikatory (WhatsApp Business).
Analogicznie do Google Contacts, ale dla użytkowników Microsoft 365 / Outlook.
Porównanie: To ten sam mechanizm integracji, jakiego używają aplikacje z Microsoft AppSource (marketplace) — Dynamics 365, Teams, Power Automate.
Protokoły, załączniki umów, zdjęcia materiałów i inne pliki są przechowywane na Microsoft OneDrive zamiast na serwerze aplikacji. Daje to:

| Etap | Zabezpieczenie | Szczegóły |
|---|---|---|
| Przeglądarka → Serwer | HTTPS + JWT token | Musisz być zalogowany; plik szyfrowany w transmisji |
| Walidacja na serwerze | Filtr typów i rozmiarów | Zdjęcia: JPEG, PNG, WebP (max 5–10 MB). Dokumenty: PDF, DOCX |
| Serwer → OneDrive | OAuth2 + Microsoft Graph API | Token dostępowy z automatycznym odświeżaniem |
| Na OneDrive | Szyfrowanie at rest | Microsoft szyfruje pliki na dysku (BitLocker + per-file encryption) |
| Rozmiar pliku | Metoda przesyłania |
|---|---|
| Do 4 MB | Pojedyncze żądanie HTTP (natychmiastowe) |
| Powyżej 4 MB | Przesyłanie w porcjach po 320 KB (chunked upload) — odporny na zerwanie połączenia |
Jeśli OneDrive jest chwilowo niedostępny (awaria Microsoft, brak internetu na serwerze):
Porównanie: Mechanizm OAuth2 + MSAL + Graph API to dokładnie ten sam sposób, w jaki Microsoft Teams, SharePoint i Power Automate komunikują się z OneDrive. System nie przechowuje hasła do konta Microsoft — używa tokenów, które administrator może w każdej chwili odwołać w panelu Azure AD.
Identyczna funkcjonalność jak OneDrive, ale dla firm korzystających z Google Workspace zamiast Microsoft 365. Administrator wybiera w ustawieniach systemu, którego dostawcę chmury używać:
| Ustawienie | Gdzie przechowywane pliki |
|---|---|
google_drive | Google Drive (konto firmowe Google) |
onedrive | Microsoft OneDrive (konto firmowe Microsoft) |
none | Brak chmury — pliki w bazie danych (base64) |
Porównanie: Scope drive.file oznacza, że system nie ma dostępu do żadnych Twoich prywatnych plików na Google Drive — widzi wyłącznie pliki, które sam utworzył. To jak klucz do jednego pokoju w biurowcu, nie do całego budynku.

KSeF to rządowy system elektronicznych faktur prowadzony przez Ministerstwo Finansów RP. Od 2026 roku wszystkie firmy w Polsce będą zobowiązane do wystawiania faktur przez KSeF.
| Funkcja | Opis |
|---|---|
| Wystawianie faktur | System generuje fakturę w formacie XML (FA_VAT), podpisuje ją cyfrowo i wysyła do KSeF |
| Pobieranie faktur zakupu | System pobiera faktury wystawione przez dostawców (gdzie Twoja firma jest nabywcą) |
| Import danych | Automatyczne parsowanie pobranych faktur i tworzenie rekordów w systemie |
| Mechanizm | Opis |
|---|---|
| Token autoryzacyjny | Wydawany przez Ministerstwo Finansów — jedyny sposób dostępu do KSeF |
| Hash SHA-256 | Każda faktura ma „odcisk palca" — gwarantuje, że nie została zmieniona w transmisji |
| HTTPS | Szyfrowane połączenie z serwerami rządowymi |
| Sesyjność | Każda operacja wymaga aktywnej sesji z limitem czasu |
| Timeout 30s | Każde żądanie ma limit 30 sekund — chroni przed zawieszeniem |
| Środowisko testowe | Możliwość testowania na ksef-test.mf.gov.pl bez wpływu na produkcję |
Porównanie: Integracja z KSeF jest wymagana prawnie dla firm w Polsce. SerwisRun implementuje ją zgodnie ze specyfikacją Ministerstwa Finansów. Wiele mniejszych systemów serwisowych wymaga ręcznego logowania do portalu KSeF — tutaj wszystko dzieje się automatycznie z poziomu aplikacji.
System wykorzystuje sztuczną inteligencję Claude (firmy Anthropic) do wspomagania codziennej pracy. AI nie podejmuje decyzji — sugeruje, a użytkownik zatwierdza lub modyfikuje propozycje.
| Funkcja | Co robi | Jak używasz |
|---|---|---|
| Chatbot asystent | Odpowiada na pytania o dane w systemie | Ikona czatu w rogu ekranu |
| Kategoryzacja zgłoszeń | Automatycznie proponuje kategorię i priorytet | Przycisk „Sugeruj kategoryzację" |
| Generowanie protokołów | Tworzy wstępny tekst protokołu konserwacji | Przycisk „Generuj z AI" |
| Kosztorysy | Proponuje wycenę naprawy | Przycisk „Generuj z AI" |
| Analiza umów | Wyciąga kluczowe dane z PDF umowy | Upload dokumentu w kreatorze |
| Predykcja awarii | Przewiduje, które urządzenia mogą wymagać naprawy | Zakładka „Predykcja AI" |
| Rozpoznawanie materiałów | Identyfikuje produkt ze zdjęcia | Aparat w widoku mobilnym |
| Import materiałów | Wyciąga materiały z faktury/WZ | Kreator importu materiałów |
| Planowanie harmonogramu | Proponuje optymalny układ konserwacji | Asystent AI w harmonogramie |
| Raporty | Generuje analizy i podsumowania | Zakładka „Raporty AI" |
Chatbot AI ma dostęp do danych w systemie, ale z pełnym respektowaniem uprawnień:
Pracownik oddziału Poznań pyta: „Pokaż klientów"
→ AI widzi TYLKO klientów oddziału Poznań (filtr oddziałowy)
Administrator pyta: „Pokaż klientów"
→ AI widzi wszystkich klientów (pełny dostęp)
| Ograniczenie | Wartość domyślna | Cel |
|---|---|---|
| Dzienne zapytania | Max 100 na użytkownika | Kontrola kosztów API |
| Dzienny limit tokenów | Max 500 000 na użytkownika | Zapobiega nadmiernemu zużyciu |
| Śledzenie zużycia | Każde zapytanie rejestrowane | Administrator widzi, kto ile zużywa |
Porównanie: AI w SerwisRun to asystent, nie autopilot. W odróżnieniu od prostych chatbotów, tutaj AI ma kontekstowy dostęp do danych systemu z pełnym RBAC. To podejście stosowane w systemach enterprise — np. Salesforce Einstein, Microsoft Copilot, ServiceNow Virtual Agent.

Przy dodawaniu nowego dostawcy wystarczy wpisać numer NIP — system automatycznie pobierze z rejestru Ministerstwa Finansów pełną nazwę firmy, numer REGON i adres siedziby.

Porównanie: To ta sama baza danych „Biała Lista VAT", z której korzystają systemy księgowe (Optima, Symfonia, wFirma) i banki do weryfikacji kontrahentów.

Umożliwia logowanie do systemu bez hasła — za pomocą odcisku palca, rozpoznawania twarzy, klucza USB lub passkey.
| Mechanizm | Opis |
|---|---|
| Kryptografia klucza publicznego | Twój odcisk palca nigdy nie opuszcza urządzenia — serwer dostaje tylko podpis cyfrowy |
| Ochrona przed phishingiem | W przeciwieństwie do hasła, biometria nie może być wyłudzona przez fałszywą stronę |
| Ochrona przed klonowaniem | Licznik użyć zapobiega skopiowaniu klucza bezpieczeństwa |
| Challenge z limitem czasu | Wyzwanie autoryzacyjne wygasa po 10 minutach |
| Wiele urządzeń | Możesz zarejestrować laptop, telefon i klucz USB — każde niezależnie |
| Łatwe odwołanie | Zgubiony telefon? Usuń go z listy urządzeń jednym kliknięciem |
Porównanie: WebAuthn/FIDO2 to najwyższy dostępny standard logowania, stosowany przez Google, Apple, Microsoft, banki (ING, mBank) i organizacje rządowe. Jest uznawany za odporny na phishing.


SerwisRun działa jako Progressive Web App — to strona internetowa, która zachowuje się jak natywna aplikacja mobilna: ikona na pulpicie, pełny ekran, tryb offline, powiadomienia push. Instalacja jednym kliknięciem — bez App Store.
Porównanie: PWA to technologia stosowana przez Twitter, Pinterest, Starbucks, Uber. Łączy wygodę aplikacji mobilnej z prostotą aktualizacji strony internetowej (bez czekania na zatwierdzenie w App Store).
Co to robi: operator klika ikonę słuchawki obok numeru klienta — system inicjuje połączenie przez API VoIP (telefon operatora dzwoni, po odebraniu łączy się z klientem). Pełna historia połączeń trafia do bazy.
Webhook jest publicznym endpointem (provider nie ma naszego JWT), dlatego wymaga podpisu:
Porównanie: click-to-call w polskich systemach CRM rzadko wychodzi poza Twilio (zagraniczne, droższe). My obsługujemy IPfon (Polska) i kompatybilne — taniej w skali całego zespołu serwisowego.

Co to robi: automatyczne SMS-y do klientów na 5 kluczowych etapach pracy serwisu, bez ręcznego wysyłania:
Każdy event ma osobny szablon (z placeholderami `{{client_name}}`, `{{ticket_number}}`, `{{link}}` itp.) edytowalny przez admina w panelu. Dyspozytor / system woła dispatchNotification(eventCode, params) — backend automatycznie:
Wartość: zamiast każdy moduł miał własną kopię logiki SMS — jest jeden dispatcher. Konfiguracja kanałów (kiedy SMS, kiedy email, kiedy in-app) tylko w panelu admina.

Co to robi: import cenników od dostawców (XLSX / XLS / XLSB / ODS / PDF) bez ręcznego mapowania kolumn za każdym razem. Każdy dostawca ma własny szablon cennika — „przepis" mówiący systemowi, gdzie szukać indeksu, nazwy, ceny i EAN-u w pliku.
Panel Administracyjny → Integracje → Cenniki dostawców.(dostawca, kod katalogowy) lub EAN. Istniejący materiał aktualizowany, nowy tworzony.supplier_pricelist_imports (status, ile dodano/zaktualizowano/pominięto, lista błędów per wiersz).| Element | Opis |
|---|---|
| Formaty plików | Excel (XLSX, XLS, XLSB), OpenDocument (ODS), PDF (parser regex; AI fallback w roadmapie) |
| Waluty | PLN, EUR, USD — cena w obcej walucie zapisuje się w polu original_price + original_currency, nie nadpisując ceny zakupu w PLN |
| Sekcje nagłówkowe | Heurystyczne wykrywanie wierszy z samym nagłówkiem kategorii (bez ceny) — pomijane jako sekcje, nie jako materiały |
| Per-arkusz override | Inny mapping kolumn dla różnych zakładek (np. „Centrale" vs „Akcesoria") w polu perSheet |
| Domyślny producent | Gdy plik nie ma kolumny producenta (np. UTC = ARITECH) — szablon definiuje wartość domyślną |
AAT, AG Neovo, Arpol, EMU, IFTER, IronWave, Polon Alfa, Pulsar, Satel, TAP, Trikon, UTC. Lista rośnie — każdy nowy szablon to ~30 minut konfiguracji bez zmian w kodzie.
Odporność: applier używa savepointów per wiersz — jeden zły rekord (np. brak ceny) nie wywala całego importu kilkutysięcznego cennika. System loguje błąd i kontynuuje.

Wszystkie sekrety używane przez integracje (tokeny OAuth Google/Microsoft, klucz API Claude, sekret webhooka VoIP, klucz SMSAPI, hasła SMTP, token KSeF) są przechowywane w bazie w postaci zaszyfrowanej AES-256-GCM. Klucz szyfrujący (INTEGRATION_SECRET_KEY) trzymany jest w zmiennych środowiskowych Railway — odrębnie od bazy danych.
| Co jest szyfrowane | Algorytm | Gdzie klucz |
|---|---|---|
| Tokeny OAuth (access + refresh) | AES-256-GCM | INTEGRATION_SECRET_KEY (env) |
| Klucze API (Claude, SMSAPI, Resend) | AES-256-GCM | INTEGRATION_SECRET_KEY (env) |
| Sekrety webhooków (VoIP) | AES-256-GCM | INTEGRATION_SECRET_KEY (env) |
| Hasła SMTP, token KSeF | AES-256-GCM | INTEGRATION_SECRET_KEY (env) |
Konsekwencja: Nawet bezpośredni dostęp do bazy danych (np. wykradziony zrzut) nie ujawnia sekretów integracji. Klucz i dane są fizycznie w innych miejscach. Procedura rotacji klucza opisana w docs/SECURITY.md.

