Magento 2 z MSI potrafi bardzo dobrze obsługiwać wieloźródłowy magazyn, rezerwacje i salable quantity. Problem zaczyna się wtedy, gdy ten mechanizm trafia do wdrożenia, w którym realnym źródłem prawdy o stanach nie jest Magento, ale ERP albo zewnętrzny WMS. W takim modelu logika rezerwacji często nadal działa, ale biznesowo przestaje być potrzebna. Zamiast pomagać, zaczyna zaburzać obraz dostępności.
To jeden z tych problemów, które przez długi czas wyglądają niepozornie. Sklep działa, zamówienia wpadają, importy stanów przebiegają poprawnie, a mimo to z czasem pojawiają się pytania:
- dlaczego
salable quantitynie zgadza się ze stanem z ERP - dlaczego produkt jest niedostępny, skoro ERP pokazuje dostępność
- dlaczego w
inventory_reservationsą setki tysięcy albo miliony wpisów - dlaczego diagnoza problemów stockowych w Magento staje się coraz trudniejsza
W praktyce to bardzo częsty scenariusz w sklepach, które są już dojrzałe integracyjnie i działają w modelu ERP-first.
Gdzie zaczyna się problem
W standardowym Magento 2 z MSI wpisy do inventory_reservation pojawiają się przy składaniu zamówień, a później są kompensowane przez kolejne operacje, takie jak wysyłka czy anulowanie. W teorii wszystko jest spójne. W praktyce, jeśli sklep regularnie nadpisuje stany z ERP, Magento nie jest jedynym źródłem prawdy i nie zarządza stanem magazynowym samodzielnie.
To oznacza, że dwie logiki zaczynają działać równolegle:
- ERP ustala faktyczny stan dostępności
- Magento nadal utrzymuje własną warstwę rezerwacji
Jeżeli taka architektura nie została świadomie uporządkowana, pojawiają się rozjazdy. Nie zawsze od razu, ale z czasem niemal zawsze.
Objawy, które widzimy w projektach
Najczęściej problem wychodzi na jaw w jednej z kilku postaci.
1. salable quantity jest niższe niż stan z ERP
To najczęstszy przypadek. Zespół po stronie sklepu widzi, że ERP pokazuje dostępność, a Magento nadal blokuje sprzedaż albo zaniża liczbę sztuk możliwych do kupienia.
2. Tabela inventory_reservation stale rośnie
W sklepach z większym wolumenem zamówień ta tabela potrafi rosnąć bardzo szybko. Sam wzrost nie jest jeszcze błędem, ale w modelu ERP-first bardzo często staje się po prostu zbędnym kosztem utrzymania i kolejnym miejscem, które zaciemnia realny obraz stanu magazynowego.
3. Trudniejsza diagnostyka problemów magazynowych
Gdy dostępność produktu zależy jednocześnie od importu ERP, indeksacji Magento i zapisanych rezerwacji MSI, diagnoza przestaje być prosta. Zespół musi analizować, czy problem jest po stronie importu, indeksu, stocka, source assignment czy właśnie tabeli inventory_reservation.
4. Konflikty między importem a bieżącą logiką Magento
W niektórych wdrożeniach Magento zachowuje się poprawnie z punktu widzenia własnych reguł, ale niezgodnie z oczekiwaniami biznesu. To ważne rozróżnienie. System nie musi być zepsuty technicznie, żeby działał nieprawidłowo w danym modelu operacyjnym.
Dlaczego standardowe podejście nie zawsze wystarcza
W teorii można powiedzieć: skoro Magento ma MSI, to wystarczy pozwolić mu działać. Problem w tym, że MSI nie zostało zaprojektowane specjalnie pod każdy model integracji ERP. W części wdrożeń jest to architektura idealna. W innych wymaga świadomego uproszczenia.
Nie chodzi o to, żeby walczyć z Magento. Chodzi o to, żeby usunąć z procesu te elementy, które w danym wdrożeniu nie niosą już wartości, a zaczynają szkodzić.
W środowisku ERP-first zwykle ważniejsze są:
- zgodność ze stanem z ERP
- przewidywalność działania
- szybka automatyzacja
- mała liczba miejsc, w których mogą powstawać rozjazdy
Jeżeli rezerwacje MSI nie są realnie wykorzystywane jako mechanizm ochrony stanów, ich regularne czyszczenie bywa po prostu najbardziej praktycznym rozwiązaniem.
Jak podchodzimy do rozwiązania
W takich projektach nie próbujemy "naprawiać MSI" ani odtwarzać historii rezerwacji. To zwykle prowadzi do nadmiarowej złożoności. Zamiast tego wychodzimy od pytania, jaki model działania ma sklep.
Jeżeli sklep działa w modelu:
- ERP jako źródło prawdy
- cykliczny import stanów do Magento
- akceptacja krótkiego opóźnienia między ERP a sklepem
- brak potrzeby utrzymywania trwałych rezerwacji po stronie Magento
to najrozsądniejszym kierunkiem jest kontrolowane, szybkie i bezpieczne czyszczenie inventory_reservation.
Co jest ważne w takim rozwiązaniu
Samo "usunięcie rekordów" to za mało. Takie rozwiązanie musi być przewidywalne operacyjnie.
Dlatego zwracamy uwagę na kilka elementów:
- możliwość uruchamiania automatycznie z CRON
- możliwość ręcznego uruchamiania z CLI
- blokada przed równoległym wykonaniem
- tryb diagnostyczny bez usuwania danych
- opcjonalna reindeksacja po procesie
- możliwość uruchamiania tylko w określonych środowiskach
- sensowny model wydajnościowy dla dużych tabel
Właśnie z tego podejścia powstał nasz moduł.
Kowal Reservation Cleaner dla Magento 2
Dla projektów, w których problem z MSI reservations wracał regularnie, przygotowaliśmy własny moduł: Kowal Reservation Cleaner dla Magento 2.
To narzędzie stworzyliśmy z myślą o wdrożeniach ERP-first, gdzie inventory_reservation ma być utrzymywane w stanie czystym albo przynajmniej pod pełną kontrolą.
Moduł nie usuwa MSI z Magento i nie modyfikuje core. Jego zadaniem jest uporządkowanie warstwy rezerwacji w taki sposób, aby sklep zachował:
- zgodność z przyjętym modelem synchronizacji stanów
- przewidywalne działanie po imporcie ERP
- prostszą diagnostykę dostępności
- mniejsze ryzyko zaniżonego
salable quantity
Jak działa nasz moduł
Moduł wspiera trzy podstawowe tryby pracy.
full_reset
To tryb najprostszy i zwykle najbardziej praktyczny. Jeśli czyszczenie ma objąć wszystkie stocki, moduł wykorzystuje bardzo szybkie:
TRUNCATE TABLE inventory_reservation
To ważne, bo przy dużych sklepach i dużych tabelach zwykły masowy DELETE potrafi być niepotrzebnie ciężki.
log_only
Ten tryb służy do diagnostyki. Nie usuwa danych, ale pozwala obserwować, jak szybko rośnie tabela rezerwacji i czy wdrożenie rzeczywiście wymaga automatycznego czyszczenia.
clean_after_erp_sync
To wariant dla zespołów, które chcą jasno powiązać moment czyszczenia z harmonogramem importu ERP. Przykładowo: ERP synchronizuje stany o 02:00, a moduł czyści rezerwacje o 02:10.
Czyszczenie tylko dla wybranych stocków
To jedna z funkcji, które szczególnie dobrze sprawdzają się w bardziej złożonych wdrożeniach multi-stock.
Nie każdy sklep chce czyścić całą tabelę inventory_reservation. Czasem problem dotyczy tylko wybranych stocków, konkretnych kanałów albo wydzielonego modelu logistycznego. W takich sytuacjach moduł pozwala ograniczyć czyszczenie tylko do wskazanych stock_id.
To oznacza, że:
- dla wszystkich stocków można użyć bardzo szybkiego
TRUNCATE - dla wybranych stocków moduł przechodzi na selektywne
DELETE
To kompromis między wydajnością i kontrolą. W wielu wdrożeniach właśnie taki kompromis jest potrzebny.
CRON, CLI i bezpieczeństwo procesu
Moduł można uruchamiać automatycznie z Magento CRON lub ręcznie przez CLI. To ważne, bo różne sklepy mają różne modele integracyjne.
W praktyce spotykamy dwa najczęstsze scenariusze:
- czyszczenie uruchamiane o konkretnej godzinie z harmonogramu Magento
- czyszczenie wywoływane bezpośrednio po imporcie ERP przez skrypt integracyjny
Moduł został wyposażony w:
- mechanizm locka
- logowanie do pliku
- kontrolę czasu wykonania
- możliwość
dry-run - opcjonalną reindeksację
- opcjonalny cache clean
To są drobiazgi, które na etapie opisu produktu wyglądają technicznie, ale na produkcji decydują o tym, czy rozwiązanie da się utrzymać bez nerwów.
Co daje to biznesowo
Z perspektywy operacyjnej najważniejsze korzyści są dość konkretne:
- mniejsza liczba problemów z dostępnością produktów
- lepsza zgodność między Magento i ERP
- mniej czasu traconego na diagnozę stanów
- prostszy model utrzymania MSI w sklepie
- możliwość zautomatyzowania procesu bez modyfikacji core
To nie jest moduł "dla każdego sklepu Magento". I właśnie to jest jego zaletą. Został zaprojektowany dla konkretnego typu wdrożeń, które naprawdę zmagają się z tym problemem.
Kiedy warto rozważyć takie rozwiązanie
Jeżeli w Twoim sklepie:
- stany są regularnie nadpisywane z ERP
- Magento nie powinno być główną warstwą zarządzania zapasem
inventory_reservationrośnie i utrudnia analizęsalable quantityrozjeżdża się z realnym stanem- zespół potrzebuje prostszego modelu działania
to regularne czyszczenie rezerwacji może być rozsądnym kierunkiem.
Oczywiście nie zawsze. W sklepach, które polegają na natywnej logice MSI jako kluczowym mechanizmie kontroli stanów, takie podejście nie będzie właściwe. Dlatego najpierw trzeba zrozumieć model biznesowy, a dopiero potem dobierać rozwiązanie.
Podsumowanie
Problem z inventory_reservation w Magento 2 nie wynika zwykle z tego, że MSI jest "złe". Wynika z tego, że mechanizm zaprojektowany do jednego modelu działania bywa używany w innym modelu, najczęściej mocno zintegrowanym z ERP.
W takich wdrożeniach najważniejsza nie jest maksymalna złożoność, ale przewidywalność i spójność z realnym procesem magazynowym. Dlatego w części sklepów najlepszym rozwiązaniem okazuje się nie rozbudowa logiki MSI, ale jej świadome uproszczenie.
Jeżeli szukasz gotowego rozwiązania dla tego scenariusza, zobacz nasz moduł: Kowal Reservation Cleaner dla Magento 2.
Jeśli natomiast najpierw chcesz ocenić, czy Twój sklep rzeczywiście ma ten problem, warto zacząć od analizy modelu synchronizacji stanów, sposobu wykorzystania MSI i zachowania salable quantity po imporcie ERP.
Źródła
- Strona produktu
Kowal Reservation Cleaner dla Magento 2: https://kowal.store/kowal-reservation-cleaner-dla-magento-2
