Jak vytvořit "dostupnostní XML" z "produktového XML"

Dostupnostní feed by měl shopsystém generovat sám. Nemělo by být potřeba do něj zasahovat. Mohou ovšem nastat situace, kdy by se Vám automaticky generovaný a aktualizovaný dostupnostní XML feed hodil a nemáte ho. Proto napíši následující “inspiraci”. Klikání to bude více, i když jádro principu je docela jednoduché. Cílem je Vás inspirovat k využití některých prvků. A ukázat, že i toto MERGADO umí :wink:

O dostupnostních feedech

V současnosti rozlišujeme především Heureka dostupnostní XML feed a Mall Marketplace dostupnostní XML feed. Tyto feedy obsahují vždy identifikátor zboží a informace o doručení zboží zákazníkovi. V našem případě vytvořím v Mergadu feed, který bude obsahovat elementy:

  • ITEM_ID identifikátor položky zboží, odpovídá ITEM_ID z produktového feedu
  • DELIVERY_TERM_ORDER mnou stanovený element, obsahuje termín, do kdy by měli zákazníci učinit objednávku, aby získali zboží viz. následující element
  • DELIVERY_TERM_GET termín předpokládaného doručené zboží při dodržení termínu objednávky viz. výše.

Uvedené elementy jsou inspirací z Heureka dostupnostního XML a odpovídají parametru orderDeadline či hodnotě elementu delivery_time viz příklad:

<delivery_time orderDeadline="2011-09-10 12:00">2011-09-11 13:00</delivery_time>

Formát je ovšem vlastní. Využiji jej pro další zpracování.

Zpracování produktového feedu

Postup lze rozdělit do čtyřech částí. První tři jsou jednoduché a člověk je připraví za pár minut. Jádro řešení je ve čtvrté části. Nastíním dva možné postupy, jak situaci řešit.

1) Zapnout Bidding Fox Element

Aplikace Bidding Fox Elements obsahuje elementy pro práci s časem, které se nám budou hodit:

  • BFE_D_CURRENT_DATE dnešní datum, např. 20. prosince bude obsahovat hodnotu “2021-12-20”
  • BFE_D_DAYS_IN_MONTH počet dní v aktuálním měsíci, hodnotou je číslo, např. “30”
  • BFE_D_CURRENT_YEAR aktuální rok, např. “2021”
  • BFE_D_CURRENT_MONTH aktuální měsíc, číslo - např. v prosinci to bude “12”
  • BFE_D_CURRENT_DAY aktuální den, např. 20. prosince to bude číslo “20”
  • BFE_D_HOLIDAY_NEXT_DAYS_CZ počet dní do následujícího státního svátku

Uvedu dva možné postupy řešení situace. V jednom případě budeme potřebovat pouze první element BFE_D_CURRENT_DATE, v druhém případě všechny ostatní elementy. Podle toho, kterou variantu zvolíte dále, Vám stačí zapnout potřebné elementy v tomto kroku.

2) Vytvořit elementy

Pro další práci budu potřebovat elementy. Vytvořím je na stránce Elementy.

  • DELIVERY_TERM_ORDER termín, do kdy by měl zákazník objednávku učinit
  • DELIVERY_TERM_GET termín, do kdy zákazník zásilku obdrží při splnění termínu viz. výše
  • DELIVERY_TERM_NUMBER pomocný element (proměnná), se kterou budu dělat výpočty (pouze druhá možnost řešení viz dále). Element na výstupu skryji.

3) Skrýt elementy

V našem případě budu potřebovat pouze elementy ITEM_ID, DELIVERY_TERM_ORDER, DELIVERY_TERM_GET. Ostatní na stránce Elementy skryji. Vy můžete mít záměr jiný - skryjte elementy dle svého uvážení.

4) Výpočet termínů

Nyní se pusťme do jádra věci - stanovení termínů objednávky a doručení. Uvedu inspiraci, jak jsem postupoval já. Bude hodně záležet na tom, jak precizně budete chtít hodnoty stanovit. Lze to udělat triviálně s tím, že informace nebudou moc přesné, nebo se lze “párat” s velmi precizním nastavením. To ovšem zabere hodně času a není snadné postup vymyslet.

Nejlepší by bylo, kdyby data generoval již Váš systém a v exportu byly tyto elementy obsaženy. To bychom skryli vše nepotřebné a ponechali viditelné tyto elementy. V praxi tomu tak ovšem bude zřídka kdy.

4.1) Import z CSV

První cestou je import z připraveného CSV souboru. Ten můžete vytvořit v běžném “Excelu” (LibreOffice Calc, MS Office Excel…), na web uložit např. do aplikace eM Files a do exportu v Mergadu CSV připojit pravidlem datového importu. V exportu by stačilo zapnout element BFE_D_CURRENT_DATE z Bidding Fox Elements. CSV by mělo obsahovat sloupce:

