Aktualizace nákupní košíku

Aktualizace nákupní košíku

Tento dokument popisuje postup aktualizace a modifikace obsahu nákupního košíku.

Aktualizace košíku se vždy provádí metodou ShoppingCartService#updateCart.

Tato operace je rozčleněna do tří částí: beforeCartUpdateInterceptor, cartUpdate a afterCartUpdateInterceptor. Všechny tyto části se však vykonávají v rámci jedné transakce.

Zkopírovat odkaz na sekciCartUpdate

Každá aktualizace košíku (dále jen cartUpdate) implementuje rozhraní com.fg.cps.eshop.cart.service.update.CartUpdate. CartUpdate nese parametry aktualizace, např. "přidání produktu" nese identifikaci produktu, který se má přidat do košíku a také požadované množství.

Každá implementace CartUpdate pak musí být zaregistrována do com.fg.cps.eshop.order.OrderFeature:

java
1 final OrderFeature orderFeature = getFeature(OrderFeature.class);2if (orderFeature.isFeatureEnabled() && getFeature(RestApiFeature.class).isFeatureEnabled()) {3    orderFeature.addCartUpdate(ActivateMarketingCampaignUpdate.class);4}

Důvodem je nutné inicializace serializace a deserializace cartUpdate pro RestApi.

Zkopírovat odkaz na sekciCartUpdateAffectingPrices

V případě, že cartUpdate implementuje CartUpdateAffectingPrices, znamená to, že cartUpdate má vliv na celkovou cenu objednávku a je nutné např. přepočítat cenové politiky. Typickým příkladem je přidání produktu do košíku nebo uplatnění slevového poukazu. Příkladem aktualizace, která nemá vliv na cenu může být např. změna fakturační adresy nebo přidání poznámky k objednávce.

Zkopírovat odkaz na sekciCartUpdater

Každý cartUpdate musí mít odpovídající implementaci CartUpdater, který zajistí zpracování aktualizace. CartUpdater je nutné zaregistrovat do aplikačního (spring) kontextu EdeeShop modulu.

V případě jednoduchých updatů (např. změna nevyžaduje žádnou servisní třídu) může cartUpdate implementovat CartUpdateWithExecute. Pro takový cartUpdate již nemusí existovat CartUpdater.

Zkopírovat odkaz na sekciCartUpdateInterceptor

Před každým cartUpdate je možné registrovat BeforeCartUpdateInterceptor. Tyto interceptory jsou vhodné například pro validaci dat v cartUpdate.

Po vykonání cartUpdate je možné přidat AfterCartUpdateInterceptor. Tyto interceptory jsou vhodné například k ověření dat v košíku, přepočtu cen a slev nebo k automatickým úpravám dat v košíku.

Zkopírovat odkaz na sekciZpracování chyby

V případě, že cartUpdate nebo některý interceptor selže, musí být vyvolána chyba. Pokud se jedná o uživatelskou chybu, např.: uživatel zadal neplatná data pro daný okamžik nebo na ně nemá práva, měla by být vyvolána lokalizovaná CartUpdateException, která se zpropaguje přímo uživateli. Pokud však nastala při zpracování neočekávaná interní chyba, lze použít klasické výjimky např.: IllegalArgumentException. Celá aktualizace (tj. beforeCartUpdateInterceptor, cartUpdate, afterCartUpdateInterceptor) se vykonává v jedné transakci, tudíž pokud něco selže, provede se rollback celé aktualizace. V případě, že rollback celé aktualizace není žádoucí, je možné vyvolat výjimku CartUpdateNoRollbackException, která rollback transakce neprovede.

Zkopírovat odkaz na sekciZápis do dat košíku

Data košíku jsou reprezentována CartData (a jeho rozšířením). Pro zápis existuje CartDataWriter. Toto rozhraní je "skryté", protože nechceme umožnit měnit košík jinak než přes ShoppingCartService#updateCart. V rámci cartUpdate a cartUpdateInterceptor je však možné CartData přetypovat na CartDataWriter a tak do něj zapisovat.

Zápis přes CartDataWriter mimo ShoppingCartService#updateCart může způsobit nekonzistentní stav košíku.

Tento "writer" mechanismus platí i pro vnořená data košíku, tedy položky, dopravy, platby, politiky a adresy. Např. pro CartItem existuje CartItemWriter.

Poznámka: K vytváření těchto vnořených dat, je nutné používat odpovídající metody na CartContext (více viz popis nákupního košíku).

Zkopírovat odkaz na sekciBeforeCartUpdateEvent a AfterCartUpdateEvent

Před a po aktualizaci košíku se vypalují BeforeCartUpdateEvent a AfterCartUpdateEvent.

Zkopírovat odkaz na sekciVytvoření vlastní aktualizace košíku

