Přenos produktů z e-shopu Shoptet do FlexiBee

Používáte e-shop Shoptet? Jednou z důležitých součástí synchronizace s účetnictvím ABRA FlexiBee je přenos produktů. Chcete vědět jak na to?

Shoptet obsahuje dobrou administraci produktů. Všechny potřebné údaje pro běžné i pro variantní produkty je možné zadat celkem jednoduše. Pro synchronizaci s ekonomickým systémem ABRA FlexiBee je nutné tyto produkty přenést do FlexiBee. Když budeme mít v Shoptetu i ve FlexiBee stejný ceník, budeme moci ve FlexiBee naskladňovat zboží a také stav skladu přenášet zpět do e-shopu Shoptet.

Většina e-shopů a jejich synchronizací s ekonomickými systémy by měla fungovat tak, že e-shop je hlavním místem, kde se upravují produkty. V ekonomickém systému se řeší naskladňování a přijaté faktury.

Produktem může být cokoliv (Photo by Anne Preble on Unsplash)
Produktem může být cokoliv (Photo by Anne Preble on Unsplash)


Jak získat z e-shopu Shoptet data o produktech?

Tato část je jednoduchá. Shoptet umožňuje export produktů do XML. Tento XML soubor je dostupný na pevně dané internetové adrese. Export do XML má několik formátů. Já jsem zvolil možnost Kompletní export, protože jsem předpokládal, že bude obsahovat všechna potřebná data :-).

Export se nastavuje v menu Produkty → Export. Je možné zvolit si Typ (Kompletní export). Formát se předvybere podle Typu. Případně můžeme nastavit filtraci. To ale nejspíš není nutné, protože chceme do FlexiBee přenést všechny produkty.

Pod nastavením je pak uveden Permanentní odkaz zvoleného exportu. To je adresa, kterou budeme využívat.

URL adresa kterou budeme používat při synchronizaci produktů
URL adresa kterou budeme používat při synchronizaci produktů


Jak data nahrát do ABRA FlexiBee?

Na první pohled je jasné, že data z e-shopu Shoptet rovnou do FlexiBee nahrát nepůjde. Budeme tedy muset využít jednu z novinek FlexiBee verze 2017.2. Touto novinkou jsou Uživatelské XSLT transformace.

Uživatelská XSLT transformace

