Informacje Techniczne

Wymagania ERP:

Insert Subiekt GT * wolną licencję na stanowisko w Subiekt GT (możesz założyć podmiot testowy w Subiekt GT którego ważność licencji to 45dni, licencję na Subiekt GT);
* wolna licencja na Sferę dla Subiekt GT (możesz uruchomić testowo sferę na 14 dni, możesz też kupić licencję na pierwsze stanowisko. Jeśli korzystasz z innych integracji musisz kupić jedną dodatkowo tylko na potrzeby oprogramowania SellIntegro, ale pamiętaj, że niezależnie, czy korzystasz z 1 czy 20 integracji nasz endpoint potrzebuje tylko 1 licencji Sfery)
* nazwy użytkownika i hasło dostępu do bazy danych SQL (dołączony do programów GT instalator serwera SQL ustawia domyślnie użytkownika “sa” oraz hasło puste. W przypadku, gdy instalacja serwera SQL została przeprowadzona ręcznie, hasło może być ustawione);
* stałego, przewodowego dostępu do internetu (nie zalecamy połączeń mobilnych ze względu na problemy ze stabilnością połączenia oraz ograniczenia transferu).
* endpoint- dostępny do zainstalowania z panelu wtyczki;
* Do obsługi walut - Abonament
* Do obsługi flag i WSTO - Plus Subiekt GT
Comarch ERP Optima * Dostępne wolne moduły: “Handel lub Handel Plus” oraz “Kasa/Bank lub Kasa/Bank Plus”;
* Nazwę podmiotu oraz dane operatora Optima
* endpoint- dostępny do zainstalowania z panelu wtyczki;
* stałego, przewodowego dostępu do internetu (nie zalecamy połączeń mobilnych ze względu na problemy ze stabilnością połączenia oraz ograniczenia transferu).
* Do rozliczania dokumentów w walucie obcej Kasa/Bank Plus
Subiekt nexo PRO * wolną licencję na stanowisko w Subiekt nexo PRO (możesz założyć podmiot testowy w Subiekt nexo PRO którego ważność licencji to 45 dni); (Dany użytkownik powinien mieć ustawione hasło do logowania nexo Pro)
* wolna licencja na Sferę dla Subiekt nexo PRO (Sfera jest zawarta w ramach pakietu PRO dla Nexo) jeśli korzystasz z innych integracji musisz kupić dodatkową licencję tylko pod potrzeby oprogramowania SellIntegro. Pamiętaj, że niezależnie, czy korzystasz z 1, czy 20 wtyczek nasz integrator potrzebuje tylko 1 licencji Sfery. Jeśli korzystasz z jednej licencji Sfery, integracja będzie działać dopiero po zwolnieniu stanowiska;
* nazwy użytkownika i hasło dostępu do bazy danych SQL (dołączony do programów nexo instalator serwera SQL ustawia domyślnie użytkownika “sa” oraz hasło puste. W przypadku, gdy instalacja serwera SQL została przeprowadzona ręcznie, hasło może być ustawione);
* endpoint- dostępny do zainstalowania z panelu danej wtyczki;
* stałego, przewodowego dostępu do internetu (nie zalecamy połączeń mobilnych ze względu na problemy ze stabilnością połączenia oraz ograniczenia transferu).
Wapro MAG * Wolna licencja WAPRO Mag
* Do generowania dokumentów PDF oraz wysyłki maili WAPRO Mag w wersji min. Prestiż
* Dane do logowania do bazy SQL WAPRO Mag
* Dane do logowania operatora WAPRO Mag
Insert Navireo * Wolna licencja na stanowisko Navireo oraz wolna Sfera Navireo
* Plik startowy programu Navireo w formacie .iqa - do wygenerowania z pulpitu konfiguracyjnego Navireo
Comarch XL * Wolna licencja na co najmniej moduły Sprzedaż, Zamówienia oraz Księgowość
* Ścieżka instalacji Comarch ERP XL z plikiem API
* Dane do logowania do bazy SQL Comarch ERP XL
* Dane do logowania do operatora Comarch ERP XL
* Integrator musi być zainstalowany na serwerze z bazą Comarch ERP XL
Comarch XT * ClientID oraz ClientSecret z Comarch XT
enova365 * Dane do logowania do SQL enova365
* Dane do logowania operatora enova365
* Ścieżka instalacji enova365
* Wolna licencja enova365

Wymagania sprzętowe:

Minimalne wymagania sprzętowe: * komputer z procesorem minimum core2duo 2 GHz (lub lepszym);
* 4 GB pamięci operacyjnej RAM (lub więcej);
* około 1,5 GB wolnego miejsca na dysku twardym dla instalacji klienckiej;
* system operacyjny Windows 8, Windows 8.1, Windows 10, Windows Server 2012, Windows Server 2012 R2, Windows Server 2016; Windows Server 2019;
* system obsługi baz danych Microsoft SQL Server 2008 R2, 2012, 2014, 2016, 2017 – bezpłatna wersja Microsoft SQL Server 2014 dostarczana jest wraz z systemem.
* Minimalne wymagania są zależne od wykorzystywanych wtyczek oraz od ilości przetwarzanych danych (limity sa określony przy każdym produkcie)
Rekomendowane wymagania sprzętowe: * komputer z czterordzeniowym procesor Intel Core I5 2500 (lub nowszy)/AMD Phenom X4 805 (lub nowszy) ;
* 8GB pamięci operacyjnej RAM;
* 64 bitowy system operacyjny Windows 8, Windows 8.1, Windows 10, Windows Server 2012, Windows Server 2012 R2, Windows Server 2016, Windows Server 2019;

Kierunek komunikacji

