Zarządzanie stanem magazynowym - stan fizyczny i dostępny

Zarządzanie stanem magazynowym zaczyna się od rozróżnienia, o którą liczbę pyta użytkownik. Magazynier chce wiedzieć, ile sztuk leży w lokalizacji, handlowiec - ile może obiecać klientowi, a planista zakupów - ile będzie po nadejściu dostaw. Każda z tych liczb ma inną definicję, a system, który podaje jedną wartość dla wszystkich, przekazuje którejś z grup błędną informację.

Rodzaj stanuDefinicjaKto z niego korzysta
Stan fizycznysuma ilości zaksięgowanych w lokalizacjachmagazynier, inwentaryzacja
Stan zarezerwowanyilość przypisana do zatwierdzonych zleceńkompletacja, planista wydań
Stan dostępnystan fizyczny pomniejszony o rezerwacjesprzedaż, sklep internetowy
Stan przyszłystan dostępny powiększony o zamówienia w drodzeplanista zakupów

Liczba fizyczna wynika wyłącznie z dokumentów, a jej model danych opisuje tekst o magazynowym systemie informatycznym. Pozostałe trzy wielkości są pochodne i liczy się je dopiero na podstawie rezerwacji oraz zamówień. Podstawowe zestawienia stanów, na przykład stan na dzień, opisuje strona o stanach magazynowych.

Reguła: stan dostępny nie jest zapisywany jako osobna liczba, tylko wyliczany z fizycznego i rezerwacji w chwili odczytu.

Jednostki miary i przeliczniki

Ten sam towar bywa liczony w sztukach oraz w opakowaniach zbiorczych, więc stan przechowuje się w jednej jednostce podstawowej, a pozostałe wynikają z przeliczników w kartotece. Dzięki temu przyjęcie w paletach i wydanie w sztukach zmieniają tę samą liczbę. Ilość magazynuje się w typie DECIMAL z trzema miejscami po przecinku, bo towary sprzedawane na wagę czy metry nie mieszczą się w liczbach całkowitych.

JednostkaPrzelicznik do podstawowejPrzykład użycia
Sztuka1wydanie detaliczne
Karton zbiorczyna przykład 12 szt.kompletacja pełnych kartonów
Paletana przykład 48 kartonówprzyjęcie od dostawcy

Identyfikacja towaru i dokładność stanu

Dokładność stanu zależy od tego, jak towar jest identyfikowany przy każdej operacji. Kody kreskowe oraz tagi RFID zastępują ręczne przepisywanie numerów, a każde skanowanie tworzy zapis w chwili wykonania czynności. Przyjęcie i wydanie zapisane od razu utrzymują stan zgodny z rzeczywistością przez całą zmianę, a nie dopiero po jej zamknięciu.

Ilustracja stanów magazynowych w systemie WMS - zestawienie ilości towaru w lokalizacjach
Zestawienie stanów w lokalizacjach - punkt wyjścia do wyliczania stanu dostępnego i przyszłego

Rezerwacje towaru pod zlecenia

Rezerwacja odkłada ilość towaru pod konkretne zlecenie, zanim kompletacja fizycznie zdejmie go z regału. Bez niej dwa zlecenia mogą obiecać tę samą ostatnią paletę, a pomyłka wychodzi dopiero przy wydaniu. Moment założenia rezerwacji zależy od procesu: często jest to zatwierdzenie zlecenia, a czasem dopiero uruchomienie fali kompletacji.

Poniższy szkic zapisuje rezerwacje w osobnej tabeli, a widok liczy z nich stan dostępny. Nazwy tabel i kolumn są umowne i nie odzwierciedlają schematu żadnego produktu.

CREATE TABLE dbo.Rezerwacja (
    RezerwacjaId INT IDENTITY(1,1) PRIMARY KEY,
    ZlecenieId   INT           NOT NULL,
    TowarId      INT           NOT NULL,
    Ilosc        DECIMAL(18,3) NOT NULL CHECK (Ilosc > 0),
    Status       TINYINT       NOT NULL DEFAULT 1,  -- 1 aktywna, 2 zrealizowana, 3 anulowana
    WazneDo      DATETIME2(0)  NULL
);

CREATE VIEW dbo.vStanDostepny AS
SELECT s.TowarId,
       s.Fizyczny,
       ISNULL(r.Zarezerwowane, 0)             AS Zarezerwowane,
       s.Fizyczny - ISNULL(r.Zarezerwowane, 0) AS Dostepny
