Import objednávek z e-shopu Shoptet do ABRA FlexiBee

V našem seriálu o propojení e-shop řešení Shoptet s účetnictvím ABRA FlexiBee jsem se již základnímu přenosu objednávek věnovali. Co však dělat, když nám jednoduchý přenos objednávek nestačí? Jak importovat objednávky s vyplněním všech potřebných informací? Řešení vám ukážeme v následujícím návodu.

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

  • Není možné v objednávkách vyplňovat správné datum vystavení.
  • V e-shopu Shoptet je nutné změnit zobrazení čísel v měně (ať už CZK nebo cizí).
  • Objednávky se nenavazují na firmy v adresáři ABRA FlexiBee.
  • 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 ABRA FlexiBee?

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 automatizovat.

V menu OBJEDNÁVKY → Export zvolte Typ exportu systémový: Shoptet – XML. Nastavte, jaké objednávky chcete do exportu zahrnout a ve spodní části obrazovky získáte adresu permanentního odkazu.

Nastavení exportu objednávek v Shoptetu

Import objednávek do ABRA FlexiBee

Pro bezproblémové přenesení objednávek se všemi potřebnými údaji využijte opět Uživatelské transformace, novinku z verze ABRA FlexiBee 2017.2.

Transformace, která převede XML z e-shopu Shoptet na formát vhodný pro ARBA 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í, zadejte v ABRA FlexiBee do evidence Uživatelské transformace (horní menu Nástroje → Uživatelské transformace). Vyplňte Zkratku a Název transformace. Do pole Dotaz vyplňte zdrojový kód XSLT transformace.

V transformaci je obsaženo:

  • Vyplňování formy dopravy. Importované objednávky budou mít vyplněnu formu dopravy, aby bylo možné plně využívat modul dopravci v ABRA FlexiBee.
  • Vyplňování formy úhrady. Importované objednávky budou mít vyplněnu formu úhrady, tedy jak si přeje zákazník zaplatit.
  • Vyplňování pole variabilní symbol. Pro správné párování plateb je potřeba vyplnit na objednávkách a fakturách pole variabilní symbol.

Transformace ke stažení

Pro úplnost jsme připravili ještě druhou verzi transformace, která vytváří místo objednávek rovnou faktury. Jako faktury se do ABRA FlexiBee importují jen nestornované objednávky

Transformace vytvářející faktury místo objednávek ke stažení

Zadanou transformaci využijete pro zápis objednávek přes REST-API. Složte si tedy URL adresu, na kterou budete 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ů. V tomto případě budou stačit dva – GET a PUT.

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

Požadavkem typu PUT zapíšete získaná data do ABRA FlexiBee. K tomu potřebujete 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íte do něj adresu permanentního odkazu a otestujte, 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 ABRA FlexiBee. Vyplňte do něho adresu ABRA FlexiBee API s parametrem format. Vyberte metodu PUT, nastavte Druh těla požadavku na Raw, Typ obsahu bude XML (application/xml) a jako Content nastavte data získaná předchozím modulem. Přihlašovací jméno a heslo API uživatele zadáte do políček Uživatelské jméno a Heslo.

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

Pokud budete chtít, můžete 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 chcete vytvářet faktury, nahradíte v XSLT transformaci všechny výskyty objednavka-prijata za faktura-vydana.

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

Nastavení ABRA FlexiBee

Doporučujeme nastavit si v ABRA FlexiBee automatické rezervace. Je totiž žádoucí 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čujeme vybrat 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ášíte zpět do Shoptetu.

Pokud vytváříte místo objednávek rovnou faktury, musíte dát pozor na stav skladu. ABRA 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 potřebujete takovéto doklady vytvářet, musíte umožnit generování požadavků na výdej. Požadavky povolíte opět v nastavení firmy v záložce Moduly → Zboží zaškrtnutím nastavení Umožnit generování požadavků na výdej.

Shrnutí aktuálního stavu

Pokud pravidelně sledujete náš seriál, v tuto chvíli máte jistě Shoptet propojen s ABRA FlexiBee tak, že se objednávky přenášejí automaticky a správně se v nich vyplňují odběratelé a produkty. V ABRA FlexiBee je podle nich možné vytvářet objednávky pro dodavatele, vystavit zákazníkovi fakturu a vyskladnit zboží ze skladu. Příště si přiblížíme přenos daňových dokladů, které v Shoptetu vystavujete.