Integrator do komunikacji używa protkołu HTTPS poprzez protkół TCP/IP. Portem używanym przez integrator jest zawsze port 443. Połączenie przy użyciu protkołu TCP/IP jest zawsze inicjowane z komputera, na którym uruchomiony jest Endpoint i docelowo łączy się z platformą SellIntegro lub systemem eCommerce. Do poprawnego działania integratora nie ma potrzeby otwierania portów na maszynie, na której pracuje EndPoint

Aby zapewnić bezproblemową komunikację EndPoint’a należy aplikacją, z której składa się integracja, umożliwić inicjowanie nowych połączeń wychodzących (TCP:SYN) oraz pełnej dwukierunkowej komunikacji po nawiązaniu połączenia (TCP:ESTABLISHED) Typy komunikacji

Do poprawnej komunikacji integratora z platformą SellIntegro obowiązkowo dla każdej integracji wymagana jest komunikacja z podstawowymi usługami SellIntegro. Dla wybranych integracji potrzebne jest proxy dostępowe do systemów eCommerce w ramach platformy SellIntegro, a połączenie do pozostałych platform odbywa się bezpośrednio. Adresy warstwy trasnportowej (4. Warstwa modelu OSI)

Adresy czwartej warstwy modelu OSI czyli adresy IP używane przez protkół TCP/IP mogą być zmienione w dowolnym momencie. Dla sprawnego uzyskiwania połączenia zalecamy nie używania zapór ogniowych warstwy czwartej. W sytuacji gdy potrzebny jest pojedynczy adres do komunkacji z SellIntegro wymagana jest indywidualna wycena oraz zakup wspracia poziomu Business lub wyżej. Adresy warstwy aplikacji (7. Warstwa modelu OSI)

Do komunikacji z poszczególnymi platformami integrator wykorzystuje następujące adresy URL: Podstawowe usługi SellIntegro:

Działanie integracji:

https://endpointfeed.sellintegro.com/
https://endpointfeed-1.sellintegro.com/
https://endpointfeed-2.sellintegro.com/
https://endpointlogsink.sellintegro.com/
https://endpointlogsink-1.sellintegro.com/
https://endpointlogsink-2.sellintegro.com/
https://endpointwebproxy.sellintegro.com

Konfiguracja integracji:

https://bl2gt.sellintegro.com
https://bl2gt-oldlook.sellintegro.com
https://sellintegro.pl

Bezpośrednia komunikacja z systemami eCommerce:

https://api.baselinker.com
http://gw.api.taobao.com
https://mws-eu.amazonservices.com
https://wsvc.cdiscount.com/MarketplaceAPIService.svc
https://biznes.furgonetka.pl
https://adeplus.gls-poland.com/adeplus/pm1/ade_webapi2.php?wsdl

Proxy dla systemów eCommerce:

https://blproxy-si-angelforce.sellintegro.com/*

Proxy dla pozostałych systemów zewnętrznych:

GUS Proxy - https://gusproxy.sellintegro.com

Czym jest Sfera i do czego ona służy

Czym jest Sfera

Sfera dla Subiekta GT stworzona została w oparciu o znane technologie COM i OLE Automation. Dzięki niej SellIntegro tworzy rozwiązania, które rozszerzą dotychczasową funkcjonalności Subiekta GT oraz integrację, które ułatwiają codzienną pracę w różnych systemach, ściśle według potrzeb danej firmy. Kiedy Sfera jest wymagana

Sfera jest dodatkiem wymaganym do połączenia się z Subiektem GT i do bezpiecznego wprowadzania, zapisywania, odczytu oraz zmiany danych w systemie ERP. Dzięki niej SellIntegro tworzy bezpieczne rozwiązania dla swoich klientów, którzy dzięki temu dodatkowi nie tracą między innymi gwarancji producenta. SellIntegro wymaga tego dodatku dla następujących integracji:

