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; |
UWAGA
Minimalne wymagania są zależne od wykorzystywanych wtyczek oraz od ilości przetwarzanych danych i mogą być niewystarczające w przypadku korzystania z wielu podmiotów systemu ERP oraz kilku instancji Endpointa Sellintegro.
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.
Użycie jest bardzo proste
W Panelu klienta:
- Wybierz integrację, w której chcesz wprowadzić modyfikację:
- Przejdź do zakładki “Skrypty” (Zapoznaj się z informacjami i zaakceptuj)
- Pojawi się edytor skryptów:
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:
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
- Synchronizacja stanów magazynowych - dostępne w wersji VER_STD_v100.0 i wyższej
- Synchronizacja cen - w trakcie implementacji
- Generowanie dokumentów sprzedaży - zaplanowane
- Przesyłanie zamówień do ERP - zaplanowane
- Przesyłanie produktów - zaplanowane
- 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.
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”:
W tym miejscu możemy informować klientów przy pomocy trzech poziomów komunikatów:
- Poziom “info” - używany do bieżącego informowania klienta o postępie prac danej integracji
- 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.
- Poziom “błąd” - używany do zakomunikowania poważnego błędu w trakcie działania, np. błąd danych połączeniowych do API
Jak korzystać z Dziennika za pomocą skryptów
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;
}
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:
- Symbol (string)
- Nazwa (string)
- Ean (string)
- Jednostka miary (string)
- Ilość do sprzedaży (decimal)
- Ilość zarezerwowana (decimal)
- 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:
- Symbol (string)
- Nazwa (string)
- Ean (string)
- Jednostka miary (string)
- 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:
- Symbol (string)
- Nazwa (string)
- Ean (string)
- Jednostka miary (string)
- Nowa ilość (decimal)
- 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