FROM (SELECT TowarId, SUM(Ilosc) AS Fizyczny
      FROM dbo.Stan GROUP BY TowarId) AS s
LEFT JOIN (SELECT TowarId, SUM(Ilosc) AS Zarezerwowane
           FROM dbo.Rezerwacja WHERE Status = 1 GROUP BY TowarId) AS r
       ON r.TowarId = s.TowarId;

Widok jest spójny tylko wtedy, gdy założenie rezerwacji sprawdza dostępność w tej samej transakcji, w której ją zapisuje. W przeciwnym razie dwa równoległe zlecenia odczytają ten sam stan dostępny i oba zarezerwują ostatnią sztukę. Wzorzec blokady aktualizacyjnej z transakcją opisujemy w tekście o księgowaniu ruchu w tabelach SQL Server.

  • Rezerwacja z terminem - kolumna WazneDo zwalnia ilość po upływie czasu, jeśli zlecenie nie zostało zrealizowane, co chroni przed zamrożonym zapasem.
  • Rezerwacja na partię - zlecenie klienta wymagającego konkretnej partii lub minimalnego terminu ważności rezerwuje tylko pasujące partie.

Anulowanie zlecenia zwalnia rezerwacje w tej samej transakcji, w której zmienia status zlecenia. Zwolnienie polega na zmianie statusu rezerwacji, a nie na usunięciu wiersza, bo historia rezerwacji jest potrzebna do wyjaśnienia, dlaczego towar był chwilowo niedostępny dla innych odbiorców.

Rezerwacje uruchamiają też kompletację: lista pobrań powstaje z aktywnych rezerwacji, a zdjęcie towaru z lokalizacji zmienia ich status na zrealizowany. Sposób prowadzenia zbiórki opisuje tekst o kompletacji zamówień, a zamówienia i rezerwacje w ERP omawia strona o zamówieniach i rezerwacjach w systemie ERP.

Przydział niedoboru między zlecenia

Gdy zapotrzebowanie przekracza stan dostępny, system musi rozstrzygnąć, które zlecenia dostaną towar. Wybór strategii jest decyzją biznesową i zależy od umów z odbiorcami, a nie od techniki.

Strategia przydziałuZasadaSkutek
Kolejność zleceńtowar dostają zlecenia zatwierdzone najwcześniejprzewidywalność, ryzyko pominięcia ważnego klienta
Priorytet klientarezerwacja według rangi odbiorcy lub terminu wysyłkiochrona najważniejszych umów, wymaga utrzymania rang
Podział proporcjonalnykażde zlecenie dostaje ten sam odsetek zamówionej ilościsprawiedliwość, więcej dostaw częściowych

Stan dostępny dla sklepu i marketplace

W sprzedaży wielokanałowej stan dostępny trafia do sklepu internetowego i na platformy sprzedażowe. Brak synchronizacji prowadzi do sprzedaży towaru, którego już nie ma na regale, dlatego wysyła się stan dostępny, a nie fizyczny. Przy towarach szybko schodzących część firm publikuje pomniejszony stan, zostawiając bufor bezpieczeństwa na opóźnienia synchronizacji. Wymianę tych danych z warstwy integracji omawia tekst o informatycznym systemie magazynowym i jego integracjach.

Stany minimalne i punkt ponownego zamówienia

Stan minimalny jest progiem, po którego przekroczeniu system zgłasza potrzebę uzupełnienia. Punkt ponownego zamówienia liczy się z zapotrzebowania w czasie dostawy i zapasu bezpieczeństwa, więc jest bardziej precyzyjny niż stała liczba sztuk wpisana w kartotece.

  • Zapotrzebowanie w czasie dostawy - średnie dzienne zużycie pomnożone przez liczbę dni od zamówienia do przyjęcia towaru.
  • Zapas bezpieczeństwa - z · σ · √L, gdzie z zależy od poziomu obsługi, σ jest odchyleniem dziennego zużycia, a L czasem dostawy w dniach.