Fiskalizacja
Generowanie dokumentów sprzedaży na status
Integracje przesyłające dokumenty w formacie PDF
Przesyłanie zamówień do systemu ERP
Synchronizacja flag własnych
Wystawianie faktur
Wysyłanie faktur i paragonów email`em
Integracje do rozliczania dokumentów
Przesyłanie produktów do Subiekt GT

Kiedy Sfera nie jest wymagana

Część integracji odczytuje dane w bezpieczny sposób z poziomu bazy danych, w takim przypadku w konfiguratorze SellIntegro wystarczy podać informację do połączenia się z bazą danych. Następujące integracje nie wymagają Sfery:

Synchronizacja Cen

Przesyłanie produktów z systemu ERP

Przesyłanie zamówień z systemu ERP

Synchronizacja stanów magazynowych

Jak uruchomić Sferę

Sferę można uruchomić za darmo na okres 14 dni lub zakupić tutaj.

14-dniową wersję uruchomisz w 3 prostych krokach, korzystając z instrukcji:

W górnym prawym rogu wybrać ikonę Sfery. Jeżeli ikona jest niewidoczna, należy aktywować pasek narzędzi (górne menu Widok - Paski - Pasek narzędzi)
Z prawej strony wybrać Aktywuj wersję próbną, przeczytać komunikat i zatwierdzić OK.

Dla programistów MSDK

Po co Modification-SDK (MSDK)?

MSDK ma Tobie pomóc dopasować gotowe rozwiązania do integracji systemów ERP i Ecommerce do potrzeb Twoich lub Twojego klienta. W ten sposób skrócisz czas wdrożenia nowych narzędzi w firmie i zwiększysz ich elastyczność wedle własnych potrzeb.

Jak to działa?

Obecnie osoby korzystające z integracji są uzależnione od funkcjonalności dostępnych tylko i wyłącznie w scenariuszu konfiguracyjnym, przez co mogą odczuwać pewien brak elastyczności w integracji.

Docs

Użycie jest bardzo proste

W Panelu klienta:

  • Wybierz integrację, w której chcesz wprowadzić modyfikację:

Docs

  • Przejdź do zakładki “Skrypty” (Zapoznaj się z informacjami i zaakceptuj)

Docs

  • Pojawi się edytor skryptów:

Docs

Wprowadź skrypt:

using System;  
using System.Xml.Linq;  
using System.Linq;

namespace Sellintegro 
{
    public class External
    {
        public XElement ProcessSourceData(Action<string> writeError,
            Action<string> writeWarning,
            Action<string> writeInfo, 
            XElement bodyXml)
        {
            writeInfo("Hello World");
            return bodyXml;
        }
    }
}

Korzystaj ze zmian, które ułatwią ci życie w trakcie działania integracji:

Docs

Kod ten może modyfikować przekazane obiekty i dopasować rozwiązanie pod potrzeby klienta końcowego, bez udziału programistów SellIntegro. W zależności od stopnia skomplikowania kodu, zmiany w integracji może wykonać osoby znające język C# lub VBScript.

Kiedy skrypty są uruchamiane

Obecnie skrypty są uruchamiane w wyznaczonych miejscach przez SellIntegro, dokładny opis znajduje się w sekcji danego procesu.

W jakich procesach dostępne są skrypty
  1. Synchronizacja stanów magazynowych - dostępne w wersji VER_STD_v100.0 i wyższej
  2. Synchronizacja cen - w trakcie implementacji
  3. Generowanie dokumentów sprzedaży - zaplanowane
  4. Przesyłanie zamówień do ERP - zaplanowane
  5. Przesyłanie produktów - zaplanowane
  6. Przesyłanie dokumentów w formacie PDF - zaplanowane

W przypadku planowanych procesów zapraszamy do przesłania do nas pomysłów, gotowych przypadków bądź skryptów. W ten sposób będziemy mogli umożliwić wpięcie się w odpowiednie miejsce i zapewnić dostosowanie integracji pod Państwa wymagania.

Od Wersji Nazwa procesu
VER_STD_v100.0 Aktualizacja stanów magazynowych z Insert Subiekt GT do BaseLinker
VER_STD_v100.0 Aktualizacja stanów magazynowych z Insert Subiekt GT do Shoper
VER_STD_v100.0 Aktualizacja stanów magazynowych z Insert Subiekt GT do PrestaShop
VER_STD_v100.0 Aktualizacja stanów magazynowych z Insert Subiekt GT do WooCommerce
VER_STD_v100.0 Aktualizacja stanów magazynowych z Comarch ERP Optima do BaseLinker
VER_STD_v100.0 Aktualizacja stanów magazynowych z Comarch ERP Optima do Shoper
VER_STD_v100.0 Aktualizacja stanów magazynowych z Comarch ERP Optima do PrestaShop
VER_STD_v100.0 Aktualizacja stanów magazynowych z Comarch ERP Optima do WooCommerce
VER_STD_v100.0 Aktualizacja stanów magazynowych z Subiekt nexo PRO do BaseLinker
VER_STD_v100.0 Aktualizacja stanów magazynowych z Subiekt nexo PRO do Shoper
VER_STD_v100.0 Aktualizacja stanów magazynowych z Subiekt nexo PRO do PrestaShop
VER_STD_v100.0 Aktualizacja stanów magazynowych z Subiekt nexo PRO do WooCommerce
Wymagania

MSDK można uruchomić w każdym środowisku Windows, gdzie zainstalowany jest endpoint SellIntegro. Skrypty w języku C# są kompilowane bezpośrednio na komputerze u klienta. Wykorzystywane są do tego dostarczone przez Microsoft .NET Framework gotowe klasy, więcej informacji na ten temat można znaleźć na stronie Microsoft.

Skrypty w języku C#

W przypadku używania MSDK w języku C# konieczne jest posiadanie zainstalowanego .Net Framework w wersji 4.0 lub kompatybilnej.

Wersje Windows, które mają domyślnie zainstalowaną wersję .Net Framework spełniającą wymagania to:

  • Windows 8
  • Windows 8.1
  • Windows Server 2021
  • Windows Server 2012 R2
  • Windows 10

Pełna lista możliwości wraz z opisami jest dostępna pod linkiem. Dodatkowo dokumentacja Microsoft wskazuje na których systemach Windows można opcjonalnie uruchomić komponenty .Net Framework, ponieważ domyślnie nie są aktywne.

Skrypty w języku VBScript

VBScript jest domyślnie zainstalowany na wszystkich wersjach Windows oraz Windows Server.

Dziennik

Każda integracja stworzona przez SellIntegro posiada w panelu danej integracji zakładkę “Dziennik”:

Docs


W tym miejscu możemy informować klientów przy pomocy trzech poziomów komunikatów:

  1. Poziom “info” - używany do bieżącego informowania klienta o postępie prac danej integracji
  2. Poziom “ostrzeżenie” - używany do informowania klienta o błędzie, który nie zagraża przerwaniu pracy integracji, ale może powodować błąd danych np. pominięcie produktu.
  3. Poziom “błąd” - używany do zakomunikowania poważnego błędu w trakcie działania, np. błąd danych połączeniowych do API

Docs

Jak korzystać z Dziennika za pomocą skryptów
  • Skrypt C#

W języku C# do metod, które można zaimplementować będą przekazywane delegaty w postaci Action , należy im przekazać odpowiednią informację, która zostanie wyświetlona w panelu:

public XElement ZmodyfikujDaneZrodlowe(Action<string> writeError, Action<string> writeWarning,  Action<string> writeInfo, XElement bodyXml)
{
    writeError("Wystąpił nieoczekiwany błąd");
    writeWarning("Nie znaleziono produktu o id 589 w systemie ERP");
    writeInfo("Nastąpi aktualizacja produktów");

    return bodyXml;
}
  • Skrypt w języku VBScript

W języku VBScript wykorzystany zostanie wbudowane w nim wscript.echo, który jest przechwycony przez integrację SellIntegro. Aby panel wiedział jaki poziom informacji ma zostać wyświetlony, należy każdy wpis odpowiednio sformatować, według poniższego schematu:

wscript.echo "#>>user_error:Wystąpił nieoczekiwany błąd"
wscript.echo "#>>user_info:Nastąpi aktualizacja produktów"
wscript.echo "#>>user_warning:Nie znaleziono produktu o id 589 w systemie ERP"

Dla programistów - skrypty w procesach

MSDK w stanach magazynowych

Synchronizacja stanów magazynowych jest jednym z podstawowych procesów w każdej firmie prowadzącej sprzedaż internetową, ze względu na potrzeby takich firm jak np. wczytywanie danych z zewnętrznych plików, posiadanie wielu formatów plików XML, czy skomplikowane algorytmy obliczania stanu dla produktu, zostały wprowadzone 3 miejsca w której można uruchomić skrypty i zmodyfikować odpowiednie dane.

Moment uruchomienia skryptu W przypadku synchronizacji stanów magazynowych, skrypt uruchamiany jest po wykonaniu funkcjonalności wykorzystywanych w scenariuszu konfiguracyjnym (Zastosowany jest wzorzec Łańcucha odpowiedzialności), w związku z tym dane, które skrypt otrzyma mogą zostać już wcześniej przez nas przetworzone, np.:

Zaznaczono w konfiguracji, żeby pomijać Towar, który nie posiada jakieś cechy lub atrybutu, w związku z czym został przez nas odfiltrowany i skrypt nie otrzyma go do dalszego przetworzenia.
Modyfikacja danych po stronie systemu źródłowego

Niezależnie od używanego języka skryptowego podczas uruchomienia zostanie przekazany następujący format XMLa:

<products>
<product>
    <id>1</id>
    <symbol>PESO20</symbol>
    <name>So perfumy 20ml</name>
    <ean>5902812179392</ean>
    <unit>szt.</unit>
    <quantity>1</quantity>
    <reserved>1</reserved>
    <inStock>2</inStock>
    <features>zielony,szklana butelka,zapach trawy</features>
    <warehouses></warehouses>
    <customFields>
    <field key="Rok produkcji">2001</field>
    <field key="W sprzedaży">Tak</field>
    <field key="W hurtowni">1</field>
    <field key="Z zwrotu">4</field>
    <field key="Uszkodzone opakowania">2</field>
    </customFields>
</product>
<product>
    <id>2</id>
    <symbol>PESO30</symbol>
    <name>So perfumy 30ml</name>
    <ean>5902812134391</ean>
    <unit>szt.</unit>
    <quantity>7</quantity>
    <reserved>3</reserved>
    <inStock>10</inStock>
    <features>czerwony,plastikowa butelka,zapach róż</features>
    <warehouses></warehouses>
    <customFields>
    <field key="Rok produkcji">2003</field>
    <field key="W sprzedaży">Nie</field>
    <field key="W hurtowni">0</field>
    <field key="Z zwrotu">0</field>
    <field key="Uszkodzone opakowania">3</field>
 </customFields>
</product>
</products>

Po wywołaniu metody właściwości które ponownie ustawimy na źródle to:

  1. Symbol (string)
  2. Nazwa (string)
  3. Ean (string)
  4. Jednostka miary (string)
  5. Ilość do sprzedaży (decimal)
  6. Ilość zarezerwowana (decimal)
  7. Ilość na stanie (decimal)


  • KOD W JĘZYKU C#

      using System;
      using System.Xml.Linq;
      using System.Linq;
    
      namespace Sellintegro
      {
          public class External
          {
              public XElement ProcessSourceData(Action<string> writeError,
                  Action<string> writeWarning,
                  Action<string> writeInfo, 
                  XElement bodyXml)
              {
                  return bodyXml;
              }
          }
      }
    

Istotne jest aby namespace nazywał się Sellintegro, a publiczna klasa External, w przeciwnym wypadku integracja nie uruchomi się. Ważne jest by metoda nazywała się ProcessSourceData i przyjmowała podane parametry.

Jeżeli metoda zwróci produkty, które nie istniały w momencie przekazania ich do metody, lista ta zostanie uzupełniona. Produkty w momencie podmiany danych są rozpoznawane po wartości id ze zwróconego XMLa


  • KOD W JĘZYKU VBSCRIPT

      Set xmlConfigObj = CreateObject("Microsoft.XMLDOM")
      xmlConfigObj.async = "false"
      xmlConfigObj.LoadXml(xml)
      Set Root = xmlConfigObj.documentElement 
     
      result = Root.xml
    

W przypadku języka VBScript wejściową zmienną jest xml oraz istotne jest przekazanie przetworzonego XMLa do zmiennej result

Jeżeli metoda zwróci produkty, które nie istniały w momencie przekazania ich do metody, lista ta zostanie uzupełniona. Produkty w momencie podmiany danych są rozpoznawane po wartości id ze zwróconego XMLa

Modyfikacja danych po stronie systemu docelowego Niezależnie od używanego języka skryptowego podczas uruchomienia zostanie przekazany następujący format XMLa:

<products>
<product>
    <id>1</id>
    <variant_id />
    <symbol>PESO20</symbol>
    <name>So perfumy 20ml</name>
    <ean>5902812179392</ean>
    <unit>szt.</unit>
    <quantity>1</quantity>
    <reserved>1</reserved>
    <inStock>2</inStock>
    <features>zielony,szklana butelka,zapach trawy</features>
    <warehouses></warehouses>
    <customFields>
    <field key="Rok produkcji">2001</field>
    <field key="W sprzedaży">Tak</field>
    <field key="W hurtowni">1</field>
    <field key="Z zwrotu">4</field>
    <field key="Uszkodzone opakowania">2</field>
    </customFields>
</product>
<product>
    <id>2</id>
    <variant_id />
    <symbol>PESO30</symbol>
    <name>So perfumy 30ml</name>
    <ean>5902812134391</ean>
    <unit>szt.</unit>
    <quantity>7</quantity>
    <reserved>3</reserved>
    <inStock>10</inStock>
    <features>czerwony,plastikowa butelka,zapach róż</features>
    <warehouses></warehouses>
    <customFields>
    <field key="Rok produkcji">2003</field>
    <field key="W sprzedaży">Nie</field>
    <field key="W hurtowni">0</field>
    <field key="Z zwrotu">0</field>
    <field key="Uszkodzone opakowania">3</field>
    </customFields>
</product>
</products>

Po wywołaniu metody właściwości które ponownie ustawimy na źródle to:

  1. Symbol (string)
  2. Nazwa (string)
  3. Ean (string)
  4. Jednostka miary (string)
  5. Ilość na stanie (decimal)


  • KOD W JĘZYKU C#

      using System;
      using System.Xml.Linq;
      using System.Linq;
    
      namespace Sellintegro
      {
          public class External
          {
              public XElement ProcessTargetData(Action<string> writeError,
                  Action<string> writeWarning,
                  Action<string> writeInfo, 
                  XElement bodyXml)
              {
                  return bodyXml;
              }
          }
      }
    

Istotne jest aby namespace nazywał się Sellintegro, a publiczna klasa External, w przeciwnym wypadku integracja nie uruchomi się. Ważne jest by metoda nazywała się ProcessTargetData i przyjmowała podane parametry.

Jeżeli metoda zwróci produkty, które nie istniały w momencie przekazania ich do metody, lista ta zostanie uzupełniona. Produkty w momencie podmiany danych są rozpoznawane po wartości id oraz variant_id z zwróconego XMLa


  • KOD W JĘZYKU VBSCRIPT

      Set xmlConfigObj = CreateObject("Microsoft.XMLDOM")
      xmlConfigObj.async = "false"
      xmlConfigObj.LoadXml(xml)
      Set Root = xmlConfigObj.documentElement 
     
      result = Root.xml  
    

W przypadku języka VBScript wejściową zmienną jest xml oraz istotne jest przekazanie przetworzonego XMLa do zmiennej result

Jeżeli metoda zwróci produkty, które nie istniały w momencie przekazania ich do metody, lista ta zostanie uzupełniona. Produkty w momencie podmiany danych są rozpoznawane po wartości oraz variant_id z zwróconego XMLa

Modyfikacja danych przed aktualizacją w systemie docelowym Niezależnie od używanego języka skryptowego podczas uruchomienia zostanie przekazany następujący format XMLa:

<products>
<product>
    <id>28050165</id>
    <variant_id />
    <symbol>A_GAZ_ZIEMNY</symbol>
    <name>Gaz ziemny</name>
    <ean></ean>
    <unit />
    <new_quantity>105</new_quantity>
    <old_quantity>5</old_quantity>
    <enabled>true</enabled>
</product>
<product>
    <id>28050166</id>
    <variant_id />
    <symbol>A_OLEJ</symbol>
    <name>Olej napędowy</name>
    <ean></ean>
    <unit />
    <new_quantity>105</new_quantity>
    <old_quantity>5</old_quantity>
    <enabled>true</enabled>
</product>
</products>  

Po wywołaniu metody właściwości które ponownie ustawimy na źródle to:

  1. Symbol (string)
  2. Nazwa (string)
  3. Ean (string)
  4. Jednostka miary (string)
  5. Nowa ilość (decimal)
  6. Czy produkt jest widoczny/aktywny (bool)

Na tym etapie podmieniamy wartości na liście nie usuwamy ani nie dodajemy nowych, wyznacznikiem podmiany jest wraz z .


  • KOD W JĘZYKU C#

      using System;
      using System.Xml.Linq;
      using System.Linq;
    
      namespace Sellintegro
      {
          public class External
          {
              public XElement ProcessFinalData(Action<string> writeError,
                  Action<string> writeWarning,
                  Action<string> writeInfo, 
                  XElement bodyXml)
              {
                  return bodyXml;
              }
          }
      }
    

Istotne jest aby namespace nazywał się Sellintegro, a publiczna klasa External, w przeciwnym wypadku integracja nie uruchomi się. Ważne jest by metoda nazywała się ProcessFinalData i przyjmowała podane parametry.


  • KOD W JĘZYKU VBSCRIPT

      Set xmlConfigObj = CreateObject("Microsoft.XMLDOM")
      xmlConfigObj.async = "false"
      xmlConfigObj.LoadXml(xml)
      Set Root = xmlConfigObj.documentElement 
     
      result = Root.xml
    

W przypadku języka VBScript wejściową zmienną jest xml oraz istotne jest przekazanie przetworzonego XMLa do zmiennej result

Przypadki użycia

Poniżej przedstawiamy popularne przypadki zaimplementowane dla stanów magazynowych, które pojawiły się w SellIntegro.

DODAJ 5 SZTUK DO STANU, DLA KAŻDEGO TOWARU Pania Jadzia dolicza sobie zawsze do każdego produktu +5 sztuk, ponieważ mają otwarty “kredyt” u dostawców i na magazynie zawsze jest towar ze zwrotu, przez co musi ustawiać stan na aukcjach ręcznie.


  • Kod w języku C#

      using System;
      using System.Xml.Linq;   using System.Linq;
    
      namespace Sellintegro
      {
          public class External
          {
              public XElement ProcessSourceData(Action<string> writeError,
                  Action<string> writeWarning,
                  Action<string> writeInfo, 
                  XElement bodyXml)
              {
                  foreach (XElement item in bodyXml.Elements("product"))
                  {
                      decimal quantity = 0;
                      decimal.TryParse(item.Element("quantity").Value.Replace(".",","), out quantity);
                      writeInfo("Po przetwarzaniu = " + quantity);
                      item.Element("quantity").Value = (quantity + 5).ToString();
                  }
    
                  return bodyXml;
              }
          }
      }
    


  • Kod w języku VBScript

      Set xmlConfigObj = CreateObject("Microsoft.XMLDOM")
      xmlConfigObj.async = "false"
      xmlConfigObj.LoadXml(xml)
      Set Root = xmlConfigObj.documentElement 
      Set NodeList = Root.getElementsByTagName("product") 
    
      For Each Elem In NodeList 
          Elem.SelectSingleNode("quantity").Text = CDbl(Replace( Elem.SelectSingleNode("quantity").Text ,".",",")) +5
      Next
     
      result = Root.xml
    
ZEWNĘTRZNY PLIK Z PRODUKTAMI

Pan Janusz ma dodatkowy plik z produktami, o który chciałby uzupełnić listę produktów do synchronizacji, bo teraz produkty są sprzedawane jako “wiecznie dostępne”

  • Kod w języku C#

      using System;
      using System.Xml.Linq;
      using System.IO;
      using System.Collections.Generic;
      using System.Linq;
      namespace Sellintegro
      {
          public class External
          {
              public XElement ProcessSourceData(Action<string> writeError,
                  Action<string> writeWarning,
                  Action<string> writeInfo, 
                  XElement bodyXml)
              {
                  var data = "";
    
              using(StreamReader reader = 
                  new StreamReader(@"C:\Users\Admin\Desktop\PlikDoIntegracji.txt"))
              {
                  data = reader.ReadToEnd();
              }
    
              var parsedData = XElement.Parse(data);
    
              foreach (var item in parsedData.Elements("Towar"))
              {
                  bodyXml.Add(new XElement("product",
                  new XElement("id", -1),
                  new XElement("symbol", item.Element("Symbol").Value),
                  new XElement("name", "Name"),
                  new XElement("ean", "Ean"),
                  new XElement("unit", "A unit"),
                  new XElement("quantity", item.Element("Ilosc").Value),
                  new XElement("reserved", item.Element("Ilosc").Value),
                  new XElement("inStock", item.Element("Ilosc").Value),
                  new XElement("features", ""),
                  new XElement("customFields", new Dictionary<string, string>())
              ));
              }
              return bodyXml;
              }
          }
      }
    
  • Kod w języku VBScript

      Set objXMLDoc = CreateObject("Microsoft.XMLDOM") 
      objXMLDoc.async = False 
      objXMLDoc.load("C:\Users\test\Desktop\PlikDoIntegracji.txt")
     
      Set Root = objXMLDoc.documentElement 
      Set NodeList = Root.getElementsByTagName("Towar") 
     
      Set mainXml = CreateObject("Microsoft.XMLDOM") 
      mainXml.async = False 
      mainXml.LoadXml(xml)
     
      For Each Elem In NodeList 
      Set objProductNode = mainXml.createElement("product")
     
      Set objNewId = mainXml.createElement("id")
      Set objNewIdValue = mainXml.createTextNode(Elem.SelectSingleNode("Id").text)
      objNewId.appendChild(objNewIdValue)
      objProductNode.appendChild(objNewId)
     
      Set objNewSymbol = mainXml.createElement("symbol")
      Set objNewSymbolValue = mainXml.createTextNode(Elem.SelectSingleNode("Symbol").text)
      objNewSymbol.appendChild(objNewSymbolValue)
      objProductNode.appendChild(objNewSymbol)
     
      Set objNewName = mainXml.createElement("name")
      Set objNewNameValue = mainXml.createTextNode(Elem.SelectSingleNode("Nazwa").text)
      objNewName.appendChild(objNewNameValue)
      objProductNode.appendChild(objNewName)
     
      Set objNewEan = mainXml.createElement("ean")
      Set objNewEanValue = mainXml.createTextNode(Elem.SelectSingleNode("Kod_Kreskowy").text)
      objNewEan.appendChild(objNewEanValue)
      objProductNode.appendChild(objNewEan)
     
      Set objNewUnit = mainXml.createElement("unit")
      Set objNewUnitValue = mainXml.createTextNode(Elem.SelectSingleNode("Jednostka").text)
      objNewUnit.appendChild(objNewUnitValue)
      objProductNode.appendChild(objNewUnit)
     
      Set objNewReserverd = mainXml.createElement("reserved")
      Set objNewReserverdValue = mainXml.createTextNode(Elem.SelectSingleNode("Zarezerwowane").text)
      objNewReserverd.appendChild(objNewReserverdValue)
      objProductNode.appendChild(objNewReserverd)
     
      Set objNewInStock = mainXml.createElement("inStock")
      Set objNewInStockValue = mainXml.createTextNode(Elem.SelectSingleNode("Na_Stanie").text)
      objNewInStock.appendChild(objNewInStockValue)
      objProductNode.appendChild(objNewInStock)
     
      Set objNewQuantity = mainXml.createElement("quantity")
      Set objNewQuantityValue = mainXml.createTextNode(Elem.SelectSingleNode("Ilosc").text)
      objNewQuantity.appendChild(objNewQuantityValue)
      objProductNode.appendChild(objNewQuantity)
     
      Set objNewFeatures = mainXml.createElement("features")
      objProductNode.appendChild(objNewFeatures)
     
      Set objNewCustomFields = mainXml.createElement("customFields")
      objProductNode.appendChild(objNewCustomFields)
     
      Set objCurrNode = mainXml.documentElement
      objCurrNode.appendChild(objProductNode)
     
      Next
     
      result = mainXml.documentElement.xml
    
ZEWNĘTRZNY PLIK Z STANAMI

Pan Arek ma dodatkowy plik z stanami, z którym chciałby sumować listę stanów do synchronizacji.

  • Kod w języku C#

      using System;
      using System.Xml.Linq;
      using System.IO;
      using System.Collections.Generic;
      using System.Linq;
      using System.Globalization;
    
      namespace Sellintegro
      {
          public class External
          {
              public XElement ProcessSourceData(Action<string> writeError,
                  Action<string> writeWarning,
                  Action<string> writeInfo, 
                  XElement bodyXml)
              {
                  var data = "";
    
              using(StreamReader reader = new
              StreamReader(@"C:\Users\Admin\Desktop\PlikDoIntegracjiArek.txt"))
              {
                  data = reader.ReadToEnd();
              }
    
              var parsedData = XElement.Parse(data);
    
              foreach (var item in parsedData.Elements("Towar"))
              {
              var originalProduct =  bodyXml.Elements("product")
                  .Where(x => x.Element("symbol")
                      .Value == item.Element("Symbol").Value).FirstOrDefault();
    
                  if (originalProduct != null)
                  {
                      decimal originalQuantity = 0;
                      decimal additionalQuantity = 0;
                      decimal.TryParse(originalProduct.Element("quantity").Value,
                      NumberStyles.Any, 
                      CultureInfo.InvariantCulture, 
                      out originalQuantity);
                      decimal.TryParse(item.Element("Ilosc").Value, 
                      NumberStyles.Any, 
                      CultureInfo.InvariantCulture, 
                      out additionalQuantity);
                      originalProduct.Element("quantity")
                      .Value = (originalQuantity + additionalQuantity).ToString();
                      originalProduct.Element("reserved")
                      .Value = (originalQuantity + additionalQuantity).ToString();
                      originalProduct.Element("inStock")
                      .Value = (originalQuantity + additionalQuantity).ToString();
                  }
              }
              return bodyXml;
              }
          }
      }
    
  • Kod w języku VBScript

      Set objXMLDoc = CreateObject("Microsoft.XMLDOM") 
      objXMLDoc.async = False 
      objXMLDoc.load("C:\Users\test\Desktop\PlikDoIntegracjiSumowanie.txt")
     
      Set Root = objXMLDoc.documentElement 
      Set NodeList = Root.getElementsByTagName("Towar") 
     
      Set mainXml = CreateObject("Microsoft.XMLDOM") 
      mainXml.async = False 
      mainXml.LoadXml(xml)
      mainXml.setProperty "SelectionLanguage", "XPath"
     
      Set mainXmlRoot = mainXml.documentElement
      Set MainNodeList = mainXmlRoot.getElementsByTagName("product") 
     
      For Each Elem In NodeList 
     
      Set test = mainXml.selectSingleNode("products/product[symbol='"& Elem.SelectSingleNode("Symbol").text & "']")
     
      If Not test Is Nothing Then
          test.SelectSingleNode("quantity").Text = CDbl(Replace( Elem.SelectSingleNode("Ilosc").Text ,".",",")) + CDbl(Replace( test.SelectSingleNode("quantity").Text ,".",","))
      End if   Next
     
      result = mainXml.documentElement.xml
    
ZEWNĘTRZNY PLIK Z STANAMI

Pan Arek ma dodatkowy plik z stanami, z którego chciałby sumować listę dostępnych sztuk towarów do synchronizacji.

  • Kod w języku C#

      using System;
      using System.Xml.Linq;
      using System.IO;
      using System.Collections.Generic;
      using System.Linq;
      using System.Globalization;
    
      namespace Sellintegro
      {
          public class External
          {
              public XElement ProcessSourceData(Action<string> writeError,
                  Action<string> writeWarning,
                  Action<string> writeInfo, 
                  XElement bodyXml)
              {
                  var data = "";
    
              using(StreamReader reader = new
                  StreamReader(@"C:\Users\Admin\Desktop\PlikDoIntegracjiArek.txt"))
              {
                  data = reader.ReadToEnd();
              }
    
              var parsedData = XElement.Parse(data);
    
              foreach (var item in parsedData.Elements("Towar"))
              {
              var originalProduct =  bodyXml.Elements("product")
                  .Where(x => x.Element("symbol")
                      .Value == item.Element("Symbol").Value).FirstOrDefault();
    
                  if (originalProduct != null)
                  {
                      decimal originalQuantity = 0;
                      decimal additionalQuantity = 0;
                      decimal.TryParse(originalProduct.Element("quantity").Value,
                      NumberStyles.Any, 
                      CultureInfo.InvariantCulture, 
                      out originalQuantity);
                      decimal.TryParse(item.Element("Ilosc").Value, 
                      NumberStyles.Any, 
                      CultureInfo.InvariantCulture, 
                      out additionalQuantity);
                      originalProduct.Element("quantity")
                      .Value = (originalQuantity + additionalQuantity).ToString();
                      originalProduct.Element("reserved")
                      .Value = (originalQuantity + additionalQuantity).ToString();
                      originalProduct.Element("inStock")
                      .Value = (originalQuantity + additionalQuantity).ToString();
                  }
              }
              return bodyXml;
              }
          }
      }
    
  • Kod w języku VBScript

    Set objXMLDoc = CreateObject(“Microsoft.XMLDOM”) objXMLDoc.async = False objXMLDoc.load(“C:\Users\test\Desktop\PlikDoIntegracjiSumowanie.txt”)

    Set Root = objXMLDoc.documentElement Set NodeList = Root.getElementsByTagName(“Towar”)

    Set mainXml = CreateObject(“Microsoft.XMLDOM”) mainXml.async = False mainXml.LoadXml(xml) mainXml.setProperty “SelectionLanguage”, “XPath”

    Set mainXmlRoot = mainXml.documentElement Set MainNodeList = mainXmlRoot.getElementsByTagName(“product”)

    For Each Elem In NodeList

      Set test = mainXml.selectSingleNode("products/product[symbol='"& Elem.SelectSingleNode("Symbol").text & "']")
     
      If Not test Is Nothing Then
          test.SelectSingleNode("quantity").Text = CDbl(Replace( Elem.SelectSingleNode("Ilosc").Text ,".",",")) + CDbl(Replace( test.SelectSingleNode("quantity").Text ,".",","))
      End if   Next
    

    result = mainXml.documentElement.xml

BŁĘDNE SYMBOLE PRODUKTÓW

Pan Mirek zatrudniał stażystę, który źle uzupełnił kody produktów i teraz trzeba usuwać z nich końcówki takie jak .amz lub .amf, chciałby aby integracja ignorowała pewne ciągi znaków

  • Kod w języku C#

      using System;
      using System.Xml.Linq;
      using System.IO;
      using System.Collections.Generic;
      using System.Linq;
      using System.Globalization;
    
      namespace Sellintegro
      {
          public class External
          {
              public XElement ProcessSourceData(Action<string> writeError,
                  Action<string> writeWarning,
                  ction<string> writeInfo, 
                  XElement bodyXml)
              {
                  foreach (XElement item in bodyXml.Elements("product"))
                  {
                      item.Element("symbol")
                          .Value = item.Element("symbol")
                              .Value.Replace(".AMZ", "").Replace(".AMF", "");
                  }
    
                  return bodyXml;
                  }
              }   
          }
    
  • Kod w języku VBScript

      Set xmlConfigObj = CreateObject("Microsoft.XMLDOM")
      xmlConfigObj.async = "false"
      xmlConfigObj.LoadXml(xml)
      Set Root = xmlConfigObj.documentElement 
      Set NodeList = Root.getElementsByTagName("product") 
      For Each Elem In NodeList 
          Elem.SelectSingleNode("symbol").Text = Replace(Elem.SelectSingleNode("symbol").Text ,".AMZ","")
          Elem.SelectSingleNode("symbol").Text = Replace(Elem.SelectSingleNode("symbol").Text ,".AMF","")
      Next
      result = Root.xml
    

PRZELICZANIE OPAKOWAŃ

Pan Łukasz kupuje w kartonach a sprzedaje w sztukach, stąd w kodach produktów ma wpisane “[100]”, chciałby liczby pomiędzy nawiasami wymnożyć przez aktualny stan

  • Kod w języku C#

      using System;
      using System.Xml.Linq;
      using System.IO;
      using System.Collections.Generic;
      using System.Linq;
      using System.Globalization;
    
      namespace Sellintegro
      {
          public class External
          {
              public XElement ProcessSourceData(Action<string> writeError,
                  Action<string> writeWarning,
                  Action<string> writeInfo, 
                  XElement bodyXml)
              {
                  foreach (XElement item in bodyXml.Elements("product"))
                  {
                      item.Element("symbol")
                          .Value = item.Element("symbol")
                              .Value.Replace(".amz", "").Replace(".amf", "");
    
                  try
                  {
                      decimal originalQuantity = 0;
                      decimal multiplier = 0;
    
                      var output = item.Element("symbol")
                          .Value.Split(new char[] { '[', ']' })[1];
    
                      decimal.TryParse(item.Element("quantity").Value,
                          NumberStyles.Any, 
                          CultureInfo.InvariantCulture, 
                          out originalQuantity);
    
                      decimal.TryParse(output, 
                          NumberStyles.Any, 
                          CultureInfo.InvariantCulture, 
                          out multiplier);
    
                      item.Element("quantity")
                          .Value = (originalQuantity * multiplier).ToString();
                    
                      item.Element("reserved")
                          .Value = (originalQuantity * multiplier).ToString();
    
                      item.Element("inStock")
                          .Value = (originalQuantity * multiplier).ToString();
                  }
                  catch (Exception)
                  {
                      var symbol = item.Element("symbol").Value;
                      writeError(symbol + "Nie posiada mnożnika");
                  }
              }
    
              return bodyXml;
              }
          }
      }
    
  • Kod w języku VBScript

      Set xmlConfigObj = CreateObject("Microsoft.XMLDOM")
      xmlConfigObj.async = "false"
      xmlConfigObj.LoadXml(xml)
      Set Root = xmlConfigObj.documentElement 
      Set NodeList = Root.getElementsByTagName("product") 
      Set oRegExp = New RegExp
      oRegExp.Pattern = "\[(.*?)\]"
      For Each Elem In NodeList 
     
      Dim multiplier
      Set Matches = oRegExp.Execute(Elem.SelectSingleNode("symbol").Text)
      If Matches.Count > 0 Then 
          mnoznik = Matches(0).SubMatches(0)
          Elem.SelectSingleNode("quantity").Text = CDbl(Replace( Elem.SelectSingleNode("quantity").Text ,".",",")) * cint(multiplier)
      End If   Next   result = Root.xml
    

Zapoznałeś się z dokumentacją, ale wciąż masz kilka pytań?

Skontaktuj się z działem supportu SellIntegro