Awizo dostawy jako dokument, a nie proces
Awizo dostawy jest zawiadomieniem o nadchodzącej dostawie, które magazyn otrzymuje przed przyjazdem pojazdu. W systemie informatycznym to rekord z numerem i statusem, który ma właściciela oraz historię zmian. Awizacja jest procesem, w którym ten dokument powstaje i zostaje zrealizowany, więc oba pojęcia opisują różne warstwy tej samej sprawy.
Rozróżnienie ma skutki w projekcie bazy danych. Dokument wymaga stałych pól oraz kontrolowanych przejść statusów. Proces wymaga kalendarza i reguł zatwierdzania. Ten artykuł zajmuje się pierwszą warstwą, a planowanie dostaw do magazynu z oknami na rampach opisuje osobny tekst o awizacji dostawy.
| Dokument | Kto wystawia | Kiedy powstaje | Co zawiera |
|---|---|---|---|
| Awizo dostawy | dostawca lub przewoźnik | przed przyjazdem pojazdu | termin, pojazd, numer zamówienia |
| Awizo wysyłki ASN (DESADV) | dostawca jako nadawca | w chwili wysyłki towaru | pozycje z ilościami i numerami SSCC |
| List przewozowy CMR | przewoźnik | przy załadunku | nadawca, odbiorca, opis towaru |
| Dokument przyjęcia PZ | magazyn | po rozładunku | ilości faktycznie przyjęte |
Awizo dostawy odpowiada na pytanie o termin i pojazd. Awizo wysyłki ASN określa, co dokładnie jedzie w pojeździe. Dokument PZ zapisuje, co magazyn rzeczywiście przyjął. Każdy z nich ma innego autora, więc porównanie wszystkich trzech wykrywa rozbieżność ilościową jeszcze na etapie przyjęcia. Szczegóły o zawartości ładunku opisuje artykuł o awizacji ładunków i załadunków.

