Modifikace objednávky
OrderModification
Modifikaci (změnu) u objednávky lze provést pomocí AbstractOrderService#modifyOrder.
Definice modifikace je určena implementací OrderModification.
Celá modifikace (tzn. beforeModificationInterceptor, orderModification, afterModificationInterceptor, afterOrderModificationEvent) probíhá v rámci jedné transakce. Modifikace je možné provádět více najednou, ale všechny probíhají v rámci téže transakce.
OrderModificationWithExecute a OrderModificationStrategy
V případě, že orderModification implementuje OrderModificationWithExecute, zajišťuje i zpracování modifikace.
V ostatních případech je nutné pro orderModification zaregistrovat implementaci OrderModificationStrategy.
OrderModificationWithExecute je vhodné pro jednoduché modifikace, které nepotřebují další servisní beany.
Příklad:
public class SetInternalNumberModification implements OrderModificationWithExecute<SetInternalNumberModification>, OrderStateResistantModification { private static final long serialVersionUID = -3019485241477923843L; private final String internalNumber;
@Override public void execute(@NonNull OrderModificationContext modificationContext, @NotNull SetInternalNumberModification modification) { modificationContext.getOrder().setInternalNumber(modification.getInternalNumber()); }}OrderModificationAffectingPrices
V případě, že orderModification implementuje OrderModificationAffectingPrices, znamená to, že orderModification má vliv na celkovou cenu objednávky a je nutné např. přepočítat celkové ceny. Typickým příkladem je přidání produktu do objednávky. Modifikace, která nemá vliv na cenu, může být např. změna fakturační adresy nebo přidání poznámky k objednávce.
OrderStateResistantModification
Pro modifikace, na kterých nezáleží na aktuálním stavu objednávky, lze použít interface OrderStateResistantModification. Tedy při modifikaci objednávky se nekontroluje její stav.
AfterModificationInterceptor a BeforeModificationInterceptor
Do procesu modifikace lze zasáhnout pomocí implementací BeforeModificationInterceptor nebo AfterModificationInterceptor.
OrderModificationException
V případě chyby při modifikaci je vyvolána OrderModificationException.
AfterOrderModificationEvent
Po provedení modifikace je vyvoláno událostní AfterOrderModificationEvent.
Vytvoření vlastní modifikace
Pro vytvoření vlastní modifikace je nutné:
- Implementovat OrderModification.
- V případě, že
OrderModificationneimplementujeOrderModificationWithExecute, je nutné implementovatOrderModificationStrategya zaregistrovat do Spring kontextu.
OrderStorage
Obvykle se doporučuje upravovat objednávku pomocí OrderModification.
Pokud však není možné použít OrderModification, existuje služba OrderStorage,
která umožňuje načítání a ukládání objednávky. Při ukládání se však obejde všechny validace a případné automatické přepočty, které by jinak zajišťovala změna pomocí OrderModification.
Rest API a Modifikace objednávky
Typy modifikací
OrderContactModification
Akce pro změnu e-mailu a telefonu zákazníka uvnitř objednávky.
Payload:
[ { "type": "OrderContactModification", "customerEmail": "email+example@fg.cz", "customerPhone": "+420777888999" }]OrderBillingAddressModification
Akce pro změnu billing address zákazníka u objednávky
Payload:
[ { "type": "OrderBillingAddressModification", "billingAddress": { "fullName": "xxx", "street": "", "city": "", "postCode": "", "countryCode": "", "countryRegionCode": "", "companyName": "", "regNumber": "xxx", "taxRegNumber": "xxx", "idUserAddress": null } }]PaidOrder
Akce pro označení objednávky jako zaplacená
Payload:
[ { "type": "PaidOrder", "paid": null }]OrderModificationAddItem
Akce pro přidání položky do objednávky
Payload:
[ { "type": "OrderModificationAddItem", "itemCode": "pr01", "quantity": 5, "modificationDate": null, "adjustment": null }]OrderModificationRemoveItem
Akce pro smazání položky z objednávky
Payload:
[ { "type": "OrderModificationRemoveItem", "orderItemId": 1, "modificationDate": null }]OrderModificationSetBookingExpiration
Akce, která upravuje datum, kdy došlo k rezervaci zboží v primárním systému skladové evidence a je následně možné uvolnit rezervace, které si drží e-shop.
Payload:
[ { "type": "OrderModificationSetBookingExpiration", "bookingExpiration": null }]OrderModificationSetItem
Akce, která dává možnost upravení položky objednávky.
Payload:
[ { "type": "OrderModificationSetItem", "itemId": "%s", "quantity": 7, "modificationDate": null }]SetDateOfTaxableSupplyModification
Akce pro nastavení Datumu zdanitelného plnění.
Payload:
[ { "type": "SetDateOfTaxableSupplyModification", "dateOfTaxableSupply": null }]SetInternalNumberModification
Akce pro nastavení Interní čísla objednávky, které v základu nebude používáno, ale je připraveno custom využití na projektech především pro B2B e-shopy.
Payload:
[ { "type": "SetDateOfTaxableSupplyModification", "dateOfTaxableSupply": null }]SetItemStatusModification
Akce pro nastavení stavu řádku objednávky. Jedná se o libovolnou textovou informaci, se kterou se nijak dál nepracuje. Hodnotu lze pouze upravit a zobrazit na FE.
Payload:
[ { "type": "SetItemStatusModification", "itemId": 123, "status": "whatever" }]AffiliateOrderModification
Modifikace upravující záznam o odeslání objednávky do Affiliate služby.
Payload:
[ { "type": "AffiliateOrderModification", "status": "%s", "firstAttempt": "", "exported": "", "attemptCount": 1, "error": null }]OrderModificationPayment
Modifikace objednávky, která provede změnu platební metody.
Aby mohla být změna platby provedena musí být splněny následující předpoklady:
- Uplatnění poukazů, kreditů, dopravy zdarma apod není podmíněnou cenou za platbu.
- Nově zvolená platba musí být validní pro zvolenou dopravu, měnu, katalog. Tedy stejně jako by byla nabízena v košíku.
- Pokud se změní platba, musí se odeslat znovu notifikace o aktuálním stavu, kde jsou informace o platbě. Tedy v případě, že je ve stavu nová, odešle se notifikace o stavu nová.
- V případě jiné ceny za platbu se musí přepočítat celková částka k úhradě a výše uplatněných dárkových poukazů.
- Zaokrouhlení ceny k úhradě musí zohlednit nastavení nově zvolené platby.
- Platbu lze změnit pouze v případě, že objednávka je ve stavu nová nebo zpracovává se.
Payload:
[ { "type": "OrderModificationPayment", "newPaymentCode": "CASH_ON_DELIVERYDefault", "priceWithTax": 100, "priceWithoutTax": 82.64, "taxRate": 21 }]OrderDeliveryAddressModification
Modifikace aktualizuje dodací adresu u objednávky.
V případě, že fakturační a dodací adresa je stejná, tak se vytvoří nová dodací adresa a fakturační zůstane nezměněná.
Payload:
[ { "type": "OrderDeliveryAddressModification", "deliveryAddress": { "fullName": "xxx", "street": "", "city": "", "postCode": "", "countryCode": "", "countryRegionCode": "", "companyName": "", "phone": "", "idUserAddress": null } }]CancelOrder
Modifikace, která stornuje objednávku.
Payload:
[ { "type": "CancelOrder", "dateOfCancel": null, "note": null }]SetOrderState
Modifikace, která upravuje stav objednávky
Payload:
[ { "type": "SetOrderState", "nextState": "processing-order", "dateOfState": null, "note": null, "checkIfNStateIsRequired": true }]ReadyForPickUpModification
Payload:
[ { "type": "ReadyForPickUpModification", "created": null, "internalNote" :null, "items": [{"orderLineId": 1, "quantity": 1}] }]