Pro vytvoření nové aktualizace košíku je potřeba:

  1. Vytvořit novou implementaci com.fg.cps.eshop.cart.service.update.CartUpdate (dále cartUpdate).
  2. Implementovat com.fg.cps.eshop.cart.service.CartUpdater (neplatí pokud cartUpdate implementuje CartUpdateWithExecute).

Zkopírovat odkaz na sekciZprávy aktualizace košíku

Během aktualizace košíku se mohou vyskytnout různé situace, o kterých je potřeba informovat zákazníka. Rejstřík všech možných zpráv se nachází zde.

Zkopírovat odkaz na sekciDalší možnosti přizpůsobení

Zkopírovat odkaz na sekciCartContextPriceListResolver

Pomocí implementace CartContextPriceListResolver je možné ovlivnit ceníky, které se použijí při výpočtech v košíku. Pokud není toto rozhraní implementováno, tak se použije výchozí seznam ceníků získaný pomocí PriceResolver#getPriceListCodesForCurrentUser(Catalog).

Zkopírovat odkaz na sekciSystémové implementace aktualizace košíku

V této sekci budou popsané již existující systémové implementace aktualizace košíku a jejich JSON payload.

Zkopírovat odkaz na sekciAddItemByIdToCart

Tato aktualizace slouží k přidání položku do košíku pomoci id produktu. Nepovinne parametry:

  • adjustment
  • source
  • sourceId Payload:
json
1 {2	"type": "AddItemByIdToCart",3	"productId": 123,4	"quantity": 1,5    "adjustment": "xxx", 6    "source": "source",7    "sourceId": 123 8}

Zkopírovat odkaz na sekciAddItemByCodeToCart

Tato aktualizace slouží k přidání položku do košíku pomoci kodu produktu. Nepovinné parametry:

  • adjustment
  • source
  • sourceId Payload:
json
1 {2	"type": "AddItemByCodeToCart",3	"productCode": "kolecko-cerne",4	"quantity": 1,5    "adjustment": "xxx", 6    "source": "source",7    "sourceId": 123 8}

Zkopírovat odkaz na sekciAddItemsByCodeToCart

Tato aktualizace slouží k přidání více položek do košíku Nepovinné parametry:

  • adjustment
  • source
  • sourceId Payload:
json
1 {2	"type": "AddItemsByCodeToCart",3	"items": [4		{5			"productCode": "kolecko-cerna",6			"quantity": 1			7		},8		{9				"productCode": "kolecko-cerna",10				"quantity": 111		}12	],13      "source": "source",14      "sourceId": 12315}

Zkopírovat odkaz na sekciAddItemsByIdToCart

Tato aktualizace slouží k přidání více položek do košíku Nepovinné parametry:

  • adjustment
  • source
  • sourceId Payload:
json
1 {2	"type": "AddItemsByIdToCart",3	"items": [4		{5			"productId": 123,6			"quantity": 1			7		},8		{9				"productCode": 321,10				"quantity": 111		}12	],13      "source": "source",14      "sourceId": 12315}

Zkopírovat odkaz na sekciSetItemQuantity

Nastaví počet kusů existujicí položky v košiku.

Payload:

json
1 {2	"type": "SetItemQuantity",3	"itemId": 377957122051,4	"quantity": 105}

Zkopírovat odkaz na sekciSetItemsQuantity

Nastaví počet kusů existujicích položek v košiku.

Payload:

json
1 {2	"type": "SetItemsQuantity",3	"items": [4		{5			"itemId": 377957122051,6			"quantity": 107		}8	]9}

Zkopírovat odkaz na sekciRemoveCartItem

Smazání položek z košíku, dle itemId položky.

Payload:

json
1 {2  "type": "RemoveCartItem",3  "itemIds": [4    3779571220505  ]6}

Zkopírovat odkaz na sekciContactInformationUpdate

Aktualizace konktatních informací košiku.

Payload:

json
1 {2	"type": "ContactInformationUpdate",3	"customerEmail": "vomacka@fg.cz",4	"customerPhone": "+420777888999",5	"billingAddress": {6		"fullName": "Pepa vomacka",7		"street": "Vomackova",8		"city": "Hradec kralove",9		"postCode": "50003",10		"countryCode": "CZ",11		"companyName": "FG",12		"regNumber": "",13		"taxRegNumber": "",14		"idUserAddress": 12315	},16	"deliveryAddress": {17		"fullName": "",18		"street": "",19		"city": "",20		"postCode": "",21		"countryCode": "",22		"phone": "",23		"companyName": "",24		"idUserAddress": 32125	},26	"differentDeliveryAddress": 1,27	"customerType": 0,28	"note": "Tohle je ta nejlepsi objednavka."29
30}

Zkopírovat odkaz na sekciInitDefaultShippingUpdate