Připravíme si tedy XSLT transformaci, která bude převádět data z Shoptet formátu na FlexiBee formát.
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:java="http://xml.apache.org/xalan/java" exclude-result-prefixes="java">

  <xsl:output method="xml" encoding="utf-8" />

  <!-- zkratka skladu na kterém je zboží určené pro eshop -->
  <xsl:variable name="sklad" select="'SKLAD'" />

  <xsl:template match="SHOP">
    <winstrom version="1.0">
      <xsl:apply-templates select="SHOPITEM"/>
      <xsl:apply-templates select="SHOPITEM/SET_ITEMS"/>
    </winstrom>
  </xsl:template>

  <xsl:template name="STEJNE">
    <!-- vytvoření produktu - není rozdíl mezi produktem s variantami a bez variant -->
    <xsl:param name="itemType"/>
    <!-- identifikátory -->
    <id>code:<xsl:value-of select="CODE"/></id>
    <kod><xsl:value-of select="CODE"/></kod>
    <xsl:if test="EAN and EAN != ''">
      <!--id>ean:<xsl:value-of select="EAN"/></id-->
      <eanKod><xsl:value-of select="EAN"/></eanKod>
    </xsl:if>

    <!-- důležitá pole -->
    <xsl:choose>
      <xsl:when test="PRICE_VAT">
        <cenaZakl><xsl:value-of select="PRICE_VAT"/></cenaZakl>
        <typCenyDphK>typCeny.sDph</typCenyDphK>
      </xsl:when>
      <xsl:when test="PRICE">
        <cenaZakl><xsl:value-of select="PRICE"/></cenaZakl>
        <typCenyDphK>typCeny.bezDph</typCenyDphK>
      </xsl:when>
    </xsl:choose>
    <xsl:choose>
      <xsl:when test="VAT = 0">
        <typSzbDphK>typSzbDph.dphOsv</typSzbDphK>
      </xsl:when>
      <xsl:when test="VAT = 10">
        <typSzbDphK>typSzbDph.dphSniz2</typSzbDphK>
      </xsl:when>
      <xsl:when test="VAT = 15">
        <typSzbDphK>typSzbDph.dphSniz</typSzbDphK>
      </xsl:when>
      <xsl:otherwise>
        <typSzbDphK>typSzbDph.dphZakl</typSzbDphK>
      </xsl:otherwise>
    </xsl:choose>

    <xsl:if test="$itemType = 'product' or $itemType = 'set'">
      <!-- skladové karty -->
      <skladove>true</skladove>
      <sklad-karty>
        <skladova-karta>
          <sklad>code:<xsl:value-of select="$sklad"/></sklad>
          <ucetObdobi>code:<xsl:value-of select="java:flexibee.Tool.substring(java:flexibee.Tool.currentDate(), 0, 4)"/></ucetObdobi>
        </skladova-karta>
      </sklad-karty>
    </xsl:if>

    <poznam><xsl:value-of select="$itemType"/></poznam>
  </xsl:template>

  <xsl:template name="ITEM">
    <!-- jednoduchý produkt -->
    <cenik>
      <id>ext:shoptet-product:<xsl:value-of select="@id"/></id>
      <xsl:call-template name="STEJNE">
        <xsl:with-param name="itemType" select="ITEM_TYPE" />
      </xsl:call-template>
      <nazev><xsl:value-of select="NAME"/></nazev>
    </cenik>
  </xsl:template>

  <xsl:template match="VARIANTS/VARIANT">
    <!-- produkt s variantami -->
    <cenik>
      <id>ext:shoptet-product:<xsl:value-of select="../../@id"/>-<xsl:value-of select="@id"/></id>
      <id>ext:shoptet-product-variant:<xsl:value-of select="@id"/></id>
      <xsl:call-template name="STEJNE">
        <xsl:with-param name="itemType" select="../../ITEM_TYPE" />
      </xsl:call-template>
      <xsl:if test="../../ITEM_TYPE = 'set'">
        <setWithVariants/>
      </xsl:if>
      <nazev><xsl:value-of select="../../NAME"/> - <xsl:value-of select="CODE"/></nazev>
    </cenik>
  </xsl:template>

  <xsl:template match="SHOPITEM">
    <!-- rozhodování zda se jedná o produkt s variantami nebo bez variant -->
    <xsl:if test="VARIANTS">
      <xsl:apply-templates select="VARIANTS/VARIANT"/>
    </xsl:if>
    <xsl:if test="not(VARIANTS)">
      <xsl:call-template name="ITEM"/>
    </xsl:if>
  </xsl:template>

  <xsl:template match="SHOPITEM/SET_ITEMS">
    <!-- zpracování rozpadů sad -->
    <cenik>
      <id>code:<xsl:value-of select="../CODE"/></id>
      <xsl:if test="../ITEM_TYPE = 'set'">
        <sady-a-komplety removeAll="true">
          <xsl:apply-templates select="SET_ITEM"/>
        </sady-a-komplety>
      </xsl:if>
    </cenik>
  </xsl:template>

  <xsl:template match="SET_ITEM">
    <!-- jednotlivý rozpad sady -->
    <sady-a-komplety>
      <id>ext:SHOPTET-SET:<xsl:value-of select="../../CODE"/>-<xsl:value-of select="CODE"/>-<xsl:value-of select="AMOUNT"/></id>
      <!--cenikSada>code:<xsl:value-of select="../../CODE"/></cenikSada-->
      <cenik>code:<xsl:value-of select="CODE"/></cenik>
      <mnozMj><xsl:value-of select="AMOUNT"/></mnozMj>
    </sady-a-komplety>
  </xsl:template>

</xsl:stylesheet>


Tuto XSLT transformaci zadáme do FlexiBee. Zadání provedeme v menu Nástroje → Uživatelské transformace. Stiskneme tlačítko Nový a vyplníme pole Zkratka (zapamatovat!) a Název. Do pole Dotaz vložíme kompletní XSLT transformaci a stiskneme tlačítko Uložit a zavřít.