BFE_D_CURRENT_DATE DELIVERY_TERM_ORDER DELIVERY_TERM_GET
2021-01-01 2021-01-03 2021-01-03
2021-01-02 2021-01-04 2021-01-04

Takto bychom si mohli v Excelu vytvořit tabulku kdy pro každý den definujeme, kdy budou zásilky doručeny. Mohli bychom zohlednit státní svátky, víkendy aj. Mohli bychom vytvořit více sloupců s hodnotami pro různé typy doručení. Výhodou takového postupu je značná flexibilita. Nevýhodou je, že bychom si museli připravit upomínku před termínem, než termíny v naší tabulce skončí, abychom mohli tabulku prodloužit dále do budoucna.

Toto řešení může působit až příliš manuálně, nicméně fungovat může a příprava je poměrně jednoduchá.

4.2) Nastavení pravidly

Já se pokusil vypočítat uvedené termíny pomocí pravidel. K tomu jsem potřeboval:

  • elementy z Bidding Fox Elements viz. výše
  • pravidla typu “přepsat hodnotu” a “výpočet”
  • časový plán pravidel

Princip řešení je jednoduchý. Problém je, že MERGADO umí dělat výpočty nad čísly. My přitom potřebujeme ovšem pracovat s datem. Budeme-li chtít udělat řešení chytřeji, budeme muset ošetřit různý počet dní v různých měsících, konec roku a podobně. Základ principu je tento:

  1. Do elementu DELIVERY_TERM_NUMBER zapíši hodnotu BFE_D_CURRENT_DAY tedy dnešní den.
  2. Stanovím termín nejbližšího svozu objednávek dopravní službou. Zohlednit mohu například: část dne (poslední objednávky balím např. do 12:00, protože ve 14:00 přijede dopravce a další termín je další den 12:00), dny víkendu (sobota, neděle, když dopravní služba přijede až v pondělí), státní svátky… Zde mohu vymyslet celou řadu podmínek a termíny pěkně nadefinovat.
  3. Zohledním případný konec měsíce mezi dneškem a datem odeslání (mnoho pravidel).
  4. Zapíši termín odeslání zásilky do DELIVERY_TERM_ORDER
  5. Stanovím termín doručení. Může se lišit dle dopravců. Já např. vím, že má dopravní služba doručuje v termínu “t+2 dny”. Dále budu chtít zohlednit skladovou dostupnost DELIVERY_DATE. K termínu doručení ji přičtu. Já budu počítat pouze jeden druh dopravy. Mohl by jich však být více.
  6. Zohledním případný konec měsíce a roku viz. bud 3.
  7. Zapíši termín doručení zásilky do elementu DELIVERY_TERM_GET.

V praxi to může vypadat např. takto. Pravidel je vcelku dost. Zejména však kvůli ošetření konců měsíců a roků.


Náhled pravidel funkčního exportu.

Pro inspiraci uvedu příklady pravidel. Princip stojí na tom, že do pomocné proměnné DELIVERY_TERM_NUMBER zapíši dnešní den a přičítám čas. Čas do nejbližšího vyskladnění zásilek a čas doručování zásilky. Pravidla jsem pojmenoval tak, aby bylo jasné, co dělají. Pozor na pořadí pravidel. V jiném pořadí než tomto by nemusela fungovat.

Budu potřebovat dva výběry. Jejich zápis uvedu rovnou v pravidlech. Ty z data detekují zda nejsme na konci měsíce či roku a termín svozu či doručení nespadají již do následujícího období.

Parametr Hodnota
Pravidlo Naplnit číslo, výchozí hodnota stejná jako aktuální den v měsíci (hodnota: číslo, např. 18)
Typ přepsat
Element DELIVERY_TERM_NUMBER
Hodnota %BFE_D_CURRENT_DAY%
Parametr Hodnota
Pravidlo Nastavení: odpoledne
Typ výpočet
Element DELIVERY_TERM_NUMBER
Výpočet %DELIVERY_TERM_NUMBER%+1
Poznámka Mocným pomocníkem je časový plánovač pravidla. Toto pravidlo bude aktivní od 12:00 do půlnoci. A to proto, že objednávky přijaté do 12:00 dokáže e-shop odeslat ještě dnes. Objednávky obdržené později odešle až den následující. Pravidlo navýší termín o jeden den. Obdobně mohu navýšit termín o víkendu (v mém případě sobota +2 dny, neděle +1 den), o státních svátcích aj.


Příklad časového plánu pravidla.

Zohlednění konců měsíců či roků

Následující pravidla jsem “schoval” do této rozbalovací nabídky. Řeší situaci, kdy např. objednávka přijatá 31. ledna má dorazit za tři dny - abychom přepočetli měsíc na únor a datum doručení stanovili na 3 února, nikoliv 34. ledna. MERGADO umí počítat s čísly, nikoliv datem. Výpočet jsem proto udělal následujícím způsobem.

