IoT · Fiskalizacja
Platforma do zdalnej fiskalizacji kas online
Platforma SaaS do zdalnej fiskalizacji i zarządzania kasami online w taxi, vendingu i na parkingach. Przeniosłem ją na nową architekturę razem z danymi produkcyjnymi.
- Branża
- Producent kas fiskalnych (IoT)
- Okres
- 12.2023 – 06.2026
- Rola
- Fullstack Engineer
- Stack
- TypeScript · React Router (SSR) · Mantine · Zod · Drizzle ORM · PostgreSQL · Fastify · Redis · BigQuery · AWS S3 · Testcontainers · Vitest
- 40+ekranów przeniesionych na nową architekturę
- 15+zintegrowanych korporacji taxi
- 8ról użytkowników
Kontekst
Kasa fiskalna w taksówce, automacie vendingowym czy biletomacie musi być zarejestrowana, skonfigurowana i pilnowana. Platforma, przy której pracowałem, pozwala robić to zdalnie: fiskalizować urządzenia, monitorować ich stan i analizować sprzedaż. Klient to jeden z wiodących producentów kas fiskalnych w Polsce. Użytkownicy to właściciele flot, technicy, helpdesk i administratorzy, łącznie 8 ról.
Problem
Platforma składała się z frontendu w Next.js 12 i backendu opartego na Hasurze/GraphQL. Każda zmiana wymagała pracy w dwóch miejscach, a pobieranie danych przez Hasurę było wolne. Do tego w starym systemie żyły dane produkcyjne: użytkownicy, urządzenia, faktury i dokumenty fiskalne. Migracja nie mogła ich zgubić.
Co zrobiłem
Migracja do jednej aplikacji
Przeniosłem platformę do jednej aplikacji full-stack w React Router v7 (SSR) z Drizzle ORM i PostgreSQL. To ponad 40 ekranów. Rezygnacja z Hasury skróciła czas pobierania danych i uprościła wdrażanie nowych funkcji.
Narzędzia do migracji danych
Zbudowałem narzędzia, które przeniosły użytkowników, urządzenia, faktury i dokumenty fiskalne z S3 do nowego systemu. Archiwum trafiło do BigQuery. Organizacje klientów przechodziły na nową wersję po kolei.
Architektura, która pilnuje dostępu
Wprowadziłem architekturę warstwową: repozytorium → serwis → loader. Granice między warstwami pilnuje ESLint. Każda organizacja widzi tylko swoje dane, a zakres dostępu zależy od roli. Sprawdzają to testy integracyjne na prawdziwej bazie (Testcontainers), nie na mockach.
Kreator fiskalizacji i integracje z taxi
Zintegrowałem platformę z ponad 15 korporacjami taxi, m.in. Bolt, FREE NOW i iTaxi. Zbudowałem wieloetapowy kreator fiskalizacji. Kolejne kroki zmieniają się w zależności od typu urządzenia (taxi, vending, parking, myjnia), a walidacja Zod jest wspólna dla klienta i serwera. Rozwijałem też synchronizację stanu urządzeń z API klienta w czasie zbliżonym do rzeczywistego i serwis skanów QR oparty na zdarzeniach (Fastify + Redis pub/sub).
Efekt
Zamiast frontendu i osobnego backendu jest jedna aplikacja w jednym języku. Dane produkcyjne przeszły na nowy system. Izolacja danych między organizacjami jest sprawdzana testami na prawdziwej bazie, więc kolejne funkcje można dodawać bez obawy o wycieki między klientami.