Model danych i znaczniki zapisów modułu Dozór celny - dla wdrożeniowców
Moduł Dozór celny przechowuje dane w dziewięciu tabelach z przedrostkiem x_cel_ i jednym widoku. Strona opisuje kolumny, klucze, indeksy unikalne oraz wartości kodowe, które wdrożeniowiec spotka w zapytaniach diagnostycznych. Ruchy magazynowe nie mają własnych tabel: PZC i WZC zapisują zwykłe wiersze dokumentów magazynowych. Warstwy modułu opisuje strona architektura i włączenie.
Na tej stronie
- Przegląd tabel i relacji
- Tabela x_cel_agencja
- Tabela x_cel_kontener
- Tabela x_cel_magazyn
- Tabela x_cel_dokument
- Tabela x_cel_dokument_poz
- Tabela x_cel_partia
- Tabela x_cel_status_hist
- Tabela x_cel_import
- Tabela x_cel_pzc
- Widok wms_cel_partie
- Znaczniki i kody
- Klucz partii i indeksy unikalne
- Numeracja dokumentów i numer palety
- Kasowanie logiczne
- Funkcje
- Zapytania diagnostyczne
- Najczęstsze pytania
- Słownik pojęć
Przegląd tabel i relacji
Centralną tabelą jest x_cel_partia: jeden wiersz to jedna partia towaru pod ewidencją celną razem z jej statusem. Partia należy do dokumentu celnego (x_cel_dokument), a ten ma pozycje zgłoszenia (x_cel_dokument_poz). Każda zmiana statusu zostawia ślad w x_cel_status_hist, a komunikaty od agencji trafiają do x_cel_import. Tabela x_cel_pzc wiąże dokument magazynowy PZC z dokumentem celnym i kontenerem. Trzy kartoteki pomocnicze to agencje (x_cel_agencja), kontenery (x_cel_kontener) i magazyny (x_cel_magazyn).
Wszystkie tabele leżą w schemacie dbo, a opisy tabel są zapisane jako właściwość MS_Description. Ich odczyt umożliwia sprawdzenie przeznaczenia tabeli bez zaglądania do dokumentacji.
SELECT o.name AS tabela, CAST(ep.value AS nvarchar(400)) AS opis
FROM sys.objects o
LEFT JOIN sys.extended_properties ep
ON ep.major_id = o.object_id AND ep.minor_id = 0 AND ep.name = 'MS_Description'
WHERE o.type = 'U' AND o.name LIKE 'x[_]cel[_]%'
ORDER BY o.name;
Tabela x_cel_agencja
Kartoteka agencji celnych, czyli przedstawicieli, którzy składają zgłoszenia za klienta i przysyłają komunikaty. Agencji nie można usunąć na ekranie.
| Kolumna | Typ | Znaczenie | Wartości |
|---|---|---|---|
| ID | int, identity | Klucz główny. | |
| ACH | varchar(1) | Znacznik aktywności. | 1 aktywna, X usunięta |
| NAZWA | nvarchar(200) | Nazwa agencji. | |
| NIP | varchar(15) | NIP, 10 cyfr na ekranie; po nim komunikat wskazuje agencję (pole agencjaNip). | |
| varchar(200) | Adres do komunikatów. | ||
| SPOSOB | varchar(10) | Sposób wymiany. | API, FTPS, RECZNIE (domyślnie) |
| KLUCZ_API | varchar(64) | Identyfikator klucza API, nie sam sekret. | |
| ROLASYS, LOGIN, KIEDY | varchar(3), varchar(50), datetime | Znaczniki zapisu. | ROLASYS równe WMS |
Tabela x_cel_kontener
Kartoteka kontenerów. Numer jest unikalny wśród wierszy aktywnych, więc ten sam kontener nie wystąpi w kartotece dwa razy.
| Kolumna | Typ | Znaczenie | Wartości |
|---|---|---|---|
| ID | int, identity | Klucz główny. | |
| ACH | varchar(1) | Znacznik aktywności. | 1, X |
| NUMER | varchar(11) | Numer ISO 6346 z cyfrą kontrolną; unikalny indeks UQ_x_cel_kontener_NUMER dla ACH równego 1. | |
| ROZMIAR | varchar(3) | Rozmiar w stopach. | 20, 40 |
| ARMATOR | nvarchar(100) | Armator. | |
| DATA_WJAZDU, DATA_ZWROTU | date | Data wjazdu i data zwrotu pustego kontenera. | |
| MAGAZYN, LOGIN, KIEDY | varchar(20), varchar(50), datetime | Magazyn i znaczniki zapisu. |
Tabela x_cel_magazyn
Ustawienia magazynu, kluczem jest kod magazynu. Magazyn bez wiersza w tej tabeli jest traktowany jak krajowy z limitem 90 dni.
| Kolumna | Typ | Znaczenie | Wartości |
|---|---|---|---|
| MAGAZYN | varchar(20) | Klucz główny, kod magazynu ze skorowidza MAG. | |
| TYP | varchar(4) | Typ magazynu. | SC skład celny, MCS magazyn czasowego składowania, KRAJ (domyślnie) |
| NR_ZEZWOLENIA | varchar(50) | Numer zezwolenia. | |
| LIMIT_DNI | int | Limit dni dozoru; termin dozoru partii to data przyjęcia powiększona o ten limit. | 1-3650, domyślnie 90 |
| LOGIN, KIEDY | varchar(50), datetime | Znaczniki zapisu. |
Tabela x_cel_dokument
Dokument celny jednego z trzech typów (T1, DSK, MRN). Unikalny indeks UQ_x_cel_dokument_TYP_NUMER obejmuje typ i numer dokumentu oraz klienta, tylko dla wierszy aktywnych, więc dokument o tym samym numerze może istnieć u dwóch różnych klientów.
| Kolumna | Typ | Znaczenie | Wartości |
|---|---|---|---|
| ID | int, identity | Klucz główny. | |
| ACH | varchar(1) | Znacznik aktywności; usunięcie dokumentu ustawia X. | 1, X |
| TYP | varchar(4) | Rodzaj dokumentu. | T1, DSK, MRN |
| NUMER | varchar(40) | Numer dokumentu; dla T1 i MRN dokładnie 18 znaków. | |
| NRIDODN | bigint | Klient, czyli kontrahent z tabeli knkon. | |
| ID_AGENCJI | int | Agencja z x_cel_agencja. | |
| KOD_PROCEDURY | varchar(2) | Kod procedury celnej ze skorowidza CPR. | 71, 40, 42, 51, 53 |
| DATA_PRZYJECIA, DATA_ZWOLNIENIA | date | Data przyjęcia dokumentu i data zwolnienia z komunikatu. | |
| STATUS | tinyint | Status zapisany na dokumencie. | 1 pod dozorem, 2 zgłoszony, 3 zwolniony |
| NR_KONTENERA | varchar(11) | Kontener dokumentu. | |
| MAGAZYN, ODDZIAL | varchar(20) | Magazyn i oddział. | |
| ROLASYS | varchar(3) | Rola systemowa. | WMS |
| PLIK, UWAGI, LOGIN, KIEDY | nvarchar, datetime | Nazwa pliku, uwagi (500 znaków) i znaczniki zapisu. |
Tabela x_cel_dokument_poz
Pozycje zgłoszenia dokumentu celnego. To na nich opiera się saldo dokumentu i kontrola rozbieżności w raportach.
| Kolumna | Typ | Znaczenie | Wartości |
|---|---|---|---|
| ID, ID_DOK | int | Klucz główny i dokument nadrzędny. | |
| ACH | varchar(1) | Znacznik aktywności; usunięcie pozycji ustawia X. | 1, X |
| LP | int | Numer pozycji. | |
| NRIDASN | bigint | Indeks z kartoteki asortymentu klienta (tabela knaso). | |
| OPIS, JM | nvarchar(200), varchar(10) | Opis towaru i jednostka miary. | |
| ILOSC | decimal(15,3) | Ilość zgłoszona. | większa od 0 |
| MASA_BRUTTO, WARTOSC | decimal(15,3), decimal(15,2) | Masa brutto w kg i wartość. |
Tabela x_cel_partia
Partia pod ewidencją celną. Wiersz powstaje przy zatwierdzeniu PZC, a jego pola statusu (STATUS, STATUS_PRZED) oraz powodu blokady zmieniają procedury modułu.
| Kolumna | Typ | Znaczenie | Wartości |
|---|---|---|---|
| ID, ID_DOK | int | Klucz główny i dokument celny. | |
| ACH | varchar(1) | Znacznik aktywności. | 1, X |
| NRIDODN, NRIDASN | bigint | Klient i indeks asortymentu. | |
| NRSERII | varchar(20) | Numer partii, ten sam co w ruchach magazynowych. | |
| MAGAZYN, ODDZIAL | varchar(20) | Magazyn i oddział. | |
| NR_KONTENERA | varchar(11) | Kontener partii. | |
| STATUS | tinyint | Status celny. | 1 pod dozorem, 2 zgłoszony, 3 zwolniony, 4 unijny, 5 zablokowany |
| STATUS_PRZED | tinyint | Status sprzed blokady; do niego wraca zdjęcie blokady. | puste poza statusem 5 |
| POWOD_BLOKADY | nvarchar(500) | Treść powodu blokady. | |
| POCZATEK_DOZORU, TERMIN_DOZORU | date | Początek dozoru i jego termin. | |
| ILOSC_PRZYJETA | decimal(15,3) | Ilość przyjęta na PZC. | |
| REFNO_PZC | bigint | REFNO dokumentu PZC. | |
| ODPOWIEDZIALNY, LOGIN, KIEDY | varchar(50), datetime | Osoba odpowiedzialna i znaczniki zapisu. | |
| STAMP | rowversion | Wersja wiersza. |
Tabela x_cel_status_hist
Historia zmian statusu partii. Tabela nie ma znacznika ACH, bo wpisy nie są kasowane.
| Kolumna | Typ | Znaczenie | Wartości |
|---|---|---|---|
| ID, ID_PARTII | int | Klucz główny i partia (indeks IX_x_cel_status_hist_PARTIA po partii i czasie). | |
| STATUS_PRZED, STATUS_PO | tinyint | Status przed zmianą (puste przy przyjęciu) i po niej. | 1-5 |
| ZRODLO | varchar(10) | Skąd pochodzi zmiana. | PZC, IMPORT, RECZNIE, SYSTEM |
| UZASADNIENIE | nvarchar(500) | Opis zmiany. | |
| ID_IMPORT | int | Komunikat, który wywołał zmianę. | tylko przy IMPORT |
| LOGIN, KIEDY | varchar(50), datetime | Kto i kiedy. |
Tabela x_cel_import
Kolejka komunikatów od agencji. Unikalny indeks UQ_x_cel_import_HASH na kolumnie HASH_TRESCI nie dopuszcza dwóch komunikatów o identycznej treści. Szczegóły przetwarzania opisuje strona komunikaty agencji.
| Kolumna | Typ | Znaczenie | Wartości |
|---|---|---|---|
| ID | int, identity | Klucz główny. | |
| KANAL | varchar(5) | Kanał odbioru. | API, FTPS, PLIK |
| ID_AGENCJI | int | Agencja, jeśli rozpoznana. | |
| TYP_KOMUNIKATU, TYP_DOKUMENTU, NUMER | varchar | Pola odczytane z treści: rodzaj komunikatu, typ dokumentu i numer. | ZGLOSZENIE, ZWOLNIENIE; T1, DSK, MRN |
| TRESC | nvarchar(max) | Treść komunikatu (JSON). | |
| HASH_TRESCI | varbinary(32) | SHA-256 treści. | |
| STATUS_PRZETW | tinyint | Wynik przetwarzania. | 0 oczekuje, 1 przetworzony, 2 błąd, 3 częściowy |
| BLAD | nvarchar(1000) | Treść błędu albo uwagi przy wyniku częściowym. | |
| ID_DOK, MAGAZYN | int, varchar(20) | Dokument celny i magazyn. | |
| DATA_ODBIORU, DATA_PRZETW, LOGIN | datetime, varchar(50) | Czas odbioru, czas przetworzenia i login. |
Tabela x_cel_pzc
Powiązanie dokumentu magazynowego PZC z dokumentem celnym i kontenerem. Wiersz powstaje już w buforze, a przy zatwierdzeniu procedura zapisu PZC aktualizuje go o dokument celny i kontener podane w zapytaniu.
| Kolumna | Typ | Znaczenie | Wartości |
|---|---|---|---|
| REFNO | bigint | Klucz główny: numer referencyjny dokumentu PZC w ruchach magazynowych. | |
| ID_DOK | int | Dokument celny. | |
| NR_KONTENERA | varchar(11) | Kontener przyjęcia. | |
| LOGIN, KIEDY | varchar(50), datetime | Znaczniki zapisu. |
Widok wms_cel_partie
Widok łączy partie aktywne z bieżącym stanem policzonym z ruchów magazynowych. Zwraca wszystkie kolumny partii oraz trzy kolumny wyliczane (STAN, WYDANO, DNI_DO_KONCA). Stan to suma ilości zatwierdzonych ruchów (ACH równe 1, ROLASYS równe WMS) po kluczu partii (magazyn, klient, indeks, numer partii). Przesunięcia ZL dają zero netto, więc nie zmieniają stanu. Pole WYDANO to ILOSC_PRZYJETA pomniejszona o STAN, ale nie mniej niż zero. Pole DNI_DO_KONCA to liczba dni od dziś do TERMIN_DOZORU i bywa ujemne po terminie.
DECLARE @MAG varchar(20) = 'KOD_MAGAZYNU';
SELECT v.ID, v.NRSERII, v.STATUS, dbo.sf_cel_status(v.STATUS) AS STATUS_OPIS,
dbo.sf_cel_dok(d.TYP, d.NUMER) AS DOKUMENT, v.NR_KONTENERA,
v.TERMIN_DOZORU, v.DNI_DO_KONCA, v.ILOSC_PRZYJETA, v.STAN, v.WYDANO
FROM dbo.wms_cel_partie v
JOIN dbo.x_cel_dokument d ON d.ID = v.ID_DOK
WHERE v.MAGAZYN = @MAG
ORDER BY v.STATUS, v.TERMIN_DOZORU, v.NRSERII;
Znaczniki i kody
Poniższa tabela zbiera wartości kodowe, które występują w tabelach modułu, a także w ruchach magazynowych i skorowidzach.
| Pole lub znacznik | Wartości | Znaczenie |
|---|---|---|
| ACH w tabelach modułu | 1, X | 1 wiersz aktywny, X wiersz usunięty logicznie. |
| ACH w ruchach magazynowych | 1, 0, X | 1 aktywny (zatwierdzony), 0 bufor, X usunięty; kontrola wydania obejmuje ACH równe 0 i 1. |
| ROLASYS | WMS | Rola systemowa wierszy modułu i ruchów branych do stanu. |
| PRX i TYPDOK dokumentu przyjęcia | PZ i PZC | Dokument PZC w ruchach magazynowych. |
| PRX i TYPDOK dokumentu wydania | WZ i WZC | Dokument WZC; ilości pozycji są ujemne. |
| STATUS partii | 1-5 | Pod dozorem, Zgłoszony, Zwolniony, Unijny, Zablokowany. |
| STATUS dokumentu celnego | 1-3 | Pod dozorem, zgłoszony, zwolniony; na ekranie status dokumentu bywa wyliczany z partii. |
| STATUS_PRZETW | 0-3 | Oczekuje, Przetworzony, Błąd, Częściowy. |
| ZRODLO w historii | PZC, IMPORT, RECZNIE, SYSTEM | Przyjęcie, komunikat agencji, ręczna zmiana statusu, automatyczna blokada po terminie. |
| KANAL | API, FTPS, PLIK | Kanał odbioru komunikatu. |
| TYP dokumentu celnego | T1, DSK, MRN | Rodzaj dokumentu. |
| TYP magazynu | SC, MCS, KRAJ | Skład celny, magazyn czasowego składowania, magazyn krajowy. |
| SPOSOB agencji | API, FTPS, RECZNIE | Sposób wymiany komunikatów. |
| Kody procedur w skorowidzu CPR | 71, 40, 42, 51, 53 | Składowanie w składzie celnym, dopuszczenie do obrotu, dopuszczenie z dostawą wewnątrzwspólnotową, uszlachetnianie czynne, odprawa czasowa. |
| PRX skorowidzów | CPR, MAG, JQS21 | Procedury celne, magazyny, transakcje. |
| PRX menu | MBR, BAR | Wiersz sekcji i wiersz paska. |
Klucz partii i indeksy unikalne
Partię identyfikuje kombinacja czterech pól: magazyn, klient (NRIDODN), indeks asortymentu (NRIDASN) i numer partii (NRSERII, ten sam co w ruchach magazynowych). Unikalny indeks UQ_x_cel_partia_KLUCZ jest filtrowany po ACH równym 1, więc tej samej partii nie da się objąć ewidencją celną dwa razy. Próba przyjęcia na drugim PZC kończy się błędem 50205. Ten sam klucz łączy partię z ruchami magazynowymi, więc wiersz partii bez pasujących ruchów ma STAN równy 0.
Pozostałe indeksy mają charakter pomocniczy. Indeks IX_x_cel_partia_TERMIN obejmuje TERMIN_DOZORU i jest filtrowany po statusie niższym niż 3 albo równym 5 (pod dozorem, zgłoszony, zablokowany), co przyspiesza kokpit oraz raport terminów. Indeks IX_x_cel_partia_DOK i IX_x_cel_dokument_poz_DOK przyspieszają odczyt partii i pozycji dokumentu. Indeks IX_x_cel_import_OCZEKUJE wskazuje komunikaty ze statusem 0.
SELECT i.name, i.is_unique, i.filter_definition
FROM sys.indexes i
WHERE i.object_id IN (OBJECT_ID('dbo.x_cel_partia'), OBJECT_ID('dbo.x_cel_dokument'),
OBJECT_ID('dbo.x_cel_kontener'), OBJECT_ID('dbo.x_cel_import'))
AND i.name LIKE '%x[_]cel%'
ORDER BY i.name;
Numeracja dokumentów i numer palety
Numer dokumentu PZC albo WZC powstaje dopiero przy zatwierdzeniu, z licznika miesięcznego. Procedura dostaje typ rejestru wraz z typem dokumentu oraz maskę #RRRR-#MM-#XXXXX-#TYP z datą dokumentu, a wynik ma postać RRRR-MM-NNNNN-TYP, np. 2026-10-00001-PZC. Licznik liczy osobno dla każdego miesiąca i typu. Dokument w buforze nie ma jeszcze numeru z tego licznika.
Numer palety pochodzi z osobnego licznika ciągłego (parametry PR i PAL, maska #XXXXXXXXXXXXXXXXXX). Przycisk Nowy numer nośnika na ekranie PZC pobiera kolejną wartość z tego licznika.
Kasowanie logiczne
Moduł nie usuwa fizycznie wierszy kartotek i dokumentów. Usunięcie dokumentu celnego lub jego pozycji ustawia ACH równe X; zapytania i indeksy unikalne pomijają takie wiersze. Dzięki filtrowi w indeksie można ponownie dodać dokument o tym samym numerze po usunięciu poprzedniego. Usunięcie jest możliwe tylko wtedy, gdy dokument nie ma przyjętych partii (kody 50021 i 50022). Wpisy historii statusu i kolejki importu nie mają kasowania.
Funkcje
Cztery funkcje skalarne obsługują wyświetlanie i walidację.
- sf_cel_status - zamienia kod statusu 1-5 na nazwę: Pod dozorem, Zgłoszony, Zwolniony, Unijny, Zablokowany.
- sf_cel_dok - składa numer do wyświetlenia z typu i numeru, ale nie dubluje typu, gdy numer już się nim zaczyna (np. DSK/DEMO/0001/26).
- sf_cel_iso6346_cyfra - liczy cyfrę kontrolną ISO 6346 z pierwszych dziesięciu znaków; zwraca -1, gdy format jest zły.
- sf_cel_iso6346_ok - sprawdza cały numer kontenera po przycięciu spacji oraz zamianie na wielkie litery; zwraca 1 dla zgodnego numeru.
Cyfra kontrolna ISO 6346 powstaje tak: litery dostają wartości od A równego 10 z pominięciem wielokrotności 11, wartość każdego z dziesięciu znaków mnoży się przez 2 do potęgi równej pozycji minus jeden, sumę dzieli się z resztą przez 11, a resztę przez 10. Ekran kartoteki kontenerów opisuje strona agencje i kontenery.
Zapytania diagnostyczne
Zapytania poniżej tylko czytają dane. Pierwsze pokazuje historię jednej partii w kolejności zdarzeń, drugie wskazuje wiersze ruchów magazynowych dokumentów PZC i WZC.
DECLARE @MAG varchar(20) = 'KOD_MAGAZYNU', @PARTIA varchar(20) = 'NUMER_PARTII';
SELECT h.KIEDY, h.STATUS_PRZED, h.STATUS_PO, h.ZRODLO, h.UZASADNIENIE, h.LOGIN, h.ID_IMPORT
FROM dbo.x_cel_status_hist h
JOIN dbo.x_cel_partia p ON p.ID = h.ID_PARTII
WHERE p.MAGAZYN = @MAG AND p.NRSERII = @PARTIA
ORDER BY h.KIEDY, h.ID;
SELECT TOP (50) m.ID_DPMAG, m.REFNO, m.PRX, m.TYPDOK, m.ACH, m.NRSERII, m.ILOSC
FROM dbo.dpmag m
WHERE m.TYPDOK IN ('PZC', 'WZC')
ORDER BY m.ID_DPMAG DESC;
Najczęstsze pytania
Jak policzyć, ile partii ma dany status?
Zlicz wiersze x_cel_partia z ACH równym 1 po kolumnie STATUS, w ramach jednego magazynu. Kokpit pokazuje te same liczniki, a status 5 zawiera partie zablokowane ręcznie i po terminie.
Czym różni się ACH równe 0 od X w ruchach magazynowych?
ACH równe 0 oznacza bufor, czyli dokument jeszcze niezatwierdzony, a X oznacza wiersz usunięty. Do stanu partii wchodzą tylko ruchy z ACH równym 1.
Dlaczego dokument celny o tym samym numerze może być w rejestrze dwa razy?
Unikalność dotyczy trzech pól: typu, numeru i klienta, i tylko wierszy aktywnych. Ten sam numer u innego klienta albo po usunięciu poprzedniego dokumentu jest dopuszczalny.
Skąd się bierze pole Wydano?
Widok wms_cel_partie liczy je jako ilość przyjętą minus bieżący stan, z dolną granicą zero. Nie ma osobnej kolumny z zapisaną wartością.
Czy kolumna KLUCZ_API przechowuje sekret agencji?
Nie, tylko identyfikator klucza do 64 znaków. Wartości kluczy nie podaje się w dokumentacji ani w zapytaniach diagnostycznych.
Słownik pojęć
- ACH
- Znacznik aktywności wiersza: 1 aktywny, X usunięty logicznie, a w ruchach magazynowych także 0 dla bufora.
- Klucz partii
- Magazyn, klient, indeks asortymentu i numer partii razem; unikalny wśród wierszy aktywnych tabeli x_cel_partia.
- Hash treści
- Skrót SHA-256 treści komunikatu, zapisany z unikalnym indeksem, który blokuje duplikaty.
- Kasowanie logiczne
- Oznaczenie wiersza jako usuniętego bez fizycznego usuwania; zapytania pomijają takie wiersze.
- Stan partii
- Suma ilości zatwierdzonych ruchów magazynowych po kluczu partii; przesunięcia ZL dają zero netto.
- Licznik miesięczny
- Numerator dokumentów liczący od początku każdego miesiąca, z którego pochodzi numer w formacie RRRR-MM-NNNNN-TYP.