Numer partii i data ważności jako dane wyrobu

Partia produkcyjna obejmuje ilość wyrobu wytworzoną w jednym cyklu, na tej samej linii i z tych samych surowców. Numer partii wskazuje tę grupę jednym identyfikatorem, a data ważności określa moment, po którym wyrób nie powinien już trafić do sprzedaży ani do użycia. Oba pola zapisuje się w chwili powstania wyrobu i nie zmienia się ich później.

Dla żywności rozróżnia się dwa rodzaje terminu: „należy spożyć do” oraz „najlepiej spożyć przed”. W kartotece indeksu zapisuje się, który z nich obowiązuje, bo od tego zależy dalsze postępowanie z towarem po upływie terminu. Zestawienie poniżej pokazuje, kto nadaje poszczególne pola i skąd system bierze ich wartości.

PoleKto nadajeSkąd wartość
Numer partiiProdukcja albo dostawca towaru handlowegoNadany przy zamknięciu zlecenia albo odczytany z etykiety dostawcy
Data produkcjiLinia produkcyjnaData zakończenia partii
Data ważnościSystemData produkcji powiększona o okres trwałości z kartoteki
Rodzaj terminuKartoteka indeksuUstawienie „należy spożyć do” albo „najlepiej spożyć przed”

Wyliczanie daty ważności z okresu trwałości

Okres trwałości zapisuje się w kartotece indeksu w dniach. Data ważności powstaje przez dodanie tej liczby do daty produkcji, a nie przez ręczne wpisanie daty kalendarzowej na hali. Funkcja DATEADD w T-SQL wykonuje to jednym zapytaniem, które uzupełnia partie bez daty. Tabele w przykładzie są przykładowe, a nie schematem produktu.

UPDATE l
SET    l.ExpiryDate = DATEADD(DAY, i.ShelfLifeDays, l.ProductionDate)
FROM   dbo.ProductionLot AS l
JOIN   dbo.Item          AS i ON i.ItemId = l.ItemId
WHERE  l.ExpiryDate IS NULL;

Miesiące dodaje się ostrożnie. DATEADD z częścią MONTH od 31 stycznia daje 28 albo 29 lutego, więc okres liczony w miesiącach nie odpowiada okresowi w dniach. Okres zapisany w dniach jest jednoznaczny i daje ten sam wynik w każdym miesiącu.

Reguła: data ważności wynika z daty produkcji i okresu trwałości. Data wpisana ręcznie na hali jest źródłem błędu, bo system uzna partię za ważną o kilka dni za długo.

Partia własna i partia dostawcy

Wyrób własny dostaje numer partii przy zamknięciu zlecenia produkcyjnego. Rejestrację na hali opisuje tekst o panelach produkcyjnych w systemie ERP. Towar handlowy przychodzi z numerem nadanym przez dostawcę, a magazynier odczytuje go z etykiety przy przyjęciu.

Dwie dostawy tego samego indeksu mogą mieć ten sam numer partii dostawcy, jeśli pochodzą z jednej serii. System tworzy wtedy jedną partię z dwoma przyjęciami albo dwie partie z tym samym numerem zewnętrznym, zależnie od przyjętej reguły, a regułę ustala się przed uruchomieniem ewidencji.

Magazynier w kamizelce ostrzegawczej rozmawia z zespołem przy regałach i wózku widłowym w hali z paletami
Kontrola terminów jest zadaniem wspólnym dla produkcji i magazynu, bo partia przechodzi przez obie strefy

Rejestracja partii na produkcji i przy przyjęciu

Partię rejestruje się w miejscu, w którym powstaje albo wchodzi do firmy. Na produkcji robi to operator przy zamknięciu zlecenia, a na rampie magazynier przy przyjęciu dostawy. Dane trafiają na etykietę w tej samej operacji, w której zapisują się w bazie, więc oba zapisy nie mogą się rozejść.

Standard GS1-128 zapisuje partię i daty w polach o stałych identyfikatorach zastosowania. Wybrane identyfikatory zestawia tabela poniżej, a budowę całej etykiety opisuje tekst o etykietach logistycznych GS1.

