Import objednávek z e-shopu Shoptet do FlexiBee

Co dělat, když nám jednoduchý přenos objednávek z e-shopu Shoptet do FlexiBee nestačí? Jak importovat objednávky s vyplněním všech potřebných informací?

Jednoduchý přenos objednávek má několik problémů.

  1. Není možné v objednávkách vyplňovat správné datum vystavení.
  2. V e-shopu Shoptet musíme změnit zobrazení čísel v měně (ať už CZK nebo cizí).
  3. Objednávky se nenavazují na firmy v adresáři FlexiBee.
  4. Položky objednávek nemají vyplněna pole ceník a sklad.

Jak tedy toto všechno opravit a zajistit kompletní přenos objednávek do FlexiBee?

Zpracování objednávek :)
Zpracování objednávek :)


Export objednávek z e-shopu Shoptet

Na rozdíl od jednoduchého přenosu objednávek není potřeba v Shoptetu cokoliv měnit ani vytvářet vlastní typ exportu. Využijeme již nadefinovaný export Shoptet ve formátu XML. Tento export je opět dostupný na permanentním odkazu, takže bude možné přenos objednávek zautomatizovat.

V menu OBJEDNÁVKY → Export zvolíme Typ exportu systémový: Shoptet - XML. Nastavíme, jaké objednávky chceme do exportu zahrnout a ve spodní části obrazovky získáme adresu permanentního odkazu.

Nastavení exportu objednávek v Shoptetu
Nastavení exportu objednávek v Shoptetu


Import objednávek do FlexiBee

Abychom mohli odstranit všechny problémy a aby přenesené objednávky obsahovaly všechny potřebné údaje, využijeme opět Uživatelské transformace, novinku z verze FlexiBee 2017.2.