Pola nagłówka awizo dostawy
Nagłówek awizo zawiera dane wspólne dla całej dostawy. Kilka pól jest obowiązkowych, bo bez nich magazyn nie zaplanuje rampy ani nie rozpozna pojazdu przy bramie. Reszta jest opcjonalna i zależy od rodzaju towaru.
- Numer awizo - unikalny identyfikator nadawany przez system, według którego dostawca i magazyn odwołują się do dokumentu.
- Dostawca - odwołanie do kartoteki kontrahenta, dzięki któremu raporty dotyczą jednego identyfikatora zamiast trzech wariantów nazwy.
- Numer zamówienia - powiązanie z zamówieniem zakupu w ERP, z którego wynika cel wizyty.
- Termin - przedział od-do, w którym pojazd ma stanąć przy rampie, mieszczący się w godzinach pracy obiektu.
Do tych pól dochodzą dane pojazdu: numer rejestracyjny ciągnika i naczepy oraz telefon kierowcy. Numer rejestracyjny pełni rolę klucza, po którym brama dopasowuje przyjeżdżający pojazd do awizo. Jego format warto ujednolicić już przy wpisie, bo wersje ze spacjami i bez spacji tworzą w systemie dwa różne pojazdy.
CREATE SEQUENCE dbo.AvisoSeq AS INT START WITH 1 INCREMENT BY 1;
CREATE TABLE dbo.Aviso (
AvisoId INT NOT NULL
CONSTRAINT PK_Aviso PRIMARY KEY
CONSTRAINT DF_Aviso_Id DEFAULT (NEXT VALUE FOR dbo.AvisoSeq),
SupplierId INT NOT NULL,
OrderNo NVARCHAR(30) NOT NULL,
PlannedFrom DATETIME2(0) NOT NULL,
PlannedTo DATETIME2(0) NOT NULL,
VehiclePlate VARCHAR(12) NOT NULL,
PalletCount SMALLINT NOT NULL CONSTRAINT CK_Aviso_Pallets CHECK (PalletCount > 0),
Status CHAR(1) NOT NULL CONSTRAINT DF_Aviso_Status DEFAULT ('B'),
CONSTRAINT CK_Aviso_Window CHECK (PlannedTo > PlannedFrom)
);
Przykład ma charakter poglądowy, a nazwy tabel i kolumn są przykładowe. Sekwencja nadaje numery bez luk wynikających ze współbieżności i bez tabeli liczników, którą musiałby blokować każdy zapis. Ograniczenia CHECK przenoszą część walidacji do bazy, więc nawet import z pliku nie wprowadzi awizo z końcem okna przed początkiem. Składnię sekwencji opisuje dokumentacja CREATE SEQUENCE w Microsoft Learn.
Zasada: reguły, które mają obowiązywać zawsze, zapisuje się w bazie jako ograniczenia, a nie tylko w formularzu.
Sekwencja nie zaczyna numeracji od nowa co rok. Jeśli numer awizo ma zawierać rok, na przykład w postaci AW/2026/000123, część roczną składa się przy wyświetlaniu z daty utworzenia, a licznik zostaje ciągły. Roczne zerowanie wymaga osobnej tabeli liczników i blokady przy każdym zapisie.
Pozycje awizo i jednostki logistyczne
Poniżej nagłówka znajdują się pozycje, czyli opis towaru w dostawie. Nagłówek zostaje taki sam niezależnie od zawartości, a pozycje różnią się między dostawcami. Ich szczegółowość decyduje o tym, czy magazyn może kontrolować przyjęcie przez skanowanie, czy tylko przez liczenie palet.
| Pole pozycji | Po co magazynowi | Skutek braku |
|---|---|---|
| Indeks towaru | porównanie z zamówieniem i kartoteką | pozycja do ręcznego dopasowania |
| Ilość i jednostka miary | kontrola ilościowa przy przyjęciu | brak podstawy do reklamacji ilościowej |
| Numer partii i data ważności | zasada FEFO przy składowaniu i wydaniu | towar o krótkim terminie ląduje na dalszej lokalizacji |
| Numer SSCC jednostki | skanowanie palety przy rampie | kontrola przez liczenie zamiast skanowania |
Zasada FEFO oznacza, że towar o najkrótszym terminie ważności wychodzi z magazynu jako pierwszy. Termin ważności z awizo pozwala magazynowi zaplanować lokalizację zanim paleta zostanie zdjęta z naczepy.
Statusy awizo dostawy i przejścia
Status pokazuje, na jakim etapie jest dokument, i jest jedyną informacją, którą widzą wszystkie strony naraz. Zestaw statusów zależy od organizacji, ale typowy cykl składa się z kilku stałych kroków. Poniższa tabela ma charakter przykładu.
| Status | Kto ustawia | Znaczenie | Dozwolone przejście |
|---|---|---|---|
| Bufor | dostawca przy zapisie | szkic, który nie zajmuje okna | Zatwierdzone, Anulowane |
| Zatwierdzone | logistyka lub reguła automatyczna | termin i rampa zarezerwowane | Zrealizowane, Anulowane |
| Zrealizowane | brama lub magazyn | pojazd przyjechał i został rozładowany | Zamknięte |
| Zamknięte | magazyn po przyjęciu PZ | dokument rozliczony z ilościami | brak |
| Anulowane | dostawca lub logistyka | termin zwolniony dla innych dostaw | brak |
Przejścia można zakodować w kodzie aplikacji, ale wygodniej trzymać je w tabeli. Wtedy dopisanie nowego statusu polega na dodaniu wiersza, a nie na zmianie procedury. Procedura zmiany statusu łączy awizo z tabelą dozwolonych przejść i zgłasza błąd, gdy złączenie nic nie zwróci.
CREATE TABLE dbo.AvisoTransition (
FromStatus CHAR(1) NOT NULL,
ToStatus CHAR(1) NOT NULL,
PRIMARY KEY (FromStatus, ToStatus)
);
INSERT INTO dbo.AvisoTransition VALUES ('B','Z'), ('B','X'), ('Z','R'), ('Z','X'), ('R','K');
UPDATE a
SET a.Status = @NewStatus
FROM dbo.Aviso AS a
JOIN dbo.AvisoTransition AS t
ON t.FromStatus = a.Status AND t.ToStatus = @NewStatus
WHERE a.AvisoId = @AvisoId;
IF @@ROWCOUNT = 0
THROW 50001, N'Niedozwolone przejście statusu awizo.', 1;
Instrukcja THROW przerywa procedurę z komunikatem, który aplikacja pokazuje użytkownikowi, a jej składnię opisuje dokumentacja THROW w Microsoft Learn. Ten sam mechanizm blokuje zmianę statusu wstecz, na przykład z Zamkniętego na Zatwierdzone. Korekta zamkniętego dokumentu jest nowym zdarzeniem z własnym wpisem w historii.
Pełny model statusów awizacji od strony przewoźnika oraz zasady powiadomień i terminu granicznego opisuje artykuł awizacja transportu - statusy, zmiany, API.
Zmiany awizo po zatwierdzeniu
Nie każda zmiana zatwierdzonego awizo wymaga tej samej ścieżki. Zmiana kierowcy nie wpływa na rampę, a zmiana terminu wpływa na innych dostawców. System powinien rozróżniać zmiany, które przechodzą od razu, i takie, które wracają do zatwierdzenia.
| Zmiana | Ponowne zatwierdzenie | Powód |
|---|---|---|
| Kierowca lub telefon | nie | nie zmienia zajętości rampy |
| Numer rejestracyjny | nie, z wpisem w historii | pojazd zastępczy przy tym samym terminie |
| Liczba palet zwiększona | tak | może wydłużyć czas obsługi ponad okno |
| Termin w tym samym dniu | zależnie od reguły | zwalnia jedno okno i zajmuje drugie |
| Termin w innym dniu | tak | zmienia obciążenie ramp w obu dniach |
Przesunięcie terminu wykonuje się w jednej transakcji: anulowanie starego okna i rezerwacja nowego. Gdyby kroki wykonać osobno, w przerwie między nimi inny dostawca mógłby zająć zwolnione miejsce, a zmiana skończyłaby się utratą obu terminów.
Kto zgłasza awizo dostawy
Zgłaszającym może być dostawca lub przewoźnik, a także sam system ERP. Od tego zależą kanał zgłoszenia i zakres pól, które ktoś musi wypełnić ręcznie. Im więcej danych pochodzi z zamówienia lub z awizo wysyłki, tym mniej błędów przepisywania.
| Zgłaszający | Kanał | Pola wypełniane ręcznie | Główne ryzyko |
|---|---|---|---|
| Dostawca | portal w przeglądarce | termin, pojazd, kierowca | błędny numer zamówienia |
| Przewoźnik lub spedytor | portal lub API | pojazd, kierowca | brak wiedzy o zawartości ładunku |
| System ERP dostawcy | EDI lub API | brak, tylko okno | koszt mapowania komunikatów |
| Dział zakupów odbiorcy | panel w systemie magazynu | wszystkie, na prośbę dostawcy | opóźnienie i przepisywanie danych |
Awizo dostawy zakłada się przez przeglądarkę, bez instalowania oprogramowania. Źródłem może być zamówienie zakupu albo awizo wysyłki ASN, a zatwierdzone awizo trafia do WMS jako oczekujące zlecenie przyjęcia z listą pozycji. Rozwiązanie po stronie producenta przedstawia strona awizacja, a moduł opisuje artykuł o awizacjach VSS.net.
Konto zgłaszającego wiąże się z kartoteką kontrahenta. Dzięki temu dostawca widzi tylko własne awizo, a magazyn może liczyć wskaźniki terminowości per dostawca. Zgłoszenia anonimowe pozbawiają magazyn możliwości rozliczenia kogokolwiek z terminowości i wysłania powiadomienia o zmianie.

