Przejdź do treści
Radosław Kania

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.