Schemat: odbicia z czytnika RCP trafiają przez importer w Pythonie do Directusa intranetu, a stamtąd do aplikacji RCP Dashboard z listami obecności, dziennikiem, wnioskami i raportami

Programowanie

RCP: rejestracja czasu pracy w urzędzie

Importer odbić z czytnika kart RFID i aplikacja do list obecności, wniosków i raportów dla Urzędu Miejskiego w Starym Sączu. Bez nowego systemu: dane trafiają do intranetu, z którego urząd już korzysta.

20.10.2026

Urząd Miejski w Starym Sączu od lat ma czytnik kart RFID do rejestracji czasu pracy. Problem polegał na tym, że odbicia lądowały w plikach tekstowych, a kadry składały z nich listy obecności ręcznie.

Zamiast kupować nowy system, dobudowałem do istniejącego czytnika dwie rzeczy: importer, który przenosi odbicia do intranetu, i aplikację, w której kadry, przełożeni i pracownicy widzą obecność w przeglądarce.

Schemat: odbicia z czytnika RCP trafiają przez importer w Pythonie do Directusa intranetu, a stamtąd do aplikacji RCP Dashboard z listami obecności, dziennikiem, wnioskami i raportami
Droga odbicia karty od czytnika do listy obecności

Importer: pliki tekstowe do bazy

Czytnik zapisuje każdy dzień do osobnego pliku. Każda linia ma 24 znaki: datę, godzinę bez sekund, numer karty i rodzaj zdarzenia, czyli wejście, wyjście, wyjście służbowe albo powrót.

Importer w Pythonie co godzinę:

  • sprawdza katalog z nowymi plikami,
  • parsuje linie i pomija te, które już są w bazie, więc ponowne wczytanie pliku niczego nie dubluje,
  • łączy numer karty z pracownikiem w kartotece,
  • zapisuje zdarzenia w Directusie intranetu,
  • przenosi przetworzony plik do archiwum i zapisuje wszystko w logu.

Osobny skrypt przenosi pliki z komputera, do którego podłączony jest czytnik. Nikt nie musi już ich kopiować ręcznie.

Jedno źródło prawdy

Dane trafiają do tego samego Directusa, z którego korzysta intranet urzędu. Są tam pracownicy, struktura organizacyjna, stanowiska, karty RFID, słownik nieobecności i typy wniosków. RCP Dashboard nie ma własnej bazy, tylko nadbudowuje interfejs nad tymi danymi.

RCP Dashboard

Aplikacja ma osobne widoki dla różnych ról:

  • obecność dzienna z przełączaniem dni strzałkami,
  • dziennik zdarzeń z ręczną korektą odbić przez kadry,
  • wnioski: urlop, wyjście służbowe i prywatne, nadgodziny, z akceptacją najpierw przełożonego, a potem kierownictwa urzędu,
  • listy pracowników z eksportem do CSV,
  • raporty: dzienna lista obecności, podsumowanie miesiąca i karta pracownika,
  • moja obecność, czyli widok dla każdego pracownika z jego własnymi odbiciami.

Uprawnienia wynikają z ról i struktury organizacyjnej. Kadry widzą wszystkich, przełożony swój zespół, a pracownik tylko siebie. Logowanie odbywa się kontem intranetu, a zdarzenia bezpieczeństwa trafiają do osobnego dziennika.

Tryb uproszczony

Wprowadzanie elektronicznej rejestracji czasu pracy w urzędzie to także sprawa ludzi, a nie tylko techniki. Administrator może tymczasowo ukryć godziny odbić i oznaczenie spóźnień w widokach aplikacji. Dane w bazie zostają bez zmian, a kadry dalej widzą i poprawiają prawdziwe wartości.

Dlaczego bez zrzutów ekranu

To system z danymi o obecności konkretnych osób, więc zamiast zrzutów pokazuję schemat.

Stack

  • SvelteKit z adapterem Node, TypeScript,
  • Tailwind v4 i Flowbite Svelte (szablon panelu administracyjnego),
  • Directus intranetu przez oficjalne SDK,
  • importer i synchronizacja plików w Pythonie,
  • powiadomienia e-mail przez Nodemailer,
  • Docker.