IdentyfikatorZnaczenieFormat
01GTIN jednostki handlowej14 cyfr
10Numer partiiDo 20 znaków, pole o zmiennej długości
11Data produkcjiRRMMDD
15Data minimalnej trwałościRRMMDD
17Data ważnościRRMMDD

Numer partii ma zmienną długość, więc jeśli po nim następuje kolejne pole, kończy go znak FNC1. Kolejność pól na etykiecie ma zatem znaczenie dla odczytu. Zasady kodowania opisuje strona o kodach kreskowych w magazynie.

Reguła: numer partii i datę ważności zapisuje się na etykiecie w tej samej operacji, w której powstaje ilość towaru. Dopisywanie ich później, z pamięci albo z papierowej notatki, kończy się partią bez daty.

Kontrola wprowadzanej daty

Data odczytana z etykiety dostawcy jest daną wejściową, którą system sprawdza przed zapisem. Na kolektorze odrzuca się datę wcześniejszą niż dzisiejsza oraz taką, która zostawia mniej dni trwałości, niż dopuszcza umowa z dostawcą. Ta sama kontrola działa po stronie bazy jako ograniczenie, które chroni dane także przy imporcie z pliku albo z innego systemu.

ALTER TABLE dbo.ProductionLot
ADD CONSTRAINT CK_ProductionLot_Expiry
    CHECK (ExpiryDate > ProductionDate);

Ograniczenie CHECK odrzuca wiersz, w którym data ważności nie jest późniejsza od daty produkcji. Wyłapuje najczęstszy błąd ręcznego wpisu, czyli zamianę miejscami dnia i miesiąca w jednej z dat.

Zasady wydawania towaru a kolejność partii

Kolejność wydawania partii jest decyzją, którą system podejmuje przy każdym dokumencie WZ. FIFO wydaje najpierw partię przyjętą najwcześniej, FEFO partię o najkrótszym terminie ważności, a LIFO partię przyjętą ostatnio.

ZasadaKryterium wyboruKiedy się sprawdzaRyzyko
FIFOData przyjęciaTowar o stałej trwałości i wycena rozchoduPartia przyjęta później może wygasnąć wcześniej
FEFOData ważnościŻywność i leki z terminemWymaga daty przy każdej partii
LIFONajnowsza partiaWyjątkowo, gdy fizycznie dostępna jest tylko ostatnia paletaStarsze partie przeterminowują się w głębi regału
Wydanie doraźneWygoda magazynieraBrak zasadyNieprzewidywalna rotacja i straty

Reguła: FIFO i FEFO dają inny wynik, gdy partia przyjęta później ma krótszy termin. O kolejności wydań decyduje wtedy data ważności, a nie data przyjęcia.

Zapytanie wybierające partię do wydania

Zapytanie FEFO sortuje dostępne partie rosnąco według daty ważności. Pomija partie zablokowane oraz te, które wygasłyby przed dotarciem towaru do odbiorcy. Parametr @MinShelfLifeDays przenosi wymagany zapas terminu.

SELECT TOP (5)
       s.LotNo, s.LocationCode, s.QtyAvailable, s.ExpiryDate
FROM   dbo.StockLot AS s
WHERE  s.ItemCode = @ItemCode
  AND  s.QtyAvailable > 0
  AND  s.LotStatus = 'RELEASED'
  AND  s.ExpiryDate >= DATEADD(DAY, @MinShelfLifeDays, CAST(GETDATE() AS date))
ORDER BY s.ExpiryDate ASC, s.ReceivedAt ASC;

Drugie kryterium sortowania rozstrzyga remis między partiami o tym samym terminie. Składnię klauzuli ORDER BY opisuje dokumentacja Microsoft, a indeks po dacie ważności skraca sortowanie przy dużej liczbie partii.

Minimalny okres trwałości u odbiorcy

Część odbiorców wymaga, aby towar dotarł z zapasem terminu, na przykład z połową okresu trwałości. Wartość zapisuje się przy odbiorcy albo przy indeksie i przekazuje do zapytania jako parametr. Partia, która wygaśnie przed upływem tego okresu, nie trafia na zamówienie tego klienta, ale pozostaje dostępna dla innych.

Rezerwacja partii przy pracy wielu magazynierów

