Přenos stavu skladu z FlexiBee do e-shopu Shoptet

Máme synchronizované produkty a ve FlexiBee jsme si je naskladnili. Nový stav skladu potřebujeme nahrát zpět do e-shopu Shoptet. Jak na to?

V minulém článku jsem popisoval, jak zajistit, abychom měli ve FlexiBee i v e-shopu Shoptet stejné produkty. To, že máme synchronizované produkty, nám umožní objednávat u dodavatelů a naskladňovat produkty příjemkami nebo přijatými fakturami. Když zboží naskladníme, FlexiBee přepočte stavy skladu na skladových kartách. Tak, a teď přichází to, co budeme řešit dnes. Jak tento nový stav skladu přeneseme zpět do Shoptetu, aby zákazníci mohli nakupovat.

Ať už máme sklad jakýchkoli rozměrů, FlexiBee ho zvládne!
Ať už máme sklad jakýchkoli rozměrů, FlexiBee ho zvládne!


XSLT transformace ve FlexiBee

FlexiBee má propracované REST-API, které umí data exportovat v různých formátech jako například XML nebo JSON. Ani jeden z těchto formátů ale Shoptet načítat neumí. Ono totiž není XML jako XML :-).

Musíme si tedy opět pomoci XSLT transformací. Ta nám z XML souboru vyexportovaného z FlexiBee udělá XML, kterému Shoptet rozumí. Samotná transformace je výrazně jednodušší než ta, kterou jsme využili při synchronizaci produktů. Nazpět do Shoptetu posíláme jen kód produktu, stav skladu a aktuální skladovou (nákupní) cenu.

Ukázka XSLT transformace:
<?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" />

  <xsl:template match="winstrom">
    <SHOP>
      <xsl:apply-templates select="skladova-karta"/>
    </SHOP>
  </xsl:template>

  <xsl:template match="skladova-karta">
    <!-- zpracování konkrétní skladové karty -->
    <SHOPITEM>
      <CODE><xsl:value-of select="java:flexibee.Tool.substring(cenik, 5)"/></CODE>
      <STOCK>
        <AMOUNT><xsl:value-of select="stavMjSPozadavky - rezervMJ"/></AMOUNT>
      </STOCK>
      <PURCHASE_PRICE><xsl:value-of select="java:flexibee.Tool.round(prumCenaTuz, '2')"/></PURCHASE_PRICE>
    </SHOPITEM>
  </xsl:template>

</xsl:stylesheet>

Do FlexiBee ji opět zadáme v menu Nástroje → Uživatelské transformace. Klikneme na tlačítko Nový a vyplníme Zkratku, Název a do pole Dotaz zkopírujeme transformaci. Zadanou zkratku si opět zapamatujeme :-).


URL adresa, kterou budeme pro získání stavu skladu používat je:
https://{server}:{port}/c/{identifikátor firmy}/skladova-karta/(sklad='code:{zkratka skladu}' and ucetObdobi='code:{zkratka účetního období}').xml?detail=custom:cenik,rezervMJ,stavMjSPozadavky,prumCenaTuz&format=code:{zkratka transformace}&limit=0
Tato URL adresa obsahuje několik parametrů, které musíme doplnit. Server a port jsou standardní adresa a port FlexiBee serveru. Identifikátor firmy určuje, ze které firmy se budou data načítat. Do filtrace je potřeba doplnit zkratku skladu a zkratku účetního období. Posledním parametrem je zkratka transformace, kterou jsme si zapamatovali.

Reálná adresa tedy bude například:
https://demo.flexibee.eu:5434/c/demo/skladova-karta/(sklad='code:SKLAD'%20and%20ucetObdobi='code:2017').xml?detail=custom:cenik,rezervMJ,stavMjSPozadavky,prumCenaTuz&format=code:SHOPTET-STAV-SKLADU&limit=0

Ruční nahrávání do Shoptetu

Z FlexiBee si tedy můžeme stáhnout XML soubor ve formátu, který Shoptet umí zpracovat. Je ho možné ručně nahrát do e-shopu Shoptet. Nahrání se provádí v administraci e-shopu v menu PRODUKTY → Import. Vybereme uložený XML soubor, který vytvořilo FlexiBee a klikneme na tlačítko Importovat.