Parametr Hodnota
Pravidlo Konec měsíce, navýší měsíc o 1 pokud je mezi dneškem a datem expedice nový měsíc
Výběr ([DELIVERY_TERM_NUMBER] > [BFE_D_DAYS_IN_MONTH])
Typ výpočet
Element BFE_D_CURRENT_MONTH
Hodnota %BFE_D_CURRENT_MONTH%+1
Poznámka Výběr zkontroluje, zda není den expedice číslo vyšší než počet dní v měsíci. Pokud ano, navýší číslo měsíce. Úpravu čísla dne či roku mají na starosti pravidla níže.
Parametr Hodnota
Pravidlo Konec měsíce, zpracuje den pokud je mezi dneškem a datem expedice nový měsíc
Výběr ([DELIVERY_TERM_NUMBER] > [BFE_D_DAYS_IN_MONTH])
Typ výpočet
Element DELIVERY_TERM_NUMBER
Hodnota %DELIVERY_TERM_NUMBER%-%BFE_D_DAYS_IN_MONTH%
Parametr Hodnota
Pravidlo Konec roku, navýší rok o 1, pokud je nový rok mezi dneškem a datem expedice
Výběr ([BFE_D_CURRENT_MONTH] = “13”)
Typ výpočet
Element BFE_D_CURRENT_YEAR
Hodnota %BFE_D_CURRENT_YEAR%+1
Parametr Hodnota
Pravidlo Konec roku, upraví měsíc aby byl leden
Typ výpočet
Výběr ([BFE_D_CURRENT_MONTH] = “13”)
Element BFE_D_CURRENT_MONTH
Hodnota 1
Parametr Hodnota
Pravidlo :pencil2: Naplnit datum objednávky
Typ přepsat
Element DELIVERY_TERM_ORDER
Hodnota %BFE_D_CURRENT_YEAR%-%BFE_D_CURRENT_MONTH%-%DELIVERY_TERM_NUMBER% 12:00
Parametr Hodnota
Pravidlo :gear: Vypočte z data expedice datum dodání
Typ výpočet
Element DELIVERY_TERM_NUMBER
Hodnota %DELIVERY_TERM_NUMBER%+%DELIVERY_DATE%+2
Poznámka Já výpočet termín expedice tak, že vím, že dopravní službě trvá dva dny (hodnotu jsem navýšil o +2). Dále jsem přičetl hodnotu z elementu DELIVERY_DATE. U zboží skladem je to nula, u zboží s delší dobou expedice to jsou číselné hodnoty, které vstoupí do výpočtu. V mém takový výpočet dostačuje. Vy ho berte prosím jako příklad.

Zohlednění konců měsíců či roků - novu, stejné jako viz výše.

Parametr Hodnota
Pravidlo :pencil2: Naplnit datum doručení
Typ přepsat
Element DELIVERY_TERM_GET
Hodnota %BFE_D_CURRENT_YEAR%-%BFE_D_CURRENT_MONTH%-%DELIVERY_TERM_NUMBER% 12:00

Formát výstupního feedu

Výstupu tohoto exportu bude vypadat takhle:

<SHOPITEM>
  <ITEM_ID>47</ITEM_ID>
  <DELIVERY_TERM_ORDER>2021-12-21 12:00</DELIVERY_TERM_ORDER>
  <DELIVERY_TERM_GET>2021-12-23 12:00</DELIVERY_TERM_GET>
</SHOPITEM>

Pro mé další využití je dostačující. Abychom ho však mohli využít např. do Heureky, bude potřeba výstup přeformátovat. Jak na to, si ukážeme ve zvláštním vlákně.

Účel tohoto příkladu

Možná si říkáte, že uvedený příklad obsahuje hodně pravidel a klikání může trvat. Jak jsem zmínil na začátku - nejlepší je, když dostupnostní feed generuje shopsystém, skladový systém, zkrátka systém k tomu určený. Pokud však nastane situace, že dostupnostní feed nemáte a nutně ho potřebujete, může být automaticky aktualizovaný feed stanovený smysluplným nastavením dostatečně dobrým pomocníkem. V praxi se dostupnostními feedy budeme nadále setkávat. Tedy s potřebou řešit skladové hospodářství. Například proto, že ve feed marketingu zažíváme nástup on-line marketplaces. A tyto informace o skladových zásobách často vyžadují.


Poznámka pod čarou: k důvodu, že dostupnostní feed vygenerovat tímto postupem lze, přidám další. Dříve jsme dostupnostní feed v praxi moc neřešili. Pokud zjistíte, že by Vám jejich jednodušší správa pomohla, napište mi prosím. Buď sem do komentáře, nebo třeba do soukromé zprávy na MERGADO support. Mohli bychom připravit jednodušší řešení. Ať už v podobě maker, nebo řešení, kde by bylo možné vše naklikat ještě jednodušeji. Děkuji.