Walidacja awizo dostawy przy zapisie
Walidacja dzieli się na dwie warstwy. Przeglądarka poprawia proste błędy od razu, na przykład format numeru rejestracyjnego. Serwer sprawdza wszystko jeszcze raz, bo dane z przeglądarki mogą pochodzić z zmodyfikowanego żądania.
- Zgodność z zamówieniem - numer zamówienia istnieje w ERP i nie jest zamknięty.
- Okno w godzinach pracy - termin mieści się w godzinach obiektu i nie nakłada się na przerwę.
- Kompletność pojazdu - numer rejestracyjny i telefon kierowcy mają poprawny format.
- Unikalność - ten sam pojazd nie ma drugiego awizo z nakładającym się terminem.
Poniższy fragment w JavaScript normalizuje numer rejestracyjny po opuszczeniu pola: zamienia litery na wielkie i usuwa spacje oraz myślniki. Ta sama funkcja powinna działać po stronie serwera, bo tylko wtedy porównanie numerów w bazie jest wiarygodne.
function normalizePlate(value) {
return value.toUpperCase().replace(/[^A-Z0-9]/g, '');
}
$('#plate').on('blur', function () {
this.value = normalizePlate(this.value);
});
Zapisany numer ma wtedy jedną postać, na przykład PO12345 zamiast PO 12345 albo po-12345. Odczyt numeru z kamery przy bramie zwraca własny format, więc normalizacji poddaje się również wynik odczytu, zanim system porówna go z awizo.
Pojazd bez awizo nie jest odsyłany automatycznie. Ochrona rejestruje go jako wjazd nieawizowany, a logistyka decyduje, czy znajdzie się dla niego okno. Taki wpis trafia do historii, więc raport pokazuje, jaki odsetek dostaw omija system i którzy dostawcy robią to najczęściej.
Reguła: serwer nie ufa walidacji z przeglądarki i sprawdza każde pole ponownie.
Powiązanie awizo z zamówieniem i przyjęciem
Awizo ma sens, gdy jest połączone z dokumentami przed nim i po nim. Z przodu stoi zamówienie zakupu, z tyłu dokument przyjęcia PZ, a po środku awizo wysyłki ASN z numerami SSCC. Połączenie odbywa się przez numer zamówienia i numer awizo, które przechodzą przez wszystkie dokumenty.
Przy przyjęciu magazynier otwiera zlecenie, które zawiera pozycje i ilości z awizo. Skaner porównuje odczytane numery SSCC z listą z ASN i od razu pokazuje brakującą lub nadmiarową jednostkę. Sposób przyjęcia opisuje artykuł o awizacjach dostaw do magazynu, a rodzaje dokumentów magazynowych zestawia strona o dokumentach magazynowych.