Transformace, která převede XML z e-shopu Shoptet na formát vhodný pro FlexiBee:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xalan/java" exclude-result-prefixes="java">
  <xsl:output method="xml" indent="yes" encoding="utf-8" />

  <!-- zkratka skladu na kterém je zboží určené pro eshop -->
  <xsl:variable name="sklad" select="'SKLAD'" />
  <!-- zkratka typu dokladu vytvářených objednávek -->
  <xsl:variable name="typDokl" select="'OBP'"/>

  <xsl:template match="ORDERS">
    <winstrom version="1.0">
      <xsl:apply-templates select="ORDER"/>
    </winstrom>
  </xsl:template>

  <xsl:template match="ORDER">
    <objednavka-prijata>
      <!-- zpracování jedné objednávky -->
      <id>ext:SHOPTET-ORDER:<xsl:value-of select="ORDER_ID"/></id>
      <id>code:<xsl:value-of select="CODE"/></id>
      <kod><xsl:value-of select="CODE"/></kod>
      <varSym><xsl:value-of select="CODE"/></varSym>
      <typDokl>code:<xsl:value-of select="$typDokl"/></typDokl>
      <datVyst><xsl:value-of select="java:flexibee.Tool.parseDate(DATE, 'y-M-d H:m:s')"/></datVyst>
      <mena>code:<xsl:value-of select="CURRENCY/CODE"/></mena>

      <xsl:choose>
        <xsl:when test="STATUS = 'Stornována'">
          <stavUzivK>stavDoklObch.storno</stavUzivK>
        </xsl:when>
        <xsl:otherwise>
          <!-- ostatní stavy zatím neřešíme -->
        </xsl:otherwise>
      </xsl:choose>

      <!-- forma úhrady -->
      <xsl:for-each select="ORDER_ITEMS/ITEM[TYPE='billing']">
        <formaUhradyCis if-not-found="null">code:<xsl:value-of select="java:flexibee.Tool.substring(java:flexibee.Tool.toUpper(NAME), 0, 20)"/></formaUhradyCis>
      </xsl:for-each>

      <!-- forma dopravy -->
      <xsl:for-each select="ORDER_ITEMS/ITEM[TYPE='shipping']">
        <formaDopravy if-not-found="null">code:<xsl:value-of select="java:flexibee.Tool.substring(java:flexibee.Tool.toUpper(NAME), 0, 20)"/></formaDopravy>
      </xsl:for-each>

      <firma if-not-found="null">ext:SHOPTET-CUSTOMER-EMAIL:<xsl:value-of select="CUSTOMER/EMAIL"/></firma>
      
      <!-- záložka sídlo - fakturační adresa -->
      <xsl:choose>
        <xsl:when test="CUSTOMER/BILLING_ADDRESS/COMPANY = ''">
          <nazFirmy><xsl:value-of select="CUSTOMER/BILLING_ADDRESS/NAME"/></nazFirmy>
        </xsl:when>
        <xsl:otherwise>
          <nazFirmy><xsl:value-of select="CUSTOMER/BILLING_ADDRESS/NAME"/> - <xsl:value-of select="CUSTOMER/BILLING_ADDRESS/COMPANY"/></nazFirmy>
        </xsl:otherwise>
      </xsl:choose>
      <ulice><xsl:value-of select="CUSTOMER/BILLING_ADDRESS/STREET"/> <xsl:value-of select="CUSTOMER/BILLING_ADDRESS/HOUSENUMBER"/></ulice>
      <mesto><xsl:value-of select="CUSTOMER/BILLING_ADDRESS/CITY"/></mesto>
      <psc><xsl:value-of select="CUSTOMER/BILLING_ADDRESS/ZIP" /></psc>
      <xsl:choose>
        <xsl:when test="CUSTOMER/BILLING_ADDRESS/COUNTRY = ''"><stat>code:CZ</stat></xsl:when>
        <xsl:when test="CUSTOMER/BILLING_ADDRESS/COUNTRY = 'Česká republika'"><stat>code:CZ</stat></xsl:when>
        <xsl:when test="CUSTOMER/BILLING_ADDRESS/COUNTRY = 'Slovensko'"><stat>code:SK</stat></xsl:when>
        <!-- sem je potřeba doplňovat další státy -->
        <xsl:otherwise><stat>NEDEFINOVANO - <xsl:value-of select="CUSTOMER/BILLING_ADDRESS/COUNTRY"/></stat></xsl:otherwise>
      </xsl:choose>
      <ic><xsl:value-of select="CUSTOMER/BILLING_ADDRESS/COMPANY_ID"/></ic>
      <dic><xsl:value-of select="CUSTOMER/BILLING_ADDRESS/COMPANY_ID"/></dic>

      <!-- záložka poštovní adresa - dodací adresa -->
      <postovniShodna>false</postovniShodna>
      <xsl:choose>
        <xsl:when test="CUSTOMER/SHIPPING_ADDRESS/COMPANY = ''">
          <faNazev><xsl:value-of select="CUSTOMER/SHIPPING_ADDRESS/NAME"/></faNazev>
        </xsl:when>
        <xsl:otherwise>
          <faNazev><xsl:value-of select="CUSTOMER/SHIPPING_ADDRESS/NAME"/> - <xsl:value-of select="CUSTOMER/SHIPPING_ADDRESS/COMPANY"/></faNazev>
        </xsl:otherwise>
      </xsl:choose>
      <faUlice><xsl:value-of select="CUSTOMER/SHIPPING_ADDRESS/STREET"/> <xsl:value-of select="CUSTOMER/SHIPPING_ADDRESS/HOUSENUMBER"/></faUlice>
      <faMesto><xsl:value-of select="CUSTOMER/SHIPPING_ADDRESS/CITY"/></faMesto>
      <faPsc><xsl:value-of select="CUSTOMER/SHIPPING_ADDRESS/ZIP"/></faPsc>
      <xsl:choose>
        <xsl:when test="CUSTOMER/SHIPPING_ADDRESS/COUNTRY = ''"><faStat></faStat></xsl:when>
        <xsl:when test="CUSTOMER/SHIPPING_ADDRESS/COUNTRY = 'Česká republika'"><faStat>code:CZ</faStat></xsl:when>
        <xsl:when test="CUSTOMER/SHIPPING_ADDRESS/COUNTRY = 'Slovensko'"><faStat>code:SK</faStat></xsl:when>
        <!-- sem je potřeba doplňovat další státy -->
        <xsl:otherwise><faStat>NEDEFINOVANO - <xsl:value-of select="CUSTOMER/SHIPPING_ADDRESS/COUNTRY"/></faStat></xsl:otherwise>
      </xsl:choose>

      <polozkyDokladu removeAll="true">
        <xsl:apply-templates select ="ORDER_ITEMS/ITEM"/>
      </polozkyDokladu>
    </objednavka-prijata>
  </xsl:template>

  <xsl:template match="ORDER_ITEMS/ITEM">
    <!-- zpracování položky objednávky -->
    <objednavka-prijata-polozka>
      <xsl:choose>
        <xsl:when test="TYPE = 'product' or TYPE = 'set'">
          <!-- u produktů a sad vyplňujeme ceník i sklad -->
          <cenik>code:<xsl:value-of select="CODE"/></cenik>
          <sklad>code:<xsl:value-of select="$sklad"/></sklad>
        </xsl:when>
        <xsl:when test="TYPE = 'service'">
          <!-- u služeb vyplňujeme jen ceník -->
          <cenik>code:<xsl:value-of select="CODE"/></cenik>
        </xsl:when>
        <xsl:otherwise>
          <!-- ostatni typy - billing, shipping - neděláme nic -->
        </xsl:otherwise>
      </xsl:choose>

      <xsl:choose>
        <xsl:when test="VARIANT_NAME = ''">
          <nazev><xsl:value-of select="NAME"/></nazev>
        </xsl:when>
        <xsl:otherwise>
          <nazev><xsl:value-of select="NAME"/> - <xsl:value-of select="VARIANT_NAME"/></nazev>
        </xsl:otherwise>
      </xsl:choose>

      <mnozMj><xsl:value-of select="AMOUNT"/></mnozMj>
      <cenaMj><xsl:value-of select="java:flexibee.Tool.parseMoney(UNIT_PRICE/WITH_VAT)"/></cenaMj>
      <typCenyDphK>typCeny.sDph</typCenyDphK>
      <xsl:choose>
        <xsl:when test="UNIT_PRICE/VAT_RATE = 0"><typSzbDphK>typSzbDph.dphOsv</typSzbDphK></xsl:when>
        <xsl:when test="UNIT_PRICE/VAT_RATE = 10"><typSzbDphK>typSzbDph.dphSniz2</typSzbDphK></xsl:when>
        <xsl:when test="UNIT_PRICE/VAT_RATE = 15"><typSzbDphK>typSzbDph.dphSniz</typSzbDphK></xsl:when>
        <xsl:otherwise><typSzbDphK>typSzbDph.dphZakl</typSzbDphK></xsl:otherwise>
      </xsl:choose>

      <xsl:if test="UNIT != ''">
        <mj>code:<xsl:value-of select="java:flexibee.Tool.toUpper(UNIT)"/></mj>
      </xsl:if>

      <xsl:if test="DISCOUNT != 0">
        <slevaPol><xsl:value-of select="DISCOUNT"/></slevaPol>
      </xsl:if>
    </objednavka-prijata-polozka>
  </xsl:template>