Dwóch magazynierów kompletujących różne zamówienia może wskazać tę samą partię. Blokada wiersza rozwiązuje tę kolizję: wskazówki tabelowe UPDLOCK i READPAST sprawiają, że drugi proces pomija wiersz zablokowany przez pierwszy i bierze następną partię w kolejności FEFO.

BEGIN TRANSACTION;

DECLARE @LotId int;

SELECT TOP (1) @LotId = s.LotId
FROM   dbo.StockLot AS s WITH (UPDLOCK, READPAST, ROWLOCK)
WHERE  s.ItemCode = @ItemCode
  AND  s.QtyAvailable >= @Qty
  AND  s.LotStatus = 'RELEASED'
ORDER BY s.ExpiryDate, s.ReceivedAt;

IF @LotId IS NULL
BEGIN
    ROLLBACK TRANSACTION;
    RETURN;
END

UPDATE dbo.StockLot
SET    QtyAvailable = QtyAvailable - @Qty,
       QtyReserved  = QtyReserved  + @Qty
WHERE  LotId = @LotId;

COMMIT TRANSACTION;

Gdy żadna pojedyncza partia nie pokrywa zamówionej ilości, program dzieli wydanie na dwie partie w kolejności FEFO. Każda z nich dostaje osobną pozycję dokumentu WZ z własnym numerem partii.

Magazynier z tabletem przy paletach ustawionych w regale obok wózka widłowego w hali magazynowej
Sprawdzenie partii przy regale w kroku wydania metodą FEFO

Statusy partii i blokada jakościowa

Partia ma status niezależny od daty ważności. Partia świeża może być zablokowana, bo kontrola jakości wykryła wadę, a partia bliska terminu nadal zwolniona do wydania. Status ogranicza wydania w zapytaniu, a nie na hali, więc magazynier nie musi pamiętać, które partie wolno brać. Model poniżej jest przykładowy: statusy ustala proces jakości każdej firmy.

StatusCzy wolno wydaćTypowa przyczyna
KwarantannaNieOczekiwanie na wynik badania po produkcji albo przyjęciu
ZwolnionaTakPoprawny wynik kontroli
ZablokowanaNieWada wykryta przez kontrolę jakości albo reklamację
WycofanaNieDecyzja o wycofaniu partii z rynku
PrzeterminowanaNieUpłynęła data ważności

Zasady kontroli w procesie wytwarzania omawia strona o kontroli jakości w systemie produkcyjnym. System nie zmienia statusu sam, dopóki nie dostanie wyniku z tej kontroli.

Partia po upływie terminu przechodzi na status przeterminowanej bez udziału magazyniera. Robi to zadanie nocne, które zmienia status partii z dodatnim stanem, jeśli data ważności jest wcześniejsza niż bieżąca. Towar przeterminowany pozostaje na stanie do chwili utylizacji, którą dokumentuje osobny dokument rozchodu z numerem i datą.

Zbliżający się termin i alerty

Partie o zbliżającym się terminie wykrywa zapytanie uruchamiane cyklicznie, na przykład zadaniem SQL Agent. Wynik trafia do osób odpowiedzialnych za sprzedaż i magazyn, co pozwala sprzedać albo przesunąć towar, zanim wygaśnie. W opisie Studio WMS.net odpowiednie osoby są informowane o zbliżającej się dacie ważności.

SELECT s.ItemCode, s.LotNo, s.ExpiryDate,
       DATEDIFF(DAY, CAST(GETDATE() AS date), s.ExpiryDate) AS DaysLeft,
       s.QtyOnHand
FROM   dbo.StockLot AS s
WHERE  s.QtyOnHand > 0
  AND  s.ExpiryDate <= DATEADD(DAY, 30, CAST(GETDATE() AS date))
ORDER BY s.ExpiryDate;

CREATE NONCLUSTERED INDEX IX_StockLot_Expiry
    ON dbo.StockLot (ExpiryDate)
    INCLUDE (ItemCode, LotNo, QtyOnHand)
    WHERE QtyOnHand > 0;

Indeks filtrowany obejmuje tylko partie z zapasem na stanie, więc pozostaje mały mimo rosnącej historii partii wyprzedanych. Jego składnię opisuje dokumentacja indeksów filtrowanych.

Identyfikowalność i wycofanie partii z rynku