ParametrWartość przykładowaUwagi
Średnie zużycie dzienne40 szt.z historii wydań z ostatnich miesięcy
Czas dostawy5 dniod zamówienia do przyjęcia PZ
Odchylenie dziennego zużycia12 szt.im większe, tym większy zapas bezpieczeństwa
Współczynnik z dla poziomu obsługi 95%1,65dla 99% wynosi około 2,33
Punkt ponownego zamówienia245 szt.40 · 5 + 45 (zapas bezpieczeństwa 1,65 · 12 · √5 ≈ 44, zaokrąglone w górę)

Wartości w tabeli są ilustracją obliczenia, a nie danymi z konkretnego magazynu. Zapytanie poniżej wskazuje towary, których stan dostępny wraz z zamówieniami w drodze spadł poniżej punktu zamówienia. Można je uruchamiać co godzinę jako zadanie SQL Agent i przekazywać wynik do modułu zakupów.

SELECT k.TowarId, k.Indeks, v.Dostepny, k.PunktZamowienia
FROM dbo.KartotekaTowaru AS k
JOIN dbo.vStanDostepny AS v ON v.TowarId = k.TowarId
OUTER APPLY (SELECT SUM(z.Ilosc) AS Oczekiwane
             FROM dbo.ZamowienieDostawcy AS z
             WHERE z.TowarId = k.TowarId AND z.Status = 1) AS o
WHERE v.Dostepny + ISNULL(o.Oczekiwane, 0) <= k.PunktZamowienia;

Progi nie mają jednakowego znaczenia dla całego asortymentu. Towary klasy A według analizy ABC, które generują największą część obrotu, wymagają wyższego poziomu obsługi i częstszej rewizji parametrów niż towary klasy C. Klasyfikację omawia strona o analizie ABC magazynu oraz artykuł SoftwareStudio o klasyfikacji asortymentu metodami ABC i XYZ.

Rewizja parametrów i sezonowość

Parametry zamówień starzeją się razem z popytem. Średnie zużycie z ostatnich miesięcy nie opisuje towaru sezonowego, który w grudniu sprzedaje się kilka razy szybciej niż w lipcu. Z tego powodu przelicza się je cyklicznie z okna czasowego dobranego do rotacji: krótszego dla towarów szybkich, dłuższego dla wolnych. Wynik system proponuje planiście, a zatwierdza go człowiek, bo automatyczna zmiana progu bez kontroli potrafi zawyżyć zapas po jednorazowym zamówieniu dużego klienta.

Partie i terminy ważności w stanie

Dla towaru z terminem ważności stan przestaje być jedną liczbą. Ten sam indeks ma kilka wierszy stanu, po jednym na partię w każdej lokalizacji, a system wybiera do wydania partię o najwcześniejszej dacie. Zasada nosi nazwę FEFO (First Expired, First Out) i różni się od FIFO tym, że kolejność wyznacza data ważności, a nie data przyjęcia.

Ilustracja partii produkcyjnych i dat ważności towaru ewidencjonowanych w systemie magazynowym
Partie z datami ważności jako wymiar stanu - podstawa doboru partii do wydania według FEFO

Zapytanie z funkcją okna wyznacza partie potrzebne do pokrycia zamówionej ilości w kolejności dat. Suma narastająca wskazuje, w której partii kończy się potrzebna ilość, a ostatnia partia jest pobierana częściowo. Działanie funkcji okna opisuje dokumentacja klauzuli OVER.

DECLARE @TowarId INT = 1001, @Potrzeba DECIMAL(18,3) = 120;

WITH kolejka AS (
    SELECT PartiaId, LokalizacjaId, TerminWaznosci, Ilosc,
           SUM(Ilosc) OVER (ORDER BY TerminWaznosci, PartiaId
                            ROWS UNBOUNDED PRECEDING) AS Narastajaco
    FROM dbo.StanPartii
    WHERE TowarId = @TowarId AND Status = 1 AND Ilosc > 0
)
SELECT PartiaId, LokalizacjaId, TerminWaznosci,
       CASE WHEN Narastajaco <= @Potrzeba THEN Ilosc
            ELSE @Potrzeba - (Narastajaco - Ilosc) END AS DoPobrania
FROM kolejka
WHERE Narastajaco - Ilosc < @Potrzeba
ORDER BY TerminWaznosci, PartiaId;

Partie w stanie mają także status jakościowy. Towar po dostawie zwykle trafia do kwarantanny i nie jest liczony do stanu dostępnego, dopóki kontrola jakości go nie zwolni. Szczegóły ewidencji partii i dat opisuje strona o partiach produkcyjnych i datach ważności.

