Nákupní proces a objednávky
Tato kapitola popisuje konfiguraci objednávání produktů a nákupního košíku a správu objednávek.
Nákupní proces
Způsob práce s košíkem a jeho případné rozšíření je popsán zde.
Proces vytvoření objednávky z košíku je detailně vysvětlen v samostatné kapitole "Vytvoření objednávky z nákupního košíku".
Ceny v košíku je možné ovlivnit pomocí cenových politik.
Konfigurační soubor se standardně nachází v adresáři config/module-edeeshop/features/order/order.xml.
Způsob zaokrouhlení částky k úhradě je popsán zde.
Objednávka
Objednávka je reprezentována entitou Order. Jedná se o standardní ADAM entitu.
Objednávka obsahuje položky, adresy, uplatněné cenové politiky, dopravu a platbu. Tato data jsou na objednávku navázána jako "metadata-bundly".
Objednávky a i její data jako (položky, dopravy apod.) je možné rozšiřovat pomocí traitů. Traity se musí registrovat pomocí orderModelDescriptor.
OrderModelDescriptor orderModelDescriptor = orderFeature.getOrderModelDescriptor();orderModelDescriptor.addTrait(OrderWithVoucher.class); // Trait rozšiřující Order.classorderModelDescriptor.addTraitForSubModel(OrderItem.class, OrderItemWithEhub.class); // Trait rozšiřující bundle `items`orderModelDescriptor.addAdvice(CustomAdvice.INSTANCE); // Případné upravené vyhodnocení metod pomocí projektové `one.edee.oss.proxycian.recipe.Advice`, kde `CustomAdvice.INSTANCE` je nějaký staticky singleton Pro práci s objednávkami je určena třída AbstractOrderService.
Modifikace objednávek
Objednávky lze měnit/modifikovat, například přidat/měnit/odebrat položky, měnit stav, fakturační a dodací adresy apod. Možnosti modifikace jsou detailně popsány v kapitole "Modifikace objednávky".
Konfigurační soubor se standardně nachází v adresáři config/module-edeeshop/features/order/order.xml.
Příklad konfigurace
<order> <numberExpression>'E' + dateFormat('yyyy') + '-' + nextNumber(dateFormat('yyyy'),4)</numberExpression> <billingCountries> <billingCountry> <countryCode>CZ</countryCode> <region> <country>CZ</country> <currency>CZK</currency> <locale>cs</locale> </region> </billingCountry> </billingCountries> <bookingExpirationState>processing-order</bookingExpirationState> <cartExpiration>30d</cartExpiration> <cartImportKey/> <deliveryCountries> <deliveryCountry> <countryCode>CZ</countryCode> <region> <country>CZ</country> <currency>CZK</currency> <locale>cs</locale> </region> </deliveryCountry> </deliveryCountries> <maxCartItem>150</maxCartItem> <migrateAnonymousOrdersToActivatedUser/> <modifications> <addressModification/> <autoDispatchInterval/> <contactModification/> <itemModification/> <paymentModification/> <stateChecks> <stateCheck> <deliveryToPickupPoint/> <orderModificationType/> <orderState/> </stateCheck> </stateChecks> </modifications> <notificationConfig> <notifyQuicklyOnStates> <state>new-order</state> </notifyQuicklyOnStates> </notificationConfig> <optionalBillingAddress> <type/> </optionalBillingAddress> <optionalCustomerPhone/> <partDispatchConfig> <shippingTypeWhitelist/> </partDispatchConfig> <quantityRoundingDown/> <roundingRules> <roundingRule> <currency>CZK</currency> <paymentType/> <rounding>0</rounding> </roundingRule> </roundingRules> <voucherTaxStrategy/> <catalogSpecific> <catalogCode/> <numberExpression>'E' + dateFormat('yyyy') + '-' + nextNumber(dateFormat('yyyy'),4)</numberExpression> <billingCountries> <billingCountry> <countryCode>CZ</countryCode> <region> <country>CZ</country> <currency>CZK</currency> <locale>cs</locale> </region> </billingCountry> </billingCountries> <bookingExpirationState>processing-order</bookingExpirationState> <cartExpiration>30d</cartExpiration> <cartImportKey/> <deliveryCountries> <deliveryCountry> <countryCode>CZ</countryCode> <region> <country>CZ</country> <currency>CZK</currency> <locale>cs</locale> </region> </deliveryCountry> </deliveryCountries> <maxCartItem>150</maxCartItem> <modifications> <addressModification/> <autoDispatchInterval/> <contactModification/> <itemModification/> <paymentModification/> <stateChecks> <stateCheck> <deliveryToPickupPoint/> <orderModificationType/> <orderState/> </stateCheck> </stateChecks> </modifications> <notificationConfig> <notifyQuicklyOnStates> <state>new-order</state> </notifyQuicklyOnStates> </notificationConfig> <optionalBillingAddress> <type/> </optionalBillingAddress> <optionalCustomerPhone/> <partDispatchConfig> <shippingTypeWhitelist/> </partDispatchConfig> <quantityRoundingDown/> <roundingRules> <roundingRule> <currency>CZK</currency> <paymentType/> <rounding>0</rounding> </roundingRule> </roundingRules> <voucherTaxStrategy/> </catalogSpecific></order>
Popis
order
Konfigurace objednávek.
Vlastnosti této konfigurace lze specifikovat pro konkrétní katalog. Více zde.
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| numberExpression | Výraz (SPeL), který definuje, jakým způsobem bude generováno číslo objednávky. Dostupné parametry ve SPeLu jsou:
Například výraz "'E' + dateFormat('yyyy') + '-' + nextNumber(dateFormat('yyyy'),4)" vygeneruje kód (pro rok 2022) "E2022-0001", "E2022-0002" atd. Tento výraz je povinný v případě využití default implementace OrderNumberProvider. V případě, že je na projektu vlastní implementace, tak tento výraz nemusí být povinný. | String |
|
|
| billingCountries/billingCountry | Seznam zemí, kam je možné fakturovat. Pokud není uvedeno, berou se země podle seznamu definovaných regionů a jejich zemí. |
|
| |
| bookingExpirationState | Kód stavu objednávky, při kterém dojde k rezervaci zboží na skladě, resp. dojde k aktualizaci (Order#getBookingExpiration()), na základě které přechází rezervace do stavu ProductQuantityBookingStatus#ORDERED. V případě, že rezervace na skladě se váže na jinou událost než stav objednávky, nastavte hodnotu tohoto atributu na Hodnota Order#getBookingExpiration() se pak nastavuje pomocí této modifikace com.fg.cps.eshop.order.modification.dto.OrderModificationSetBookingExpiration. Výchozí hodnota: "processing-order". | String |
|
|
| cartExpiration | Počet dní, po které se uchovávají rozpracované košíku v DB. Po uplynutí této doby jsou "opuštěné" košíku odstraněny. Výchozí hodnota je 30 dní. |
|
| |
| cartImportKey | Atribut podle, kterého se vyhledávají produkty v rámci importu košíku. Výchozí hodnota je | String |
|
|
| deliveryCountries/deliveryCountry | Seznam zemí, kam je možné doručovat. Pokud není uvedeno, berou se země podle seznamu definovaných regionů a jejich zemí. |
|
| |
| maxCartItem | Maximální počet položek v košíku, kdy nad tento limit již nelze přidat další položky. V případě překročení je zákazníkovi zobrazena upozorňující hláška (warning). Limit se nevztahuje přidání bonusových produktů, které se přidávají automaticky na základně splněných podmínek. Výchozí hodnota je 150. | int |
|
|
| migrateAnonymousOrdersToActivatedUser | Hodnota určuje, zda se mají anonymní objednávky při aktivaci uživatele přesunout pod aktivovaného uživatele na základě shody e-mailu uživatele a e-mailu u objednávky. Hodnota Tuto vlastnost nelze nastavit specificky pro konkrétní katalog. Více zde. | Boolean |
|
|
| modifications | Konfigurace modifikace objednávky. |
|
| |
| notificationConfig | Konfigurace notifikací. |
|
| |
| optionalBillingAddress/type | Seznam typů doprav, pro které je možné mít nepovinné fakturační údaje. Nepovinné fakturační údaje jsou možné v případě objednávky do 10tis bez DPH v CZK a také v případě, že není nutné znát dodací adresu, např. při osobním odběru. V případě, že nebudou fakturační údaje uvedeny, nebude generována faktura, ale stačí pokladní doklad (Tisk pokladního dokladu z EdeeShopu není aktuálně podporován, a je nutné to řešit projektově). Případně, že zákazník bude požadovat fakturu později je nutné, aby si to dořešil přímo s provozovatelem e-shopu. Nepovinná fakturační adresa je podporována pouze pro CZK měnu. Výchozí je seznam prázdný, tedy fakturační údaje jsou vždy povinné. | List:
|
|
|
| optionalCustomerPhone | Hodnota určuje, zda je kontaktní telefon na zákazníka povinný. Pokud je hodnota | boolean |
|
|
| partDispatchConfig | Zapnutí a konfigurace pro částečné expedice. Tedy objednávku lze částečně přepnout do stavu "částečně expedováno" a "částečně na pobočce" (k vyzvednutí). Nepovinná hodnota. Pokud není uvedeno, tak částečné expedice nejsou povoleny. |
|
| |
| quantityRoundingDown | Hodnota určuje zaokrouhlení přidaného množství produktů v případě, že požadované množství nevyhovuje WithOrderData#getStepOrderAmount(). Pokud je hodnota Tedy například produkt lze přidat pouze po 1.5m2 a zákazník požaduje 5m2. Množství v objednávce bude automaticky upraveno na násobek 1.5, tedy ve výchozím nastavení na 6m2. | boolean |
|
|
| roundingRules/roundingRule | Pravidla pro výpočet úrovně zaokrouhlení finální částky k úhradě. Pokud nejsou definována žádná pravidla, tak se zohledňuje konfigurace |
|
| |
| voucherTaxStrategy | Hodnota určuje způsob zpracování poukazů a případně kreditů (přesněji cenových politik typy OrderPricePolicyCalculationStrategy#PAYMENT) v kontextu uplatnění DPH. Možné hodnoty jsou:
Jednoúčelový poukaz
Víceúčelový poukaz
| String |
|
|
| catalogSpecific | Vlastnosti této konfigurace lze specifikovat pro konkrétní katalog. Více zde. |
|
|
billingCountries/billingCountry
Seznam zemí, kam je možné fakturovat.
Pokud není uvedeno, berou se země podle seznamu definovaných regionů a jejich zemí.
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| countryCode | Kód země (ISO 3166 - 2 znaky). | String |
|
|
| region | Identifikátor regionu. Pokud je uvedeno, nastavení platí pouze pro tento region. Pokud není uvedeno, platí pro všechny regiony v aktuálním katalogu. |
|
|
region
Identifikátor regionu.
Pokud je uvedeno, nastavení platí pouze pro tento region. Pokud není uvedeno, platí pro všechny regiony v aktuálním katalogu.
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| country | Kód země (ISO 3166 - 2 znaky). Povinná hodnota. | String |
|
|
| currency | Měna regionu ( ISO 4217 - 3 znaky). Povinná hodnota. |
|
| |
| locale | Kód jazyka (ISO 639 - 2 znaky). Povinná hodnota. |
|
|
deliveryCountries/deliveryCountry
Seznam zemí, kam je možné doručovat.
Pokud není uvedeno, berou se země podle seznamu definovaných regionů a jejich zemí.
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| countryCode | Kód země (ISO 3166 - 2 znaky). | String |
|
|
| region | Identifikátor regionu. Pokud je uvedeno, nastavení platí pouze pro tento region. Pokud není uvedeno, platí pro všechny regiony v aktuálním katalogu. |
|
|
region
Identifikátor regionu.
Pokud je uvedeno, nastavení platí pouze pro tento region. Pokud není uvedeno, platí pro všechny regiony v aktuálním katalogu.
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| country | Kód země (ISO 3166 - 2 znaky). Povinná hodnota. | String |
|
|
| currency | Měna regionu ( ISO 4217 - 3 znaky). Povinná hodnota. |
|
| |
| locale | Kód jazyka (ISO 639 - 2 znaky). Povinná hodnota. |
|
|
modifications
Konfigurace modifikace objednávky.
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| addressModification | Zapnutí a konfigurace modifikace adres a odběrného místa objednávky. Pokud není definováno, tak není modifikace povolena. |
|
| |
| autoDispatchInterval | Interval, po které dojde k automatickému přepnutí stavu do expedováno v případě, že modifikací došlo ke kompletní expedici objednávky. Interval představuje ochrannou lhůtu, kdy ještě může dojít k modifikaci objednávky, tedy může dojít k odebrání všech položek k expedici a následně k přidání nové položky. Výchozí hodnota je "3m". |
|
| |
| contactModification | Zapnutí a konfigurace modifikace kontaktních údajů (email + telefon). Pokud není definováno, tak není modifikace povolena. |
|
| |
| itemModification | Zapnutí a konfigurace modifikace položek objednávky. Pokud není definováno, tak není modifikace povolena. |
|
| |
| paymentModification | Zapnutí a konfigurace modifikace platební metody. Modifikovat platbu je možné přes AR a také je zpřístupněno rest-api pro změnu platební metody na frontend zákazníkem. Pokud není definováno, tak není modifikace povolena. |
|
| |
| stateChecks/stateCheck | Možnost konfigurace stavů, kdy už není možné objednávku pro daný typ modifikace upravovat. Pokud není definováno, tak není modifikace povolena. | List: stateChecks/stateCheck |
|
|
addressModification
Zapnutí a konfigurace modifikace adres a odběrného místa objednávky.
Pokud není definováno, tak není modifikace povolena.
contactModification
Zapnutí a konfigurace modifikace kontaktních údajů (email + telefon).
Pokud není definováno, tak není modifikace povolena.
itemModification
Zapnutí a konfigurace modifikace položek objednávky.
Pokud není definováno, tak není modifikace povolena.
paymentModification
Zapnutí a konfigurace modifikace platební metody.
Modifikovat platbu je možné přes AR a také je zpřístupněno rest-api pro změnu platební metody na frontend zákazníkem.
Pokud není definováno, tak není modifikace povolena.
stateChecks/stateCheck
Možnost konfigurace stavů, kdy už není možné objednávku pro daný typ modifikace upravovat.
Pokud není definováno, tak není modifikace povolena.
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| deliveryToPickupPoint | Hodnota určuje na jaký typ objednávky z hlediska doručení se konfigurace vztahuje. Pokud je | Boolean |
|
|
| orderModificationType | Typ modifikace. Typ odpovídá hodnotě OrderModification#getType() konkrétní implementace. | String |
|
|
| orderState | Kód stavu. Pokud se v daném stavu objednávka nachází, modifikaci již nelze provést. | String |
|
|
notificationConfig
Konfigurace notifikací.
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| notifyQuicklyOnStates/state | Seznam stavů objednávky, pro které ma dojít "k okamžitému" odeslání notifikací (e-mail). Standardně se notifikace odesílají v intervalu 5 min. Pro některé stavy objednávky (např. "new-order") je vhodné odeslat notifikace co nejdříve. Hodnota je nepovinná a pokud není uvedeno, tak se k okamžitému odeslání dochází pouze pro stav | String |
|
|
partDispatchConfig
Zapnutí a konfigurace pro částečné expedice.
Tedy objednávku lze částečně přepnout do stavu "částečně expedováno" a "částečně na pobočce" (k vyzvednutí).
Nepovinná hodnota. Pokud není uvedeno, tak částečné expedice nejsou povoleny.
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| shippingTypeWhitelist | Seznam typů doprav, pro které je povolena částečná expedice (nevztahuje se k "částečně na pobočce"). Pokud je seznam prázdný (default), tak je částečná expedice povolena pro všechny typy doprav. |
|
|
|
roundingRules/roundingRule
Pravidla pro výpočet úrovně zaokrouhlení finální částky k úhradě.
Pokud nejsou definována žádná pravidla, tak se zohledňuje konfigurace computedPricesRoundedToDecimalPlaces v rámci currencyConfig.
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| currency | Pravidlo je platné pokud je objednávka v této měně (ISO 4217 - 3 znaky). Povinný atribut. |
|
| |
| paymentType | Pravidlo je platné pokud je platba objednávky daného typu. Nepovinný atribut. |
Pro tento typ platby lze definovat bankovní účty, kam lze uhradit objednávku.
Zboží se odesílá před uhrazením.
Zálohová faktura se zákazníkovi posílá samostatnou notifikací, jakmile je k objednávce vytvořena či nahrána — nezávisle na stavu objednávky. Přechod objednávky do stavu zpracováno existenci zálohové faktury nevyžaduje. Zboží se odesílá až po zaplacení.
Tato platební metoda vyžaduje zapnutý modul PayU platební brány.
Tato platební metoda vyžaduje zapnutý modul GpWebPay platební brány.
Tato platební metoda vyžaduje zapnutý modul ČSOB platební brány.
Tato platební metoda vyžaduje zapnutý modul GoPay platební brány.
Tato platební metoda vyžaduje zapnutý modul ComGate platební brány.
Tato platební metoda vyžaduje zapnutý modul Essox platební brány.
Tato platební metoda vyžaduje zapnutý modul Pays platební brány.
Tato platební metoda vyžaduje zapnutý modul Stripe platební brány.
Tato platební metoda vyžaduje zapnutý modul Twisto platební brány. |
|
|
| rounding | Hodnota určuje na kolik desetinných míst se má zaokrouhlit částka k úhradě. Povinný atribut. | Integer |
|
|
Dopravy
Detailní popis konfigurace doprav je k nalezení zde.
Platby
Detailní popis konfigurace plateb je k nalezení zde.
Změna platební metody zákazníkem
Zákazník může změnit platební metodu pro již vytvořenou objednávkou. Platbu lze změnit pouze pro objednávky, které:
- nejsou zaplacené,
- jsou ve stavu nová,
- původní platební metoda je typu online (platba kartou, platební brány apod)
Seznam alternativních platebních metod, na které může zákazník přepnout, je možné projektově pomocí implementace PaymentMethodOrderFilter.
Cross-sale
Rozšíření, který zajišťuje výpočet prodejnosti produktů na základě objednávek. Konfigurace rozšíření je nepovinná a pouze slouží pouze k ovlivnění výchozího chování.
Příklad konfigurace
<order> <crossSale> <sourcesOfOrdersToBeProcessed/> </crossSale></order>
Popis
order/crossSale
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| sourcesOfOrdersToBeProcessed | Seznam zdrojů objednávek, které mají být zahrnuty do zpracování prodejnosti produktů. Pokud není uvedeno, tak se zpracují pouze objednávky z košíku, tedy objednávky jejíž zdroj je | String |
|
|
Sms notifikace
Objednávkový modul je možné rozšířit o odesílání SMS notifikací zákazníkovi, např. při vytvoření objednávky.
Příklad konfigurace
<order> <sendingSms> <sender> <login>login</login> <messages> <message> <conditions> <condition/> </conditions> <messageKey>eshop.sms.NEW_ORDER</messageKey> <mock>false</mock> <sourceKey>eshop.sms.source</sourceKey> </message> </messages> <password>password</password> <userSource/> </sender> <catalogSpecific> <catalogCode/> <sender> <login>login</login> <messages> <message> <conditions> <condition/> </conditions> <messageKey>eshop.sms.NEW_ORDER</messageKey> <mock>false</mock> <sourceKey>eshop.sms.source</sourceKey> </message> </messages> <password>password</password> <userSource/> </sender> </catalogSpecific> </sendingSms></order>
Popis
order/sendingSms
Zapnutí a konfigurace SMS notifikací týkající se objednávek.
Pozn.: Tato funkce vyžaduje zapnutý profismsmodule modul.
Vlastnosti této konfigurace lze specifikovat pro konkrétní katalog. Více zde.
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| sender | Konfigurace odesílání SMS zpráv. |
|
| |
| catalogSpecific | Vlastnosti této konfigurace lze specifikovat pro konkrétní katalog. Více zde. |
|
|
sender
Konfigurace odesílání SMS zpráv.
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| login | Přihlašovací údaje pro | String |
|
|
| messages/message | Konfigurace zpráv, které se mají případně odeslat v případě splnění podmínek. V případě, že podmínky splňuje více zpráv, tak se odesílá jen první v pořadí. | List: messages/message |
|
|
| password | Přihlašovací údaje pro | String |
|
|
| userSource | Libovolná textová data, která budou uložena k SMS. Nepovinná hodnota. | String |
|
|
messages/message
Konfigurace zpráv, které se mají případně odeslat v případě splnění podmínek.
V případě, že podmínky splňuje více zpráv, tak se odesílá jen první v pořadí.
| Vlastnost | Popis | Hodnota | Povinná | Výchozí hodnota |
|---|---|---|---|---|
| conditions/condition | Podmínky toho, zda se tato zpráva odeslat. Je vyžadována minimálně jedna podmínka. Příklad podmínky: kód Podmínka je vyhodnocena jako SpEL výraz, kde jako root je k dispozici com.fg.cps.eshop.order.sms.event.OrderSmsNotificationEvent. | List: String |
|
|
| messageKey | Klíč pro tělo zprávy. Pod tímto klíčem se následně hledá message v properties. Message může obsahovat jeden argument, který představuje číslo objednávky. | String |
|
|
| mock | Pokud je hodnota Výchozí hodnota je | boolean |
|
|
| sourceKey | Klíč pro číslo nebo textový identifikátor odesílatele. Pod tímto klíčem se následně hledá properties. Výchozí hodnotou je prázdný řetězec - SMS bude odeslána z čísla ProfiSMS. Možnou hodnotou je buď telefonní číslo v mezinárodním tvaru, nebo text skládající se z písmen anglické abecedy, číslic a znaků . a - (tečka a pomlčka). V případě textu může být tento maximálně 11 znaků dlouhý, bude-li text delší, nebo bude-li obsahovat nepovolené znaky, potom dojde k jeho automatické úpravě na straně ProfiSMS. | String |
|
|
Požadavek na odeslání SMS je možné před samotným odesláním projektově modifikovat.
To lze zajistit pomocí implementace com.fg.cps.eshop.order.sms.service.SendSmsRequestSnippet.
Tuto implementaci je potřeba zaregistrovat do aplikačního (Spring) kontextu.
E-mail notifikace
V rámci tohoto rozšíření je možné odesílat notifikace týkající se objednávek.
Přehled notifikací je k nalezení zde.
Tyto notifikace se zapínají pomocí elementu <mailing>. Další nastavení mailingu je popsáno zde.
Příklad:
<order> <mailing/></order>