Identyfikowalność oznacza możliwość przejścia w obie strony: od partii wyrobu do jej surowców oraz od partii do odbiorców. Pierwszy kierunek obsługuje ewidencja zużycia materiałów na zleceniu, drugi dokumenty wydań z numerem partii. Mechanizm po stronie systemu ERP opisuje tekst o śledzeniu partii produktów w HermesSQL, a kontrolę terminów tekst o terminach ważności w HermesSQL.

KierunekPytanieDokumenty źródłowe
WsteczZ jakich surowców powstała partiaRozchód materiałów na zleceniu, przyjęcia PZ z numerem partii dostawcy
NaprzódKtórzy odbiorcy dostali partięDokumenty WZ z numerem partii
Na stanieGdzie leży reszta partiiLokalizacje i ilości w magazynie

Zapytanie o odbiorców partii

Wycofanie zaczyna się od pytania, gdzie trafiła partia. Zapytanie łączy pozycje dokumentów wydania z ich nagłówkami i grupuje ilości według odbiorcy.

SELECT d.CustomerCode, d.DocNo, d.IssueDate, SUM(l.Qty) AS QtyIssued
FROM   dbo.IssueLine AS l
JOIN   dbo.IssueDoc  AS d ON d.DocId = l.DocId
WHERE  l.LotNo = @LotNo
  AND  l.ItemCode = @ItemCode
GROUP BY d.CustomerCode, d.DocNo, d.IssueDate
ORDER BY d.IssueDate;

Reguła: przy wycofaniu najpierw blokuje się partię w magazynie, a dopiero potem sporządza listę odbiorców. Kolejność odwrotna zostawia okno, w którym magazyn wydaje partię, o której już wiadomo, że jest wadliwa.

Zgłoszenia od klientów łączą się z partią przez numer z etykiety. Reklamacja jakościowa, która wskazuje numer partii, pozwala policzyć skargi na jedną serię, a zależność między reklamacjami a jakością omawia tekst o zarządzaniu reklamacjami a jakością produktów.

Zwrot towaru od odbiorcy też niesie numer partii. Wraca on do magazynu ze statusem kwarantanny, a nie na stan dostępny, dopóki kontrola nie oceni opakowania i nie potwierdzi, że data ważności pozwala na dalszą sprzedaż. Bez tej reguły zwrócona paleta trafia na regał i zostaje wydana jako pełnowartościowa.

Ewidencja partii w programie magazynowym

Ewidencja partii działa dla indeksów, które mają ją włączoną w kartotece. Dla pozostałych system nie pyta o partię, więc magazynier nie skanuje zbędnych pól. Atrybuty „wymaga partii” i „wymaga daty ważności” są pierwszym ustawieniem przy zakładaniu kartoteki, co omawia strona o kartotekach w systemie WMS.

W opisie Studio WMS.net ewidencja terminów ważności pozwala tworzyć dokumenty wydań tak, aby magazynier pobierał towar o najkrótszym terminie, a w magazynie zostawały partie niewygasające. Odczyt partii z etykiety odbywa się na kolektorze, co opisuje strona o programie magazynowym ze skanerem. Dokumenty, na których zapisują się partie, omawia tekst o dokumentach magazynowych.

Inwentaryzacja w rozbiciu na partie

Przy spisie liczy się ilość osobno dla każdej partii, a nie tylko dla indeksu. Różnica na poziomie indeksu równa zeru może ukrywać zamianę dwóch partii: jedna ma nadwyżkę, druga niedobór o tę samą wartość. To błąd terminu, a nie ilości, i wychodzi na jaw dopiero przy wydaniu, gdy magazynier bierze z regału partię o innej dacie, niż wskazał system.

Zestawienie różnic pokazuje więc partie ze znakiem plus i minus obok siebie. Rozliczenie takiej pary polega na korekcie lokalizacji partii, a nie na dokumencie przychodu i rozchodu, bo ilość na stanie się zgadza.

Ewidencję po stronie samego magazynu opisuje tekst o partiach produkcyjnych w ewidencji magazynowej WMS, a wymagania towarów o krótkim terminie tekst o logistyce w branży spożywczej. Funkcje magazynowe można obejrzeć w demo systemu magazynowego, a opis produktu znajduje się na stronie Studio WMS.net.