Gmina ma wobec przedsiębiorstw asenizacyjnych dwie role. Wójt wydaje zezwolenie na opróżnianie zbiorników bezodpływowych i transport nieczystości ciekłych, a potem weryfikuje kwartalne sprawozdania przewoźnika. Obie role opisuje ustawa o utrzymaniu czystości i porządku w gminach (Dz.U. 2025 poz. 733).
BioKontrol prowadzi dane przewoźników i ich pojazdów w kartotekach, a następnie łączy je z dokumentami pobrania oraz zrzutu. Urzędnik porównuje więc sprawozdanie przewoźnika z dokumentami, które kierowcy tej firmy zarejestrowali w terenie, zamiast przyjmować liczby na wiarę. Z tych samych dokumentów system odtwarza kursy każdego wozu, dlatego monitoring pojazdów asenizacyjnych nie wymaga nadajnika w pojeździe.
Wykaz adresów w sprawozdaniu. Sprawozdanie kwartalne zawiera liczbę właścicieli nieruchomości, od których odebrano nieczystości, wraz z wykazem adresów (art. 9o ust. 3 pkt 6). Adres z wykazu przewoźnika, którego nie ma w gminnej ewidencji zbiorników, wskazuje nieruchomość pominiętą w ewidencji.
Przedsiębiorstwa i przewoźnicy w dwóch kartotekach
System rozdziela dane firmy od danych osób i pojazdów, które wykonują usługę. Jedno przedsiębiorstwo ma wielu przewoźników, a każdy przewoźnik należy do dokładnie jednego przedsiębiorstwa.
| Kartoteka | Zawartość |
|---|---|
| Przedsiębiorstwa | nazwa, NIP, adres, dane kontaktowe, status aktywności oraz cennik usług |
| Przewoźnicy | kierowca, numer rejestracyjny pojazdu, powiązanie z przedsiębiorstwem oraz kod kreskowy albo etykieta |
Cennik w kartotece przedsiębiorstwa zawiera stawkę za metr sześcienny ścieków bytowych oraz stawkę za nieczystości z przydomowych oczyszczalni. Weryfikację rachunków według tych stawek przedstawia artykuł o cenniku rozliczeń z przedsiębiorstwami asenizacyjnymi. Kod kreskowy przewoźnika przyspiesza identyfikację na wydrukach.
Edycja przewoźnika a dokumenty archiwalne
Wpis przewoźnika można w każdej chwili edytować albo usunąć. Dla dokumentów zapisanych wcześniej ma to konsekwencje, bo dokument pobrania z 2024 r. wskazuje rekord przewoźnika, który mógł się od tego czasu zmienić.
- Zmiana numeru rejestracyjnego - jeżeli dokument przechowuje tylko identyfikator pojazdu, stary dokument pokaże nowy numer. Numer z chwili zdarzenia warto zapisać w dokumencie jako migawkę.
- Usunięcie przewoźnika - klucz obcy bez kaskady odrzuci usunięcie przewoźnika wskazanego w dokumentach. Bez klucza obcego dokumenty straciłyby kierowcę. Bezpieczniejsze jest wyłączenie wpisu przez status aktywności.
Kartoteka pojazdów
Nowy wóz dodaje się funkcją „Dopisz”. Użytkownik wybiera firmę z rozwijanej listy oraz wpisuje numer rejestracyjny i pojemność zbiornika. Pole uwag przyjmuje informacje eksploatacyjne. Istniejące wpisy można edytować, gdy firma wymieni pojazd albo zmieni się jego wyposażenie.
- Numer rejestracyjny - wiąże dokumenty pobrania i zrzutu z konkretnym wozem.
- Pojemność zbiornika - wyznacza górną granicę ilości w jednym kursie.
- Przedsiębiorstwo - wskazuje firmę, której zezwolenie obejmuje kursy tego pojazdu.
- Uwagi eksploatacyjne - opis stanu technicznego albo wyposażenia istotny przy kontroli.
Jeden pojazd, jeden numer rejestracyjny
Numer rejestracyjny wpisany raz jako „WGM 12345”, a raz jako „wgm12345” tworzy w kartotece dwa pojazdy. Kursy rozkładają się wtedy na dwa rekordy, a kontrola pojemności przestaje działać, bo żaden z nich nie pokazuje pełnej ilości. Poniższy schemat w T-SQL ilustruje regułę, a nie kod źródłowy systemu.
ALTER TABLE dbo.Pojazd
ADD NrRejestracyjnyNorm AS UPPER(REPLACE(NrRejestracyjny, ' ', '')) PERSISTED;
CREATE UNIQUE INDEX UX_Pojazd_NrRejestracyjnyNorm
ON dbo.Pojazd (NrRejestracyjnyNorm);
Kolumna obliczana utrwalona przechowuje numer bez spacji i wielkimi literami, a indeks unikalny odrzuca drugi wpis tego samego pojazdu niezależnie od sposobu zapisu. Zasady definiowania takich kolumn opisuje dokumentacja kolumn obliczanych. Przejście pojazdu do innej firmy warto zapisywać jako nowy okres przypisania z datami, a nie nadpisaniem pola, bo dokumenty z poprzedniego okresu muszą nadal wskazywać poprzedniego przewoźnika.
Konta użytkowników po stronie przewoźnika
BioKontrol rozróżnia konta WMSAndroid, przypisane kierowcom i przedsiębiorcom korzystającym z aplikacji mobilnej, oraz konta BIO dla pracowników urzędu pracujących w przeglądarce. Konfiguracją zajmuje się konto Administrator. Każde konto jest przypisane do konkretnej gminy albo oddziału, co oddziela dostęp firm asenizacyjnych od uprawnień urzędników.
Aplikacja mobilna StudioSystem Pro wymaga stałego połączenia z Internetem. Kierowca loguje się adresem serwera oraz danymi swojego konta, a pojazd przypisuje sobie skanem jego kodu QR. Szczegóły opisują artykuły o aplikacji mobilnej BioKontrol oraz o zakładaniu i zarządzaniu kontami użytkowników.
Zezwolenie na opróżnianie zbiorników i transport nieczystości
Działalność w zakresie opróżniania zbiorników bezodpływowych lub osadników przydomowych oczyszczalni i transportu nieczystości ciekłych wymaga zezwolenia (art. 7 ust. 1 pkt 2). Udziela go w drodze decyzji organ wykonawczy gminy właściwej ze względu na miejsce świadczenia usług (art. 7 ust. 6).
| Element | Podstawa w ustawie |
|---|---|
| Wniosek z NIP oraz opisem środków technicznych | art. 8 ust. 1 |
| Zaświadczenie albo oświadczenie o braku zaległości podatkowych i składkowych | art. 8 ust. 1a |
| Wymagania wobec przedsiębiorcy, w tym wyposażenie techniczne, określone uchwałą rady gminy | art. 7 ust. 3a |
| Wskazanie w zezwoleniu stacji zlewnych, do których trafią nieczystości | art. 9 ust. 1aa |
| Czas oznaczony, nie dłuższy niż 10 lat | art. 9 ust. 1b |
| Elektroniczna ewidencja udzielonych i cofniętych zezwoleń | art. 7 ust. 6b |
Stan zezwolenia trzeba oceniać na dzień wywozu, a nie na dzień kontroli. Dokument pobrania sprzed roku jest poprawny, jeżeli zezwolenie obowiązywało w dniu odbioru, nawet gdy później wygasło albo zostało cofnięte. Taką kontrolę przy rejestracji pobrania opisuje artykuł o nowym pobraniu ścieków.
Monitoring pojazdów asenizacyjnych bez nadajnika w wozie
Monitoring pojazdów asenizacyjnych w BioKontrol nie wymaga nadajnika w wozie ani integracji z systemem telematycznym przewoźnika. Opiera się na dokumentach pobrania i zrzutu, które kierowca zatwierdza w aplikacji mobilnej, oraz na współrzędnych GPS zapisanych w chwili zatwierdzenia. Z tych zapisów system odtwarza kursy pojazdu i porównuje je z danymi z kartoteki.
Kartoteka pojazdów jest więc punktem odniesienia dla wszystkich kontroli. Pojemność zapisana przy numerze rejestracyjnym decyduje, czy kurs z czterema pobraniami jest wiarygodny, a przypisanie pojazdu do firmy - czy kurs wykonał przewoźnik posiadający zezwolenie gminy. Wartość dowodową samych współrzędnych omawia artykuł o GPS jako dowodzie wywozu nieczystości.
Stan zbiornika pojazdu
Funkcja „Stan dla pojazdu” w aplikacji mobilnej pokazuje bieżącą ilość nieczystości w zbiorniku wozu. Przy zrzucie system uzupełnia tę ilość w dokumencie, więc kierowca nie przepisuje jej ręcznie z wydruków.
Stanu zbiornika nie trzeba przechowywać w osobnej kolumnie aktualizowanej przy każdym dokumencie. Wynika z sumy pobrań zatwierdzonych po ostatnim zrzucie, a wartość wyliczana z dokumentów nie rozjedzie się z nimi po korekcie albo usunięciu dokumentu z bufora.
Zrzut tylko po udokumentowanym pobraniu
Aplikacja blokuje zrzut, dopóki dla pojazdu pozostaje niezatwierdzony dokument pobrania, a także wtedy, gdy pojazd nie ma żadnego zatwierdzonego pobrania od ostatniego zrzutu. Kierowca dostaje komunikat błędu i nie może kontynuować zgłoszenia, więc w rejestrze nie powstaje zrzut niepowiązany z odbiorem z nieruchomości.
Taka reguła wymaga szeregowania operacji dla jednego pojazdu. Dwa równoległe żądania, na przykład po podwójnym dotknięciu przycisku przy słabym zasięgu, mogą jednocześnie odczytać ten sam stan i oba go zużyć. Blokada aplikacyjna na nazwie pojazdu zamyka tę lukę bez blokowania innych wozów.
SET XACT_ABORT ON;
BEGIN TRANSACTION;
DECLARE @Wynik int;
DECLARE @Zasob nvarchar(255) = CONCAT(N'pojazd:', @PojazdId);
EXEC @Wynik = sp_getapplock @Resource = @Zasob, @LockMode = 'Exclusive',
@LockOwner = 'Transaction', @LockTimeout = 5000;
IF @Wynik < 0
THROW 50040, N'Inna operacja dla tego pojazdu jest w toku.', 1;
IF EXISTS (SELECT 1 FROM dbo.DokumentPobrania
WHERE PojazdId = @PojazdId AND Status = 'B')
THROW 50042, N'Pojazd ma niezatwierdzone dokumenty pobrania.', 1;
DECLARE @Stan decimal(10, 2) = (
SELECT SUM(p.Objetosc)
FROM dbo.DokumentPobrania AS p
WHERE p.PojazdId = @PojazdId
AND p.Status = 'Z'
AND p.DataPobraniaUtc > COALESCE((SELECT MAX(z.DataZrzutuUtc)
FROM dbo.DokumentZrzutu AS z
WHERE z.PojazdId = @PojazdId
AND z.Status IN ('B', 'Z')), '19000101'));
IF @Stan IS NULL
THROW 50041, N'Brak zatwierdzonych pobrań od ostatniego zrzutu.', 1;
INSERT dbo.DokumentZrzutu (PojazdId, PunktZlewnyId, Objetosc, DataZrzutuUtc, Status)
VALUES (@PojazdId, @PunktZlewnyId, @Stan, SYSUTCDATETIME(), 'B');
COMMIT;
Blokada z właścicielem Transaction zwalnia się sama przy COMMIT albo wycofaniu transakcji. Wynik ujemny procedury oznacza, że blokady nie przyznano, na przykład po przekroczeniu czasu oczekiwania. Ustawienie SET XACT_ABORT ON wycofuje transakcję przy każdym błędzie, także po THROW, więc blokada nie zostaje na połączeniu, które wraca do puli połączeń aplikacji w C#. Ostatni zrzut liczy się także wtedy, gdy czeka w buforze, bo inaczej drugi zrzut zużyłby te same pobrania. Działanie procedury opisuje dokumentacja sp_getapplock, a ochronę przed zdublowanym dokumentem kluczem idempotencji - artykuł o funkcji nowy zrzut.
Pojemność jako punkt kontrolny
Pojemność z kartoteki pozwala sprawdzić wiarygodność ilości w dokumentach. Wóz ze zbiornikiem 8 m³, który w jednym kursie zgłasza większą ilość, generuje sygnał do wyjaśnienia. Rozbieżność oznacza błąd w dokumencie albo pominięty zrzut po drodze.
| Sytuacja | Interpretacja |
|---|---|
| suma pobrań w kursie większa od pojemności | brak dokumentu zrzutu między pobraniami albo błędna ilość |
| ilość w zrzucie większa od pojemności | błąd w dokumencie zrzutu albo inny pojazd niż w kartotece |
| pobranie bez późniejszego zrzutu | nieczystości nie trafiły do stacji zlewnej zapisanej w dokumentach |
| zrzut w stacji spoza zezwolenia | naruszenie warunków zezwolenia (art. 9 ust. 1aa) |
Mapę z kolejnością punktów odwiedzonych przez pojazd przedstawia materiał o podpisie i przebiegu trasy w dokumentach zrzutu.
Sprawozdanie kwartalne przewoźnika
Przewoźnik sporządza sprawozdania kwartalne i przekazuje je wójtowi do końca miesiąca następującego po kwartale (art. 9o ust. 1 i 2). Treść sprawozdania określa art. 9o ust. 3. Najważniejsze dla weryfikacji są cztery pozycje:
- Ilość odebrana - nieczystości bytowe oraz przemysłowe odebrane z obszaru gminy (pkt 3).
- Ilość przekazana - nieczystości oddane do stacji zlewnych, z nazwą i adresem stacji (pkt 4).
- Wyjaśnienie różnicy - uzasadnienie rozbieżności między ilością odebraną a przekazaną (pkt 5).
- Wykaz adresów - liczba właścicieli nieruchomości wraz z adresami (pkt 6).
Dokumenty pobrania i zrzutu w BioKontrol zawierają dane do sprawdzenia każdej z tych pozycji. Obieg dokumentów zrzutu, w tym bilans ilości odebranych i przekazanych, opisuje materiał o kontroli i ewidencji zrzutów nieczystości.
Termin sprawozdania w T-SQL
Termin wypada w ostatnim dniu miesiąca po kwartale. Funkcja EOMONTH z przesunięciem o jeden miesiąc wyznacza go bez tabeli kalendarza: dla pierwszego kwartału EOMONTH(DATEFROMPARTS(2026, 3, 1), 1) zwraca 30 kwietnia 2026 r. Poniższy schemat w T-SQL ilustruje regułę, a nie kod źródłowy systemu.
WITH Oczekiwane AS (
SELECT p.Id AS PrzedsiebiorstwoId,
k.Rok,
k.Kwartal,
EOMONTH(DATEFROMPARTS(k.Rok, k.Kwartal * 3, 1), 1) AS Termin
FROM dbo.Przedsiebiorstwo AS p
JOIN dbo.KwartalSprawozdawczy AS k
ON k.PoczatekKwartalu >= p.ZezwolenieOd
AND k.PoczatekKwartalu < COALESCE(p.ZezwolenieDo, '9999-12-31')
)
SELECT o.PrzedsiebiorstwoId, o.Rok, o.Kwartal, o.Termin, s.DataPrzekazania,
DATEDIFF(day, o.Termin,
COALESCE(s.DataPrzekazania, CAST(SYSDATETIME() AS date))) AS DniPoTerminie
FROM Oczekiwane AS o
LEFT JOIN dbo.SprawozdanieKwartalne AS s
ON s.PrzedsiebiorstwoId = o.PrzedsiebiorstwoId
AND s.Rok = o.Rok
AND s.Kwartal = o.Kwartal
WHERE o.Termin < CAST(SYSDATETIME() AS date)
AND (s.DataPrzekazania IS NULL OR s.DataPrzekazania > o.Termin);
Złączenie z kwartałami ogranicza się do okresu ważności zezwolenia, bo przewoźnik, który zaczął działać w lipcu, nie zalega ze sprawozdaniem za pierwszy kwartał. Złączenie zewnętrzne ze sprawozdaniami zachowuje kwartały bez żadnego sprawozdania, które są najważniejszym wynikiem zestawienia. Działanie funkcji opisuje dokumentacja EOMONTH.
Postępowanie wobec spóźnionego albo nierzetelnego sprawozdania
| Sytuacja | Konsekwencja | Przepis |
|---|---|---|
| sprawozdanie przekazane po terminie | kara 300 zł za każdy dzień, nie więcej niż za 90 dni | art. 9xb ust. 1 pkt 2 |
| brak sprawozdania 90 dni po terminie | wezwanie do przekazania w ciągu 7 dni, a po bezskutecznym wezwaniu cofnięcie zezwolenia bez odszkodowania | art. 9 ust. 2 |
| sprawozdanie nierzetelne | wezwanie do uzupełnienia albo poprawienia w ciągu 14 dni | art. 9p ust. 2 |
| nierzetelność poprawiona albo niepoprawiona | kara od 200 zł do 500 zł albo od 500 zł do 5000 zł | art. 9xb ust. 1 pkt 1 |
Przy weryfikacji danych wójt może zobowiązać przewoźnika do okazania dokumentacji, na podstawie której sporządzono sprawozdanie (art. 9p ust. 1). Rejestr dokumentów w BioKontrol można filtrować według zakresu dat albo nazwy firmy i wyeksportować do pliku, co daje materiał do porównania z tą dokumentacją.
Terminowość wywozów i raporty o przedsiębiorstwach
Moduł Zestawienia generuje zestawienie opóźnienia zrzutu w podziale na przedsiębiorstwa oraz zestawienie przekroczonych terminów wywozu. Urzędnik widzi, którzy przewoźnicy systematycznie oddają nieczystości z opóźnieniem, zanim sprawa trafi do postępowania. Sposób liczenia opóźnienia opisuje artykuł o rejestrach pobrania nieczystości.
Moduł Raporty generuje raport z przewozu przedsiębiorcy, który pokazuje zrealizowane ilości oraz uchybienia, w tym braki zrzutów. Zestawienia można filtrować według daty, firmy, pojazdu albo adresu nieruchomości i eksportować do pliku, więc firmy wymagające interwencji widać bez ręcznego przeglądania dokumentów.
Przewoźnik dostarczający nieczystości do oczyszczalni niespełniającej wymagań przewidzianych dla aglomeracji, z której pochodzą, podlega karze od 1000 zł do 10 000 zł za każde dostarczenie (art. 9xb ust. 1 pkt 3). Dokument zrzutu z nazwą stacji jest w takim postępowaniu podstawowym dowodem. Pełny opis systemu zawiera strona BioKontrol, a użytkownicy logują się do niego pod adresem biokontrol.audit-grc.pl.
Pytania i odpowiedzi
Czym różni się kartoteka Przewoźnicy od kartoteki Przedsiębiorstwa?
Kartoteka Przedsiębiorstwa opisuje firmę asenizacyjną wraz z cennikiem usług, czyli stawką za metr sześcienny ścieków bytowych oraz stawką za nieczystości z przydomowych oczyszczalni. Kartoteka Przewoźnicy dotyczy kierowcy i pojazdu, które wykonują usługę w imieniu tej firmy.
Czy urzędnik może sprawdzić trasę konkretnego pojazdu?
Tak. W module Dokumenty Zrzutów funkcja „Przebieg trasy” pokazuje na mapie kolejność punktów odwiedzonych przez pojazd. Mapa powstaje ze współrzędnych zapisanych przy zatwierdzaniu dokumentów, a nie z ciągłego nadajnika w pojeździe.
Czy kierowca może zarejestrować zrzut bez wcześniejszego pobrania?
Nie. Zrzut wymaga zatwierdzonych dokumentów pobrania, a aplikacja blokuje go także wtedy, gdy dla pojazdu pozostał dokument pobrania czekający na zatwierdzenie. Kierowca otrzymuje wtedy komunikat błędu i nie może kontynuować zgłoszenia.
Czy aplikacja kierowcy działa bez dostępu do Internetu?
Nie. Aplikacja StudioSystem Pro wymaga stałego połączenia z Internetem, bo każde zgłoszenie pobrania albo zrzutu wraz ze współrzędnymi GPS trafia od razu do centralnego rejestru gminy. Kierowca loguje się adresem serwera oraz danymi dostępowymi swojego konta.
Do kiedy przewoźnik składa sprawozdanie kwartalne?
Do końca miesiąca następującego po kwartale, którego dotyczy (art. 9o ust. 2 ustawy o utrzymaniu czystości i porządku w gminach). Sprawozdanie za pierwszy kwartał trzeba więc przekazać wójtowi do 30 kwietnia, a za czwarty kwartał do 31 stycznia następnego roku.
Co grozi przewoźnikowi za spóźnione sprawozdanie?
Kara pieniężna 300 zł za każdy dzień opóźnienia, nie więcej niż za 90 dni (art. 9xb ust. 1 pkt 2). Jeżeli sprawozdanie nie wpłynie w ciągu 90 dni od terminu, organ wzywa przewoźnika do jego przekazania w ciągu 7 dni, a po bezskutecznym wezwaniu cofa zezwolenie bez odszkodowania (art. 9 ust. 2).
Słownik pojęć
- Przewoźnik
- W kartotece BioKontrol para kierowca i pojazd przypisana do przedsiębiorstwa asenizacyjnego. Dane przewoźnika trafiają do dokumentów pobrania i zrzutu.
- Wóz asenizacyjny
- Pojazd ze zbiornikiem i pompą, którym przewoźnik odbiera nieczystości ciekłe ze zbiorników bezodpływowych lub osadników i przewozi je do stacji zlewnej. Pojemność jego zbiornika jest zapisana w kartotece pojazdów.
- Zezwolenie na opróżnianie zbiorników
- Decyzja organu wykonawczego gminy wymagana od przedsiębiorcy opróżniającego zbiorniki bezodpływowe lub osadniki i transportującego nieczystości ciekłe (art. 7 ust. 1 pkt 2 i ust. 6 ustawy o utrzymaniu czystości i porządku w gminach).
- Stan dla pojazdu
- Funkcja aplikacji mobilnej BioKontrol pokazująca bieżącą ilość nieczystości w zbiorniku pojazdu, czyli sumę pobrań zarejestrowanych od ostatniego zrzutu.
- Sprawozdanie kwartalne przewoźnika
- Dokument z art. 9o ustawy, w którym przewoźnik podaje ilości nieczystości odebranych z gminy oraz przekazanych do stacji zlewnych, a także wykaz adresów nieruchomości.
- Raport z przewozu przedsiębiorcy
- Raport BioKontrol dla jednej firmy asenizacyjnej, pokazujący zrealizowane ilości oraz uchybienia, w tym braki zrzutów po pobraniach.
- Migawka danych w dokumencie
- Kopia wartości z kartoteki zapisana w dokumencie w chwili jego utworzenia, na przykład numer rejestracyjny pojazdu. Późniejsza zmiana kartoteki nie zmienia wtedy treści dokumentu archiwalnego.
- Kolumna obliczana utrwalona
- Kolumna SQL Server, której wartość baza wylicza z innych kolumn i zapisuje fizycznie. Może być kluczem indeksu, na przykład unikalnego indeksu na znormalizowanym numerze rejestracyjnym.
- Blokada aplikacyjna
- Blokada nakładana procedurą sp_getapplock na nazwany zasób, a nie na wiersz tabeli. Pozwala szeregować operacje dotyczące jednego pojazdu bez blokowania pracy pozostałych pojazdów.
- EOMONTH
- Funkcja T-SQL zwracająca ostatni dzień miesiąca dla podanej daty, z opcjonalnym przesunięciem o wskazaną liczbę miesięcy.