Rezerwacje
W tym dokumencie znajdziesz podstawowe informacje dotyczące obsługi rezerwacji w systemie platformaERP.
Jakie dokumenty wprowadzają rezerwacje
- Zamówienia o typie ZR — zamówienie rezerwacyjne, na zamówieniu ZR termin jest wymagany.
- Zamówienia o typie ZS, ZSC z terminem — na zamówieniach ZS, ZSC termin jest opcjonalny.
- Jeżeli termin jest wprowadzony na pozycji, ma on pierwszeństwo przed terminem z nagłówka.
Niezrealizowane zamówienia powyższych typów, z wypełnionym terminem na pozycjach lub w nagłówku, wprowadzają rezerwacje na indeksie.
Jak liczona jest rezerwacja
- Rezerwacja jest liczona sumarycznie dla indeksu.
- W szczegółach indeksu wyświetlana jest lista rezerwacji.
- W kontekście dokumentu, np. wydania, obliczany jest wskaźnik rezerwacji uwzględniający magazyn, stan, termin
Przykład obliczania wskaźnika rezerwacji:
| Operacja | Termin | MAG | Ilość |
|---|---|---|---|
| Stan magazynowy | bieżąca | 100 | 2 |
| Stan magazynowy | bieżąca | 200 | 10 |
| Zamówienie ZS1 | 2026-08-01 | 200 | 5 |
| Zamówienie ZR2 | 2026-08-02 | 200 | 5 |
| Zamówienie ZS3 | 2026-08-03 | - | 2 |
| Zamówienie ZS4 | 2026-08-04 | 200 | 2 |
Zasady wyliczania:
- Zamówienia sortowane są rosnąco wg daty zamówienia.
- Zamówienie z przypisanym magazynem (
MAG) rezerwuje ilość na tym magazynie. - Zamówienie bez przypisanego magazynu (
MAG = -) rezerwuje na każdym magazynie.
Scenariusze:
- Próba realizacji zamówienia ZS4: MAG (10 + 2) - ZAM (5 + 5 + 2 + 2) = 12 - 14 => wynik: niepowodzenie
- Próba realizacji zamówienia ZS3 z MAG 200: MAG (10) - ZAM (5 + 5 + 2) = 10 - 12 => wynik: niepowodzenie
- Próba realizacji zamówienia ZS3 z MAG 100: MAG (2) - ZAM (2) = 2 - 2 => wynik: POWODZENIE
- Próba realizacji zamówienia ZR2 z MAG 200: MAG (10) - ZAM (5 + 5) = 10 - 10 => wynik: POWODZENIE
Ile jest ogólnie zarezerwowane z danego indeksu
- Karta indeksu (kartoteka indeksu) - w nagłówku widoczne jest pole „Il. rezerwacja". To suma ze wszystkich niezrealizowanych zamówień ZS/ZSC/ZR z wypełnionym terminem, liczona globalnie (bez podziału na magazyny).
- Ta sama wartość jest dostępna jako kolumna na listach indeksów.
- Wskaźnik jest przeliczany automatycznie przy zmianach statusu zamówienia/pozycji (zatwierdzenie, realizacja, anulowanie)
Jakie zamówienia rezerwują dany indeks
- Karta indeksu → zakładka „Rezerwacje".
- Pokazuje listę zamówień typu ZS, ZSC, ZR, które mają niezrealizowaną ilość i wypełniony termin realizacji (na pozycji lub w nagłówku zamówienia).
- Kolumny: numer zamówienia, data zamówienia, termin, kontrahent, magazyn, ilość pozostała do realizacji.
- Posortowane rosnąco wg terminu — zamówienie z najwcześniejszym terminem ma „pierwszeństwo" do stanu magazynowego.
- Zamówienie bez wypełnionego terminu nie pojawi się na liście i nie rezerwuje stanu, nawet jeśli jest zatwierdzone.
Czy mogę bezpiecznie wydać towar z dokumentu magazynowego (WZ, RW, ...)
- Otwórz dokument magazynowy w statusie SZKIC → zakładka „Rezerwacje".
- Zakładka sprawdza, czy po zdjęciu ze stanu pozycji rozchodowych tego dokumentu, stan na magazynie dokumentu nadal pokryje rezerwacje innych, kwalifikujących się zamówień.
- Pokazywane są tylko indeksy, dla których jest problem — stan nie pokrywa rezerwacji (kolumna „dostępne" ma wartość ujemną).
- Pusta zakładka = brak kolizji, dokument można bezpiecznie zatwierdzić/wydać.
- Kolumny: indeks, stan magazynowy, ilość zarezerwowana, ilość dostępna (stan - rezerwacja).
DB - important (TECHNICAL)
- ilość zamówiona - itemOrderQuantity
- ilość zarezerwowana - itemReservationQuantity
- obliczanie itemOrderQuantity:
EXEC [wms].[item_updateItemOrderQuantity] @itemID = @itemID - obliczanie itemReservationQuantity:
EXEC [wms].[item_updateItemReservationQuantity] @itemID = @itemID [document].[order].[orderExpectedDate],[document].[order].[orderLineExpectedDate]- spodziewany termin
Implementacja [wms].[item].[itemReservationQuantity] (TECHNICAL)
- kolumna
[wms].[item].[itemReservationQuantity]decimal(18,3), default 0 - procedura
[wms].[item_updateItemReservationQuantity](@itemID, @orderID, @orderLineID, @allItems, @checkOnly) - liczona jako SUM(orderLine.itemQuantityLeft) dla ZS (F6D5306B-1213-4552-AE57-C63F7CB12ED5), ZSC (180D94A3-4EEA-4B88-8AA9-0789C4FD9356) i ZR (79818C9D-B226-4E90-B262-2304EAA0FC16), pozycje zatwierdzone i niezrealizowane (orderLineStatus >= 1 and < 3, itemQuantityLeft > 0) - szkice nie rezerwują , wymagany termin w naglowku lub na pozycji
[document].[order].[orderExpectedDate],[document].[order].[orderLineExpectedDate]. - wywołania (analogicznie do itemOrderQuantity):
document.documentline_updateOrderRealizedQuantity,document.order_UpdateOrderStatus,erp.order_UpdateOrderStatus,erp.orderLine_InsertUpdate - kontrola spójności:
EXEC [tools].[test_system] @code = '098' - migracja istniejących baz:
EXEC [common].[maintence] @option=20(dodaje kolumnę i przelicza jednorazowo)
Implementacja rezerwacji bieżącej [document].[document_checkReservation] (TECHNICAL)
Uwzględniane są tylko pozycje zamówień ze spodziewanym terminem — [document].[orderLine].[orderLineExpectedDate], z fallbackiem na [document].[order].[orderExpectedDate]. Termin jest też datą, wg której ustawia się kolejka rezerwacji.
EXEC [document].[document_checkReservation] @documentID = @documentID
Parametr @showAll = 1 zwraca wszystkie indeksy dokumentu (bez filtra braków) — do diagnostyki.
Wejście: @documentID (dokument magazynowy). Magazyn i data brane są z nagłówka dokumentu.
Drugi tryb — @itemID zamiast @documentID — zwraca listę zamówień rezerwujących dany indeks (bez agregacji, na wszystkich magazynach), używany przez zakładkę „Rezerwacje" na karcie indeksu (srs/400):
EXEC [document].[document_checkReservation] @itemID = @itemID
| Kolumna | Opis |
|---|---|
orderID, orderFullNR, orderDate |
zamówienie |
orderLineExpectedDate |
termin realizacji pozycji (fallback na termin nagłówka) |
firmID, firmName |
kontrahent |
warehouseID, warehouseCode |
magazyn zamówienia (null/pusty = rezerwuje na każdym magazynie) |
orderLineID, itemQuantityLeft |
pozycja i ilość pozostała do realizacji |
Ten tryb nie filtruje po magazynie ani po stanie — pokazuje surową listę rezerwacji tego indeksu, posortowaną rosnąco wg terminu. Warunki kwalifikacji (typ ZS/ZSC/ZR, status, termin) są identyczne jak w trybie @documentID.
Zwraca tylko indeksy, dla których stan magazynu nie pokrywa rezerwacji:
| Kolumna | Opis |
|---|---|
itemID, itemCode, itemName |
indeks |
stockQuantity |
stan bieżący na magazynie dokumentu (wms.stockBalance) |
reservationQuantity |
wyliczona rezerwacja |
availableQuantity |
stockQuantity - reservationQuantity (zawsze < 0 w wyniku) |
Zasady wyliczania:
- pod uwagę brane są pozycje rozchodowe dokumentu (
sign = -1,status >= 0,itemQuantity > 0) — uwaga: komentarz w skrypciedocument.documentLinebłędnie podawał0, faktycznie rozchód to-1 - rezerwacja = SUM(
orderLine.itemQuantityLeft) z niezrealizowanych pozycji ZS, ZSC, ZR (orderLineStatus >= 1 and < 3,itemQuantityLeft > 0) z wypełnionym terminem —isnull(orderLine.orderLineExpectedDate, order.orderExpectedDate); pozycja bez terminu nie rezerwuje - magazyn: zamówienie z
warehouseID= magazyn dokumentu lub zamówienie bez magazynu (rezerwuje na każdym magazynie) - data odcięcia: termin zamówienia powiązanego z pozycją dokumentu, dla pozycji bez powiązania (lub bez terminu) — data dokumentu; brane są zamówienia z
termin <= data odcięcia(realizuje regułę sortowania rosnąco wg terminu) - gdy jeden indeks występuje na kilku pozycjach dokumentu, brana jest najpóźniejsza data odcięcia
- kryterium wyniku:
stan - rezerwacja < 0(zgodnie ze scenariuszem ZR2:10 - 10 = 0=> POWODZENIE) - realizowane zamówienie jest wliczane do rezerwacji, bo jego
itemQuantityLeftjest jeszcze > 0 (jak w scenariuszach z README) - typ ZR (79818C9D-B226-4E90-B262-2304EAA0FC16) jest uwzględniony w obu procedurach rezerwacji oraz w gałęziach przeliczających (
documentline_updateOrderRealizedQuantity,document.order_UpdateOrderStatus,erp.order_UpdateOrderStatus,erp.orderLine_InsertUpdate)
Weryfikacja scenariuszy z README:
| Scenariusz | stan | rezerwacja | dostępne | wynik |
|---|---|---|---|---|
| ZS4 @200 | 10 | 14 | -4 | niepowodzenie |
| ZS3 @200 | 10 | 12 | -2 | niepowodzenie |
| ZS3 @100 | 2 | 2 | 0 | POWODZENIE |
| ZR2 @200 | 10 | 10 | 0 | POWODZENIE |
Uwaga do scenariusza 1 w opisie: sumuje stan z dwóch magazynów (10 + 2), pozostałe scenariusze liczą stan per magazyn. Implementacja liczy per magazyn dokumentu — wynik (niepowodzenie) jest ten sam.