Akce nastaví původní hodnotu pro dopravu. Payload:

json
1 {2	"type": "InitDefaultShippingUpdate"3}

Zkopírovat odkaz na sekciSetShippingByCodeUpdate

Akce nastaví dopravu dle kódu dopravy. Payload:

json
1 {2	"type": "SetShippingByCodeUpdate",3	"shippingCode" : "osobni-odber"4}

Zkopírovat odkaz na sekciSetShippingByIdUpdate

Akce nastaví dopravu dle id dopravy. Payload:

json
1 {2	"type": "SetShippingByIdUpdate",3	"shippingId" : 1234}

Zkopírovat odkaz na sekciSetPickupPointByCodeUpdate

Nastaví místo osobního odběru, dle kódu odběrového místa.

Payload:

json
1 {2	"type": "SetPickupPointByCodeUpdate",3	"pickupPointCode": "xxx"4}

Zkopírovat odkaz na sekciSetPickupPointByIdUpdate

Nastaví místo osobního odběru, dle id odběrového místa.

Payload:

json
1 {2	"type": "SetPickupPointByIdUpdate",3	"pickupPointId": xxx4}

Zkopírovat odkaz na sekciInitDefaultPaymentUpdate

Nastaví výchozí typ platbu pro košík zakazníka

Payload:

json
1 {2	"type": "InitDefaultPaymentUpdate"3}

Zkopírovat odkaz na sekciSetPaymentByCodeUpdate

Nastaví platbu dle kódu pro košík zakazníka. Payload:

json
1 {2	"type": "SetPaymentByCodeUpdate",3	"paymentCode" : "hotove"4}

Zkopírovat odkaz na sekciSetPaymentByIdUpdate

Nastaví platbu dle id pro košík zakazníka. Payload:

json
1 {2	"type": "SetPaymentByCodeUpdate",3	"paymentId" : 1234}

Zkopírovat odkaz na sekciConfirmOrder

Transformace (Potvrzení) aktualního košiku do objednávky

Payload:

json
1 {2	"type": "ConfirmOrder"3}

Zkopírovat odkaz na sekciRefreshCart

Aktualizace košíku.

Payload:

json
1 {2	"type": "RefreshCart"3}

Zkopírovat odkaz na sekciShoppingCartPageConfirm

Payload:

json
1 {2	"type": "ShoppingCartPageConfirm"3}

Zkopírovat odkaz na sekciVoucherUseUpdate

Přiřazení voucheru k aktualnímu košíku.

Payload:

json
1 {2	"type": "VoucherUseUpdate",3	"voucherCode": "xxx"4}

Zkopírovat odkaz na sekciVoucherCancelUpdate

Smazaní voucheru z aktualního košíku. Payload:

json
1 {2  "type": "VoucherCancelUpdate",3  "voucherCode": "xxx"4}

Zkopírovat odkaz na sekciCreditUpdate

Slouží k nastavení použití kreditů v košíku.

Payload:

json
1 {2	"type": "CreditUpdate",3	"useCredit": true4}

Zkopírovat odkaz na sekciSelectBundleBonus

Vybere bonusový produkt v košíku.

Payload:

json
1 {2	"type": "SelectBundleBonus",3	"bundleId": 1,4	"bonusProductId": 1,5	"requiredCartItemId": 1,6	"index": 1,7	"selected": true8}

Zkopírovat odkaz na sekciBundleBonusChangeQuantity

Změní počet kusů bonusového produktu

Payload:

json
1 {2	"type": "BundleBonusChangeQuantity",3	"bundleId": 1,4	"bonusProductId": 1,5	"requiredCartItemId": 1,6	"index": 1,7	"quantity": "1"8}

Zkopírovat odkaz na sekciSelectBonusVariant

Vybere varianu bonusového produktu.

Payload:

json
1 {2  "type": "SelectBonusVariant",3  "bundleId": 1,4  "bonusProductId": 1,5  "requiredCartItemId": 1,6  "index": 1,7  "selectedVariantCode": "tadada"8}

Zkopírovat odkaz na sekciSelectNoBonus

Zruší vybraný bonusový produkt.

Payload:

json
1 {2	"type": "SelectNoBonus",3	"bundleId": 1,4	"requiredCartItemId": 15}

Zkopírovat odkaz na sekciZboziGdprOptionUpdate

Potvrzení GDPR v rámci košíku.

Payload:

json
1 {2	"type": "ZboziGdprOptionUpdate",3	"zboziGdprOption" : 14}

Zkopírovat odkaz na sekciHeurekaOverenoOptionUpdate

Potvrzení heureky v rámci košíku.

Payload:

json
1 {2	"type": "HeurekaOverenoOptionUpdate",3	"heurekaOverenoOption" : 14}