Pi. máj 20th, 2022

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

Najvhodnejšie je vytvoriť vlastného užívateľa na strane Pohody, ktorému povolíte XML komunikáciu 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. Príkaz je 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. 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 následne 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);
    }
}

Od Havri

Proste IT chlapec :) Programovanie a gaming sú moje hobby.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená.