Sklady a rezervace
Sklady a rezervace
Zkopírovat odkaz na sekciSklady
Skladová zásoba je množství produktu, které je k dispozici k prodeji. Skladové zásoby jsou důležité pro správné fungování e-shopu, protože zajišťují, že zákazník může nakoupit pouze produkty, které jsou skladem.
Skladovost dále ovlivňuje viditelnost produktů v seznamech (toto je ale ovlivněno i dalšími faktory, jako je např. dostupnost daného produktu).
E-shop podporuje evidenci skladových zásob na více skladech. Ve výchozím stavu jsou pro zákazníka dostupné všechny sklady.
Projektově lze určit, které sklady jsou pro zákazníka dostupné. Toto se zajistí implementací těchto rozhraní:
- com.fg.cps.eshop.productQuantity.service.PublishedProductStockProvider
- com.fg.cps.eshop.order.service.stock.OrderStockProvider
Zkopírovat odkaz na sekciPublishedProductStockProvider
Provider, který poskytuje seznam skladů, pro které se má zohledňovat skladové množství u publikovaných produktů na FE. To je důležité pro zobrazení produktů na FE, kdy skladová zásoba může ovlivňovat viditelnost produktu v seznamech a také možnost zakoupení produktu.
Pro registraci provideru je nutné implementovat rozhraní PublishedProductStockProvider a zaregistrovat ho ve Spring kontextu e-shop modulu.
Implementace tohoto rozhraní musí být sladěna s implementací com.fg.cps.eshop.order.service.stock.OrderStockProvider.
Příklady projektového použití mohou být:
- V případě, že existuje systémový (origin) katalog a ostatní katalogy z něj dědí, mohou být pro tyto katalogy k dispozici pouze skladové zásoby z některých skladů. V tomto případě je nutné implementovat provider, který bude vracet skladové zásoby podle aktuálního katalogu.
- Pro různé uživatele mohou být k dispozici různé skladové zásoby, např. na základě role uživatele nebo jiných kritérií. V tomto případě je nutné implementovat provider, který bude vracet skladové zásoby podle aktuálního uživatele.
Pro získání aktuálního uživatele, pro které jsou sklady vyhodnocený je doporučeno použít následující způsob:
1 // contextSimulator je spring bean `com.fg.cps.eshop.publishing.service.simulation.PublishedEntityContextSimulator`2final CommonUser actualUser = ofNullable(contextSimulator.getUser())3 .orElseGet(AbstractUserManager::getLoggedInUser);
Pokud takto získaný uživatel je null jedná se o anonymního uživatele.
Je nutné počítat s tím, že produkty se načítají i mimo kontext přihlášeného uživatele (např. pro feedy nebo fulltext), a s těmito případy musí případná implementace počítat. Například vracet skladové zásoby stejné jako pro anonymního uživatele.
Zkopírovat odkaz na sekciOrderStockProvider
Provider, který poskytuje seznam skladů, proti kterým se má validovat skladové množství a vytvářet rezervace pro danou objednávku/košík.
Výchozí implementace vrací všechny aktivní sklady.
Pro registraci provideru je nutné implementovat rozhraní OrderStockProvider a zaregistrovat ho ve Spring kontextu e-shop modulu.
Implementace tohoto rozhraní musí být sladěna s implementací com.fg.cps.eshop.productQuantity.service.PublishedProductStockProvider.
Zkopírovat odkaz na sekciRezervace objednaného zboží
S vyhodnocením dostupného skladového množství souvisí i rezervace objednaného zboží.
Rezervace objednaného množství zajišťuje, že nelze objednat více kusů produktu, než je skladem, v okamžiku, kdy vznikla objednávka, ale ještě se nestihlo aktualizovat skladové množství. Rezervace se vždy váže ke konkrétnímu skladu a produktu. Dále pak ke konkrétní objednávce nebo rezervaci na prodejně.
Strategie vytváření rezervací je určena implementací com.fg.cps.eshop.order.service.stock.ProductQuantityBookingStrategy. Výchozí chování je takové, že rezervace vzniká v momentě vytvoření objednávky a vzniká na dostupných skladech postupně podle priority skladů. Tedy nejprve se vytvoří rezervace na primárním skladě, pokud je dostupné množství na primárním skladě nedostatečné, tak se vytvoří rezervace na sekundárním skladě a tak dále.
Toto výchozí chování lze ovlivnit vlastní implementací ProductQuantityBookingStrategy a registrací této implementace ve Spring kontextu e-shop modulu.
Princip rezervace objednaného množství je následující:
- Při vytvoření objednávky se vytvoří rezervace na množství objednávaného produktu. Rezervace je ve stavu BOOKED. Tento stav znamená, že rezervace ponižuje dostupné skladové množství na odpovídajících skladech. V případě, že dojde ke změně skladového množství na skladě, tak tato změna nemá vliv na rezervace, protože objednávka nebyla ještě zpracována a tedy ani nedošlo k aktualizaci skladového množství (např. v ERP).
- Z tohoto stavu může rezervace přejít do stavu CANCELLED, v případě zrušení objednávky, nebo do stavu ORDERED.
- Stav ORDERED znamená, že objednávka byla zpracována (standardně v ERP), a tedy došlo k ponížení skladového množství v primárním skladovém systému. Pokud tedy následně dojde k aktualizaci skladového množství na e-shopovém skladě, dojde i k uvolnění rezervace a již se s ní nepočítá.
- Do stavu ORDERED se objednávka dostává v případě, že je u objednávky nastaven údaj bookingExpiration (k tomu slouží modifikace OrderModificationSetBookingExpiration). Ve výchozím nastavení k této události dochází v momentě, kdy je objednávka převedena do stavu processing-order (zpracovaná). Toto výchozí chování lze konfiguračně ovlivnit, viz. konfigurace objednávek a atribut bookingExpirationState.
Příklad vytvoření standardní rezervace objednaného zboží:
- Produkt "A" je skladem 5 ks.
- V čase T vznikne objednávka na 3 ks produktu "A".
- Dostupné množství produktu "A" se sníží na 2 ks a vytvoří se rezervace na 3 ks produktu "A". Rezervace je ve stavu BOOKED.
- V čase T+1 dojde k aktualizaci skladového množství na 4 ks. Rezervace zůstává na 3 ks a je stále ve stavu BOOKED. Dostupné množství je 1 ks, tedy 4 ks skladem - 3 ks rezervace.
- V čase T+2 dojde k aktualizaci objednávky na stav processing-order. Rezervace se převede do stavu ORDERED. Rezervace je stále na 3 ks, skladem 4 ks a dostupné množství je 1 ks.
- V čase T+3 dojde k opětovné aktualizaci skladového množství na 1 ks. Rezervace je ve stavu ORDERED, dochází k uvolnění rezervace, protože je již započítána do aktuálního skladového množství, a přepnutí do stavu FINISHED. Dostupné množství je tedy 1 ks.