Jeżeli dostawa zawiera palety zwrotne, awizo powinno wskazywać ich liczbę, bo od niej zależy dokument wymiany opakowań. Szczegóły omawia artykuł o awizo dostawy palet. Ogólne ujęcie dla towaru przedstawia tekst o awizo dostawy towaru.
Historia zmian i archiwum awizo
Awizo zmienia się w czasie: przesuwa się termin, poprawia pojazd, dopisuje pozycje. Bez historii nie da się ustalić, kto zmienił termin i dlaczego pojazd czekał przy bramie. Najprostszym rozwiązaniem w SQL Server są tabele czasowe z wersjonowaniem systemowym, które automatycznie zachowują poprzednie wersje wierszy. Opisuje je dokumentacja tabel czasowych w Microsoft Learn.
Tabela czasowa odpowiada na pytanie, jak wyglądało awizo w konkretnym momencie, bez pisania wyzwalaczy. Nie zapisuje jednak autora zmiany ani jej powodu, więc te pola dopisuje się do rekordu. Powód wybiera użytkownik z listy, co pozwala później policzyć, dlaczego terminy się zmieniają.
Archiwizacja zamkniętych awizo odbywa się osobno. Rekordy starsze niż przyjęty okres przenosi się do tabeli archiwalnej zadaniem SQL Agent, a tabela robocza pozostaje mała. Wyszukiwanie po numerze zamówienia lub numerze rejestracyjnym powinno obejmować obie tabele, bo spór z przewoźnikiem bywa zgłaszany po wielu miesiącach. Ujęcie procesowe zawiera artykuł o systemie awizowania dostawy.