Stavy skladu je možné nahrát ručně
Stavy skladu je možné nahrát ručně


Po úspěšném importu se podle stavu skladu z FlexiBee nastaví stav skladu v e-shopu Shoptet. Také dojde k úpravě nákupních cen.

Automatizace přenosu

Komu by se ale chtělo každou chvíli ručně přehrávat stav skladu? I zde je možné si tuto činnost zautomatizovat. Na straně FlexiBee je API feed dostupný neustále. Takže jak zajistíme jeho automatické nahrání do e-shopu Shoptet?

Automatický import produktů

K tomuto účelu je možné využít funkci Shoptetu pojmenovanou Automatický import produktů. Nalezneme ji opět v administraci e-shopu v menu PRODUKTY. Zadáme adresu s API feedem. Tuto adresu zvalidujeme a zaškrtáme zaškrtávátka pro Nákupní cenu, Sklad a Množství.

Nastavení automatického importu produktů
Nastavení automatického importu produktů


Pak už zbývá jen čekat, až si Shoptet data načte a zaktualizuje podle nich svůj stav skladu.

FlexiBee nedá data jen tak aneb odstranění autentizace

Je tu ale malý problém. Aby FlexiBee vydalo nějaká data, potřebuje přihlašovací údaje. Při ručním stažení souboru jsme také museli zadat uživatelské jméno a heslo.

Máme opět několik možností, jak tento problém vyřešit. Nejjednodušší je zadat jméno a heslo přímo do URL adresy API feedu.

Finální adresa pro automatický import produktů tedy bude:
https://{username}:{password}@{server}:{port}/c/{identifikátor firmy}/skladova-karta/(sklad='code:{zkratka skladu}' and ucetObdobi='code:{zkratka účetního období}').xml?detail=custom:cenik,rezervMJ,stavMjSPozadavky,prumCenaTuz&format=code:{zkratka transformace}&limit=0
Příklad:
https://winstrom:winstrom@demo.flexibee.eu:5434/c/demo/skladova-karta/(sklad='code:SKLAD'%20and%20ucetObdobi='code:2017').xml?detail=custom:cenik,rezervMJ,stavMjSPozadavky,prumCenaTuz&format=code:SHOPTET-STAV-SKLADU&limit=0
Všechno funguje :-).

Jak jsem řekl, je více možností jak odstranit autentizaci. Uvedu tedy ještě jednu. Není nejmenší problém vytvořit si nějakou proxy, která zadání jména a hesla vyřeší. Například v PHP je to sranda :-).

Možnosti rozšíření importu

Transformace je napsána tak, aby z FlexiBee vracela jen zkratku produktu (podle ní se páruje na produkt v e-shopu Shoptet), stav skladu a nákupní cenu. Je možné ji rozšířit i o prodejní cenu, popisky, výrobce, podobné produkty a další vlastnosti. Všechny mají ve FlexiBee svá políčka.

Proč to udělat? Jeden důvod mě hned napadá. Můžeme takto mít ve všech svých e-shopech stejné produkty, respektive v jednom e-shopu nějakou skupinu produktů a v jiném jinou. Tyto skupiny se mohou libovolně překrývat. Stačí jen jednoduchá úprava URL adresy FlexiBee API feedu, ze kterého získáváme data (doplnění další filtrace). A je to.

Shrnutí aktuálního stavu propojení

Máme tedy ve FlexiBee i v e-shopu Shoptet stejné produkty. Díky tomu můžeme ve FlexiBee naskladňovat. Do e-shopu Shoptet se nám v pravidelných intervalech načítá z FlexiBee stav skladu. Zákazníci tedy ví, kolik zboží máme skladem a mohou spokojeně nakupovat.

Co bude dál? Objednávky. Potřebujeme je přenést do FlexiBee, abychom mohli podle nich například objednávat zboží u dodavatelů. Buď je možné lehce upravit postup z článku Jednoduchý přenos objednávek z e-shopu Shoptet do FlexiBee, nebo to můžeme udělat stejně jako s produkty a stavem skladu (použít XSLT transformaci).

Nebo možná ještě sesynchronizujeme zákazníky?

Ale o tom až příště :-).

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.