Internetová adresa, kterou budeme používat pro import na straně FlexiBee je:
https://{server}:{port}/c/{identifikátor firmy}/cenik.xml?format=code:{zkratka}
Server a port jsou standardní adresa a port FlexiBee serveru. Identifikátor firmy určuje, do které firmy budeme produkty nahrávat. Zkratka na konci je námi zvolená zkratka XSLT transformace, kterou jsme si zapamatovali :-).

Adresa tedy například bude:
https://demo.flexibee.eu:5434/c/demo/cenik.xml?format=code:SHOPTET-PRODUKTY

Jak spojit FlexiBee a Shoptet?

Nyní máme připraveno všechno na straně e-shopu Shoptet i na straně FlexiBee. Musíme jen zajistit, aby data „tekla“. Synchronizaci můžeme rozpohybovat několika způsoby a záleží na každém uživateli, jaký si zvolí.

Využití cURL

Pro spojení obou stran je možné využít nástroj cURL. Funguje na Windows, macOS i na Linuxu. Spouštění je možné zajistit cronem (plánovačem úloh).

Přenos produktů ze Shoptetu do FlexiBee je možné pomocí cURL spustit například tako:

curl "https://123456.myshoptet.com/export/productsComplete.xml?patternId=-5&hash=e3ed846e17cbe694ae2072fbcc81234564fcd7375f64d07c6bf0714561b3c995" > shoptet-products.xml

curl -X PUT "https://demo.flexibee.eu:5434/c/demo/cenik.xml?format=code:SHOPTET-PRODUKTY" -T shoptet-products.xml -u winstrom:winstrom

První příkaz stáhne do souboru shoptet-products.xml kompletní seznam produktů z e-shopu. Druhým příkazem tento soubor nahrajeme do FlexiBee. V URL pro nahrání do FlexiBee jsme použili parametr format. Tento parametr zajistí spuštění XSLT transformace.

Výhody? Je to zdarma a vynaložíme minimální úsilí.

Nevýhody? Pokud má být řešení plně automatické, bude potřeba non-stop běžící počítač.

Scénář v Integromatu

Je také možné vytvořit si scénář v Integromatu. Toto řešení preferuji, protože mám všechno krásně pod kontrolou a nemusím mít nikde žádný běžící server.

Scénář bude jednoduchý. Bude obsahovat jen dva HTTP moduly. První bude stahovat data ze Shoptetu a druhý je bez jakékoliv změny nahraje do FlexiBee.

Scénář v Integromatu
Scénář v Integromatu

Nastavení HTTP modulu pro načtení dat
Nastavení HTTP modulu pro načtení dat

Nastavení HTTP modulu pro zápis dat
Nastavení HTTP modulu pro zápis dat


PHP nebo jiná aplikace

Je samozřejmě možné si naprogramovat i jakoukoliv jinou jednoduchou aplikaci, která načte data ze Shoptetu a zapíše je do FlexiBee. Toto řešení ale nyní rozebírat nebudu, protože je příliš obtížné a nepřináší oproti předchozím dvěma způsobům žádné výhody :-).

Závěr

Pokud do FlexiBee přeneseme seznam produktů, umožní nám to ve FlexiBee vytvářet příjemky na zboží. Stav skladu pak budeme moci přenášet zpátky do Shoptetu.

Jak přenést stav skladu z FlexiBee zpět do Shoptetu si rozebeme v dalším článku. Tak se těšte :-).

Aktualizace 28. 9. 2017 - Podpora pro sady a služby

Dnes jsem aktualizoval transformaci pro přenos produktů ze Shoptetu do FlexiBee.

Seznam změn:

  • Doplněna podpora pro sady. Nyní se nám ve FlexiBee vytvoří produkty typu sada i s rozpadem na jednotivé součásti.
  • Doplněna podpora pro služby. S novou verzí transformace se u služeb ve FlexiBee nevytváří skladové karty a není tedy nutné sledovat a dodržovat stav skladu.
  • Vylepšeno získávání účetnícho období pro nové skladové karty. V původní transformaci bylo napevno zadáno účetní období 2017. Na přelomu roku by tedy bylo nutné aktualizovat transformaci, aby využívala nové skladové karty. Nyní se zkratka účetního období získává z aktuálního data, takže se přechod na rok 2018 provede automaticky.

ABRA FlexiBee, E-Shop, REST API, Shoptet

- (10. 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.