Pohoda a Eshop - prepojenie

Uverejnené: 09.03.2021


Ekonomický systém POHODA

 

Veľká časť importu/exportu sa dá zabezpečiť pomocou XML komunikácie, ktorú si najskôr odporúčam prejsť. 

Najvhodnejšie by bolo vytvoriť vlastného užívateľa na strane Pohody, ktorému sa povolí XML komunikácia a prístupy do agiend, ktoré sú potrebné pre export/import údajov. V prípade, ak by sa niekto dostal k tomuto užívateľovi (zneužitie údajov), tak by nevedel v programe nič vykonať. Napríklad, ak vytvoríte užívateľa pre XML komunikáciu v Nastavenie>Prístupové práva>Užívatelia a povolíte mu len agendu zásoby a zvolíte práva len na čítanie, tak dokáže pozrieť len zásoby, ale nič iné s nimi nevie vykonať (upraviť/vymazať). 

 

e-shop (php)

Najskôr musí e-shop vedieť spracovať požiadavku z Pohody. Tu je príklad scriptu, ktorý vytvorí súbor zásoby.xml a následne z neho číta údaje. V tomto príklade vykoná import do databázy do tabuľky zásoby. Je to napísané v jazyku php. Toto môžete využiť napríklad pre Všeobecný internetový obchod.

<?php
$file = 'stocks.xml';
$content = file_get_contents("php://input");
file_put_contents($file, $content);
if (!is_file($file)) {
    echo 'No file';
    return;
}
	
if (!empty($content)) {	
$xml = simplexml_load_file("stocks.xml");
$ns   = $xml->getDocNamespaces();
$data = $xml->children($ns['rsp']);

$list  = $data->children($ns['lStk']);
$items = $list->children($ns['lStk']);

	foreach ($items as $item) {
		$stock = $item->children($ns['stk'])->children($ns['stk']);
		$id = $stock->id;
		$ean = $stock->EAN;
		$code = $stock->code;
		$name = $stock->name;
		$unit = $stock->unit;
		$count = $stock->count;
		$price = $stock->sellingPrice;

		$pridat = $mysqli->query("INSERT INTO stocks (ID, EAN, Code, Name, Unit, Count, Price) 
		VALUES 
		('".$id."','".$ean."', '".$code."', '".$name."', '".$unit."', '".$count."', '".$price."')");
		}
}


// odpoveď do Pohody, vrátanie elementu ResponsePack s atribútom state = ok
header("Content-Type: text/xml; charset=UTF-8"); 
echo '<?xml version="1.0" encoding="UTF-8"?>
<rsp:responsePack xmlns:rsp="http://www.stormware.cz/schema/version_2/response.xsd" note="Odpoveď z e-shopu" application="havri.eu"
 state="ok" id="00000001" version="2.0" > </rsp:responsePack>';	
?>

 

Pohoda

Na najčastejšie prepojenie sa používa Pohoda mServer. Treba si ale uvedomiť, že Pohoda mServer je jednoduchý HTTP server Pohody, ktorý funguje lokálne na PC, kde je nainštalovaná Pohoda. Táto jednoduchá aplikácia dokáže prijať a spracovať požiadavky. Ale na to, aby Pohoda mServer dokázal prijať a spracovať požiadavku tak musí byť:

  • priamo prepojený s e-shopom (napr. pomocou VPN alebo Port Forwarding), kde priamo E-shop dokáže poslať požiadavku (napr. na export zásob) do Pohody, čiže z webu e-shopu viete odoslať rovno požiadavku na mServer. Napríklad to funguje tak, že v momente, keď zákazník vytvorí objednávku na e-shope, tak e-shop ju pošle priamo na mServer do Pohody
  • aplikácia tretej strany / vlastná aplikácia, ktorá beží lokálne na PC, kde beží aj Pohoda mServer; aplikácia vykonáva sprostredkovanie komunikácie medzi e-shopom a mServerom.
    Pohoda - Eshop connector 
    Tu si ale treba uvedomiť, že to nie je vždy v aktuálnom čase, ale synchronizácia prebieha v nejakom intervale (napr. každých 15 minút). 

 

V prípade, ak sa rozhodnete vytvoriť vlastnú aplikáciu na prepojenie e-shopu a Pohody, tak odporúčam do aplikácie zabudovať mServer komunikáciu, taktiež by som odporúčal rátať s +1 licencou, vyhradenou len vyslovene pre XML komunikáciu/mServer.


Moje odporúčania - vlastná aplikácia na prepojenie (c#)

Teória
Ak budete tvoriť vlastnú aplikáciu, tak aplikáciu zamerajte na mServer. Obrázky zásob a PDF súbory budete sťahovať z lokálneho disku PC cez FTP smerom na web. Aby ste odľahčili FTP komunikáciu, tak si vytvoríte nejaké logovanie v aplikacií, ktorá bude zaznamenávať odoslané súbory na web a bude ich porovnaváť s lokálnymi súbormi pri prenose na web, kde prenesie len tie zmenené alebo nové (sledovať si môžete napr. veľkosť súboru a dátum zmeny).

Príklad v C# (vlastná aplikácia na úrovni OS)
Aplikácia bude komunikovať metódou POST cez HTTP protokol. Najskôr si aplikácia stiahne prijaté objednávky z e-shopu a z Pohody vygeneruje XML zásoby a odošle ich smerom na e-shop.
Vytvorenie funkcie, ktorá odosiela XML súbory smerom na mServer (request):

private void OdoslaniePOST(string file, string agenda, string ResponseUrl, string ResponseFile)
{
    try
    {
        // IP adresa / názov a port mServera
        string mServerAddress = "http://localhost:4444";

        // Meno a heslo užívateľa na strane Pohody
        string UsernamePohoda = "Admin";
        string PasswordPohoda = "heslo1";

        // Transformácia do Base64 kódovania, ktoré vyžaduje autentizácia Pohody
        byte[] Post64Pohoda = System.Text.Encoding.UTF8.GetBytes(UsernamePohoda + ":" + PasswordPohoda);
        var PostNamePass = Convert.ToBase64String(Post64Pohoda);

        using (var client = new WebClientWithResponse())
        {
            client.Headers.Add("Content-Type", "application/Pohoda");
            client.Headers.Add("STW-Instance", agenda);
            client.Headers.Add("STW-Authorization", "Basic " + PostNamePass);
            client.Headers.Add("User-Agent", "User-Agent: STORMWARE HTTP client. http://www.stormware.cz");
            using (var requestStream = client.OpenWrite(new Uri(mServerAddress + "/xml"), "POST"))
            {
                using (var fileStream = File.OpenRead(file))
                {
                    fileStream.CopyTo(requestStream);
                }
            }
            var bytes = client.Response;
            string mServerResponse = System.Text.Encoding.GetEncoding(1250).GetString(bytes);
            File.WriteAllText(ResponseFile, mServerResponse, Encoding.GetEncoding(1250));

            using (var requestStream = client.OpenWrite(new Uri(ResponseUrl), "POST"))
            {
                using (var fileStream = File.OpenRead(ResponseFile))
                {
                    fileStream.CopyTo(requestStream);
                }
            }

        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message.ToString(), agenda);
    }
}