Alerty terminów ważności

Terminy ważności wymagają monitorowania z wyprzedzeniem, bo towar bliski daty nie nadaje się do wysyłki do odbiorców z wymaganym minimalnym okresem ważności. Zapytanie poniżej wskazuje partie, którym zostało nie więcej niż 30 dni. Liczbę dni ustawia się osobno dla grup towarowych.

SELECT p.TowarId, p.PartiaId, p.TerminWaznosci, p.Ilosc,
       DATEDIFF(DAY, CAST(SYSDATETIME() AS DATE), p.TerminWaznosci) AS DniDoKonca
FROM dbo.StanPartii AS p
WHERE p.Ilosc > 0
  AND p.TerminWaznosci <= DATEADD(DAY, 30, CAST(SYSDATETIME() AS DATE))
ORDER BY p.TerminWaznosci;
Status stanuWliczany do dostępnegoTypowa przyczyna
Dostępnytaktowar zwolniony po przyjęciu
Kwarantannanieoczekiwanie na kontrolę jakości
Zablokowanyniereklamacja dostawcy albo wycofanie partii
Przeterminowanynieupływ terminu ważności

Reguła: towar przeterminowany jest wykluczany ze stanu dostępnego automatycznie w dniu upływu terminu, a nie ręcznie przez magazyniera.

Uzgadnianie stanu z inwentaryzacją

Nawet przy pełnym skanowaniu stan systemowy rozjeżdża się z fizycznym, bo towar ginie, jest uszkodzony albo trafia na złą półkę. Inwentaryzacja jest sposobem uzgodnienia obu wartości, a jej wynik stanowi miarę jakości zarządzania stanem. Wskaźnik zgodności lokalizacji, czyli odsetek lokalizacji, w których spis pokrywa się z systemem, mówi więcej niż sama wartość różnic.

Inwentaryzacja ciągła rozkłada liczenie na cały rok. Lokalizacje wybiera się według klasy ABC i historii rozbieżności, a magazyn nie zatrzymuje pracy na spis. Zasady takiej inwentaryzacji opisuje strona o inwentaryzacji ciągłej w magazynie. Różnice zapisuje się dokumentami korygującymi, więc historia obrotów pokazuje moment oraz przyczynę zmiany stanu.

Analiza przyczyn rozbieżności

Sama korekta różnicy nie poprawia dokładności, dopóki nie zostanie ustalona jej przyczyna. Historia obrotów towaru pozwala odtworzyć ostatnie operacje na rozbieżnej pozycji i wskazać, gdzie zapis mógł się rozjechać.

  • Błąd przyjęcia - towar przyjęty w złej ilości albo na zły indeks, co widać w dokumencie PZ i w kontroli przy rampie.
  • Zły adres lokalizacji - towar odłożony w innym miejscu niż zapisano, więc brak w jednej lokalizacji i nadwyżka w sąsiedniej.
  • Rozchód bez skanu - wydanie z pominięciem terminala, na przykład po awarii łączności, uzupełniane później ręcznym dokumentem.
  • Uszkodzenie lub kradzież - ubytek bez dokumentu, który wychodzi dopiero podczas liczenia i wymaga dokumentu RW.

Wskaźniki jakości stanu

Kilka wskaźników pozwala ocenić, czy zarządzanie stanami działa. Poniższe zestawienie podaje ich definicje; wartości docelowe ustala każdy magazyn samodzielnie.

WskaźnikSposób liczeniaCo pokazuje
Zgodność lokalizacjilokalizacje zgodne ze spisem podzielone przez wszystkie spisanejakość zapisu operacji
Rotacjawartość sprzedaży podzielona przez średni stanszybkość obrotu zapasem
Pokrycie w dniachstan podzielony przez średnie dzienne zużyciena jak długo wystarczy towaru
Zaleganiewartość towaru bez ruchu przez ustalony okreskapitał zamrożony w zapasie

Rotację i zaleganie opisuje osobny tekst o rotacji i zaleganiu towarów. Wybór programu, który te wskaźniki liczy bez dodatkowych arkuszy, omawia strona o zarządzaniu magazynem i doborze programu. Tabele dla wartości ilościowych warto definiować z odpowiednią precyzją, co opisuje dokumentacja typów decimal i numeric.