</xsl:stylesheet>

Transformaci, stejně jako všechny předchozí, zadáme ve FlexiBee do evidence Uživatelské transformace (horní menu Nástroje → Uživatelské transformace). Vyplníme Zkratku a Název transformace. Do pole Dotaz vyplníme zdrojový kód XSLT transformace.


Zadanou transformaci využijeme pro zápis objednávek přes REST-API. Složíme si URL adresu, na kterou budeme data ze Shoptetu zapisovat.

Adresa bude podle vzoru:
https://{server}:{port}/c/{identifikátor firmy}/objednavka-prijata.xml?format=code:{zkratka transformace}
Server a port jsou standardní server a port FlexiBee serveru. Identifikátor firmy určuje, do které firmy se budou objednávky zapisovat. Zkratka určuje XSLT transformaci, kterou pro přenos využijeme.

Reálná adresa tedy bude například:
https://demo.flexibee.eu:5434/c/demo/objednavka-prijata.xml?format=code:SHOPTET-OBJEDNAVKY

Automatický přenos objednávek

Jako u všech předchozích přenosů (produkty a zákazníci) je možné automatizaci provést několika rozdílnými způsoby.

Využití nástroje cURL

Nástroj cURL je možné použít pro vytváření požadavků na webové služby. Je možné s ním vytvořit všechny typy požadavků. Nám ale budou stačit dva – GET a PUT.

Požadavek typu GET budeme potřebovat pro získávání dat z e-shopu. Výsledek požadavku pak zapíšeme do souboru (shoptet-orders.xml).

Požadavkem typu PUT zapíšeme získaná data do FlexiBee. Budeme potřebovat uživatelské jméno a heslo pro API uživatele. Toto jméno a heslo (oddělené dvojtečkou) se v příkazu zapisuje jako parametr -u.

curl "https://123456.myshoptet.com/export/ordersFeed.xml?patternId=-11&hash=e3ed846e17cbe694ae2072fbcc81234564fcd7375f64d07c6bf0714561b3c995" > shoptet-orders.xml

