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.

DokumentKto wystawiaKiedy powstajeCo zawiera
Awizo dostawydostawca lub przewoźnikprzed przyjazdem pojazdutermin, pojazd, numer zamówienia
Awizo wysyłki ASN (DESADV)dostawca jako nadawcaw chwili wysyłki towarupozycje z ilościami i numerami SSCC
List przewozowy CMRprzewoźnikprzy załadunkunadawca, odbiorca, opis towaru
Dokument przyjęcia PZmagazynpo rozładunkuiloś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.

Magazynier w czapce z daszkiem i granatowej kurtce sprawdza dane na tablecie przy regałach z paletami
Sprawdzenie dokumentów na tablecie przy regale - awizo dostawy jest pierwszym w łańcuchu dokumentów, które kończy przyjęcie PZ

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 pozycjiPo co magazynowiSkutek braku
Indeks towaruporównanie z zamówieniem i kartotekąpozycja do ręcznego dopasowania
Ilość i jednostka miarykontrola ilościowa przy przyjęciubrak podstawy do reklamacji ilościowej
Numer partii i data ważnościzasada FEFO przy składowaniu i wydaniutowar o krótkim terminie ląduje na dalszej lokalizacji
Numer SSCC jednostkiskanowanie palety przy rampiekontrola 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.

StatusKto ustawiaZnaczenieDozwolone przejście
Bufordostawca przy zapisieszkic, który nie zajmuje oknaZatwierdzone, Anulowane
Zatwierdzonelogistyka lub reguła automatycznatermin i rampa zarezerwowaneZrealizowane, Anulowane
Zrealizowanebrama lub magazynpojazd przyjechał i został rozładowanyZamknięte
Zamkniętemagazyn po przyjęciu PZdokument rozliczony z ilościamibrak
Anulowanedostawca lub logistykatermin zwolniony dla innych dostawbrak

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.

ZmianaPonowne zatwierdzeniePowód
Kierowca lub telefonnienie zmienia zajętości rampy
Numer rejestracyjnynie, z wpisem w historiipojazd zastępczy przy tym samym terminie
Liczba palet zwiększonatakmoże wydłużyć czas obsługi ponad okno
Termin w tym samym dniuzależnie od regułyzwalnia jedno okno i zajmuje drugie
Termin w innym dniutakzmienia 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ącyKanałPola wypełniane ręcznieGłówne ryzyko
Dostawcaportal w przeglądarcetermin, pojazd, kierowcabłędny numer zamówienia
Przewoźnik lub spedytorportal lub APIpojazd, kierowcabrak wiedzy o zawartości ładunku
System ERP dostawcyEDI lub APIbrak, tylko oknokoszt mapowania komunikatów
Dział zakupów odbiorcypanel w systemie magazynuwszystkie, na prośbę dostawcyopóź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.

Ciągnik siodłowy z naczepą jadący nocą w deszczu z włączonymi światłami na tle ciemnego nieba
Pojazd w drodze do magazynu - awizo dostawy powstaje, zanim ciągnik dojedzie pod bramę

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.

Pracownik w okularach i kamizelce odblaskowej prowadzi wózek ręczny z paletą towaru w wysokim regale
Przyjęcie palety na regał - dokument PZ zamyka awizo ilościami faktycznie zeskanowanymi

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.