EdeeShop · Implementace

Modifikace objednávky

Upraveno

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:

java
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é:

  1. Implementovat OrderModification.
  2. V případě, že OrderModification neimplementuje OrderModificationWithExecute, je nutné implementovat OrderModificationStrategy a 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:

json
[  {    "type": "OrderContactModification",    "customerEmail": "email+example@fg.cz",    "customerPhone": "+420777888999"  }]

OrderBillingAddressModification

Akce pro změnu billing address zákazníka u objednávky

Payload:

json
[  {    "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:

json
 [  {    "type": "PaidOrder",    "paid": null  }]

OrderModificationAddItem

Akce pro přidání položky do objednávky

Payload:

json
[  {    "type": "OrderModificationAddItem",    "itemCode": "pr01",    "quantity": 5,    "modificationDate": null,    "adjustment": null  }]

OrderModificationRemoveItem

Akce pro smazání položky z objednávky

Payload:

json
[  {    "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:

json
[  {    "type": "OrderModificationSetBookingExpiration",    "bookingExpiration": null  }]

OrderModificationSetItem

Akce, která dává možnost upravení položky objednávky.

Payload:

json
[  {    "type": "OrderModificationSetItem",    "itemId": "%s",    "quantity": 7,    "modificationDate": null  }]

SetDateOfTaxableSupplyModification

Akce pro nastavení Datumu zdanitelného plnění.

Payload:

json
[  {    "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:

json
[  {    "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:

json
[  {    "type": "SetItemStatusModification",    "itemId": 123,    "status": "whatever"  }]

AffiliateOrderModification

Modifikace upravující záznam o odeslání objednávky do Affiliate služby.

Payload:

json
[  {    "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:

json
[  {    "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:

json
[  {    "type": "OrderDeliveryAddressModification",    "deliveryAddress": {      "fullName": "xxx",      "street": "",      "city": "",      "postCode": "",      "countryCode": "",      "countryRegionCode": "",      "companyName": "",      "phone": "",      "idUserAddress": null    }  }]

CancelOrder

Modifikace, která stornuje objednávku.

Payload:

json
[  {    "type": "CancelOrder",    "dateOfCancel": null,    "note": null  }]

SetOrderState

Modifikace, která upravuje stav objednávky

Payload:

json
[  {    "type": "SetOrderState",    "nextState": "processing-order",    "dateOfState": null,    "note": null,    "checkIfNStateIsRequired": true  }]

ReadyForPickUpModification

Payload:

json
[  {    "type": "ReadyForPickUpModification",    "created": null,    "internalNote" :null,    "items": [{"orderLineId": 1, "quantity": 1}]  }]