curl -X PUT "https://demo.flexibee.eu:5434/c/demo/objednavka-prijata.xml?format=code:SHOPTET-OBJEDNAVKY" -T shoptet-orders.xml -u winstrom:winstrom

Scénář v Integromatu

Další možností je Integromat. Scénář bude složen ze dvou HTTP modulů.

První pomocí GET načte objednávky ze Shoptetu. Nastavíme do něho adresu permanentního odkazu. Můžeme otestovat, zda se data načtou. Pokud je status kód 200, jsou data úspěšně načtena.

Druhý HTTP modul zapíše objednávky pomocí metody PUT do FlexiBee. Vyplníme do něho adresu FlexiBee API s parametrem format. Vybereme metodu PUT, nastavíme Druh těla požadavku na Raw, Typ obsahu bude XML (application/xml) a jako Content nastavíme data získaná předchozím modulem. Přihlašovací jméno a heslo API uživatele zadáme do políček Uživatelské jméno a Heslo.

obrázky

Další rozšíření importu objednávek

Pokud budeme chtít, můžeme rovnou vystavit zákazníkovi i fakturu. Stačí v XSLT transformaci využít realizaci objednávky.

Nebo je samozřejmě možné místo objednávek vytvářet rovnou faktury. Pokud chceme vytvářet faktury, nahradíme v XSLT transformaci všechny výskyty objednavka-prijata za faktura-vydana.

Vytvořenou fakturu je možné rovnou zaslat zákazníkovi.

Nastavení FlexiBee

Doporučuji nastavit si ve FlexiBee automatické rezervace. Chceme totiž dosáhnout stavu, kdy objednané zboží již není možné prodat dalším zákazníkům. Automatické rezervace je možné zapnout v nastavení firmy (horní menu Firma → Nastavení). Na záložce Moduly → Prodej → Prodej je možné si vybrat z několika režimů rezervací. Doporučuji zakliknout buď možnost Automatická při vytvoření objednávky a Povolit rezervaci do záporu nebo Automatická při vytvoření objednávky a naskladnění zboží. Tímto nastavením se při vytvoření objednávky zarezervuje potřebné zboží a sníží se i stav skladu, který přenášíme zpět do Shoptetu.

Pokud vytváříme místo objednávek rovnou faktury, musíme dát pozor na stav skladu. FlexiBee totiž nedovolí (na rozdíl od objednávek) zapsat položku faktury, která by nastavila stav skladu menší než 0. Import takovéhoto dokladu skončí chybou a žádná data se nezapíší. Pokud chceme takovéto doklady vytvářet, musíme umožnit generování požadavků na výdej. Požadavky povolíme opět v nastavení firmy v záložce Moduly → Zboží zaškrtnutím zaškrtávátka Umožnit generování požadavků na výdej.

Shrnutí aktuálního stavu

V tuto chvíli máme Shoptet propojen s FlexiBee. To nedůležitější tedy objednávky se přenášejí automaticky a správně se v nich vyplňují odběratelé a produkty. Ve FlexiBee je podle nich možné vytvářet objednávky pro dodavatele, vystavit zákazníkovi fakturu a vyskladnit zboží ze skladu.

Co nám tedy ještě zbývá? V Shoptetu je možné vystavovat daňové doklady a tak by bylo hezké, kdybychom je byli schopni do FlexiBee také načíst. O tom ale až příště :-).

Aktualizace 15. 10. 2017 - forma dopravy a úhrady, vytváření faktur

Dnes jsem zaktualizoval transformaci pro import objednávek z e-shopu Shoptet do FlexiBee.

Seznam změn:

  • Vyplňování formy dopravy. Naimportované objednávky budou mít vyplněnu formu dopravy abychom mohli plně využívat modul dopravci ve FlexiBee.
  • Vyplňování formy úhrady. Naimportované objednávky budou mít vyplněnu formu úhrady abychom věděli, jak si přeje zákazník zaplatit.
  • Vyplňování pole variabilní symbol. Pro správné párování plateb je potřeba mít vyplněn na objednávkách a fakturách pole variabilní symbol.
  • Doplněna transformace, vytvářející místo objednávek rovnou faktury. Jako faktury se do FlexiBee naimportují jen nestornované objednávky. Transformace je volně ke stažení.

ABRA FlexiBee, E-Shop, REST API, Shoptet

- (16. 10. 2017)
Kája z Norska
Kája z Norska

Jsem programátor, horolezec a tak trochu FlexiBee fanatik :-).
Na CharlieBlogu sepisuji své nápady a poznatky už od roku 2006.