Metody – katalog, marketing

GetCategories

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
return_valueniebool0Czy zwracać wartości atrybutów
timestampniestringróżnicowanie względem czasu modyfikacji

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$response = $client->GetAttributes($authenticate);
header('Content-Type: application/xml');
echo $response;

Dane zwracane + komentarze: 

<attributes>
   <attribute>
      <id>1</id> <!-- id atrybutu w AtomStore -->
      <type>3</type> <!-- typ atrybutu (1 = cecha, 2 = cecha grupowa, 3 = warianty) -->
      <visible>0</visible> <!-- wyświetlanie atrybutu od strony klienta (1 = tak, 0 = nie) -->
      <code>dimensione</code> <!-- kod atrybutu -->
      <modified>2022-02-28 10:39:50</modified>
      <name>Marka</name> <!-- nazwa atrybutu w języku domyślnym -->
      <name lang="eng">Size</name> <!-- nazwa atrybutu w języku innym niż domyślny (lang = kod języka) -->
      <values>
         <value>
            <v lang="pol"><![CDATA[czerwony]]></v>
            <v lang="eng"><![CDATA[red]]></v>
         </value>
         <value>
            <v lang="pol"><![CDATA[zielony]]></v>
            <v lang="eng"><![CDATA[green]]></v>
         </value>
   </attribute>
</attributes>

Uwagi:
– Ze względów wydajnościowych wartości atrybutów zwracane są tylko w przypadku wskazania konkretnego atrybutu (id lub code).

GetAttributes

Pobranie drzewa kategorii wraz z powiązaniami kategoria – rodzic.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
id_as_external_idnieint0przekazanie wartości 1 pozwala wymusić, aby identyfikatory kategorii w sklepie były zwrócone jako identyfikatory zewnętrzne, co ma zastosowanie w integracji między różnymi sklepami operującymi na platformie AtomStore
store_idnieintnullid sklepu (w ramach modułu Multistore), z którego mają zostać pobrane kategorie

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$response = $client->GetCategories($authenticate);
header('Content-Type: application/xml');
echo $response;

Dane zwracane + komentarze: 

<categories>
    <category>
        <atom_id>5</atom_id> <!-- id kategorii w AtomStore -->
        <atom_pid></atom_pid> <!-- id kategorii - rodzica w AtomStore (dla kategorii głównych jest to pusty ciąg znaków) -->
        <id>kod_p_2</id> <!-- zewn. identyfikator kategorii (jeśli został nadany) -->
        <pid></pid> <!-- zewn. identyfikator kategorii - rodzica (obecny gdy określono <id>) -->               
        <hidden>0</hidden> <!-- kategoria ukryta (1 = tak, 0 = nie) -->
        <name> <!-- nazwa kategorii -->
            <![CDATA[Literatura]]>
        </name>
        <description> <!-- opis kategorii -->
            <![CDATA[Literatura, książki, czasopisma]]>
        </description>
        <image_url>...</image_url>  <!-- link do zdjęcia kategorii (jeśli zdjęcie istnieje) -->
        <seo_alias> <!-- SEO alias w języku domyślnym -->
            <![CDATA[ literatura ]]>
        </seo_alias>
        <friendly_link> <!-- pełny przyjazny link -->
            <![CDATA[ /literatura ]]>
        </friendly_link>
        <seo_name> <!-- alternatywna nazwa dla znacznika h1 itd. -->
            <![CDATA[Najlepsza literatura]]>
        </seo_name>
        <seo_title> <!-- title strony kategorii (metatag dla SEO) -->
            <![CDATA[Najlepsza literatura]]>
        </seo_title>
        <seo_keywords> <!-- słowa kluczowe strony kategorii (dla SEO) -->
            <![CDATA[literatura,ksiazki]]>
        </seo_keywords>
        <seo_description> <!-- opis strony kategorii (metatag dla SEO) -->
            <![CDATA[Najlepsza literatura w najlepszych cenach]]>
        </seo_description>
    </category>
    <category>
        <atom_id>66</atom_id>
        <atom_pid>5</atom_pid>
        <id>kod_p_2_1</id>
        <pid>kod_p_2</pid>             
        <hidden>0</hidden>
        <name>
            <![CDATA[Reportaż]]>
        </name>
        <!-- (...) -->
    </category>
</categories>

Uwagi:
– metoda nie zwraca nazw / metatagów w językach innych niż domyślny,
– jeśli przekazano parametr id_as_external_id = 1, pola <atom_id> i <atom_pid> nie są zwracane, a id kategorii / rodzica w AtomStore wstawiane są do pól <id> i <pid>.

DeleteRedundantImages

Usuwa niewymienione zdjęcia z galerii produktów.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
messagetakmessagestruktura zawierająca pole 'xml’, które powinno zawierać ciąg znaków w formacie XML; opis formatu poniżej


Format XML + komentarze:

<products>
    <product>
        <code>DSA-1432</code> <!-- kod produktu -->
        <delete_empty_filename>1</delete_empty_filename> <!-- czy usuwać również zdjęcia, które mają pustą nazwę pliku (1 = tak, 0 = nie) -->
        <correct_images> <!-- wymagane przekazanie pustego elementu gdy nie ma zdjęć -->
            <image>
                <image_name>
                    <![CDATA[ 25334213321.jpg ]]> <!-- nazwa pliku, który nie powinien zostać usunięty -->
                </image_name>
            </image>
            <image>
                <image_name>
                    <![CDATA[ 25392031321.jpg ]]>
                </image_name>
            </image>
        </correct_images>
    </product>     
</products>

Przykładowe wywołanie (PHP):

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$xml = '<products>';
$xml .= '<product>';
$xml .= '<code>DSA-1432</code>';
$xml .= '<delete_empty_filename>1</delete_empty_filename>';
$xml .= '<correct_images>';
$xml .= '<image>';
$xml .= '<image_name><![CDATA[ 25334213321.jpg ]]></image_name>';
$xml .= '</image>';
$xml .= '<image>';
$xml .= '<image_name><![CDATA[ 25392031321.jpg ]]></image_name>';
$xml .= '</image>';
$xml .= '</correct_images>';
$xml .= '</product>';
$xml .= '</products>';
$message = array('xml' => $xml);
$response = $client->DeleteRedundantImages($authenticate, $message);
echo $response;

Dane zwracane: 

OK 

GetLockedQuantities

Pobranie stanów magazynowych zarezerwowanych w zamówieniach. Rezerwacje pomniejszają stan dostępny w sklepie.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$response = $client->GetLockedQuantities($authenticate);
header('Content-Type: application/xml');
echo $response;

Dane zwracane + komentarze: 

<products>
    <product>
        <product_id>1234</product_id> <!-- id produktu w AtomStore -->
        <combination_id>0</combination_id> <!-- id wariantu -->
        <code>HHG-0302</code> <!-- kod produktu lub wariantu -->
        <locked_quantity>4</locked_quantity> <!-- łączny stan zarezerwowany -->
        <orders> <!-- wyszczególnienie rezerwacji w zamówieniach -->
            <o id="445" qty="3"></o> <!-- id zamówienia oraz ilość w rezerwacji -->
            <o id="449" qty="1"></o>
        </orders>
    </product>       
</products>

GetOpinions

Pobranie opinii produktów

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
timestamptakdatetimefalsedata od kiedy pobierac opinie

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$response = $client->GetOpinions($authenticate, '2020-02-02 02:02:02');
header('Content-Type: application/xml');
echo $response;

Dane zwracane + komentarze:

<opinions>
        <opinion>
            <code>aa8f3ifhf</code> <!-- kod produktu -->
            <username>Maciej A.</username> <!-- autor  -->
            <email>maciej.a@atomstore.pl</email> <!-- adres email autora -->
            <content> <!-- treść opinii -->
                <![CDATA[ bardzo udany produkt ]]> <!-- zalecany komentarz CDATA -->
            </content>
            <note>5</note> <!-- ocena od 1 do 5 -->
            <status>1</status> <!-- status(aktywność) -->
            <benefits><![CDATA[ benefity ]]></benefits> <!-- benefity -->
            <defects><![CDATA[ urwana rączka ]]></defects> <!-- usterki -->
            <locale>pol</locale> <!-- jezyk -->
            <modified>2021-09-28 08:50:33</modified> <!-- data modyfikacji -->
        </opinion>
        <opinion>
            <code>12333ifhf</code> <!-- kod produktu -->
            <username>Maciej A.</username> <!-- autor  -->
            <email>maciej.a@atomstore.pl</email> <!-- adres email autora -->
            <content> <!-- treść opinii -->
                <![CDATA[ bardzo udany produkt 2 ]]> <!-- zalecany komentarz CDATA -->
            </content>
            <note>5</note> <!-- ocena od 1 do 5 -->
            <status>1</status> <!-- status -->
            <benefits><![CDATA[ benefity 2 ]]></benefits> <!-- benefity -->
            <defects><![CDATA[ urwana rączka2 ]]></defects> <!-- usterki -->
            <locale>pol</locale> <!-- jezyk -->
            <modified>2021-09-28 08:50:33</modified> <!-- data modyfikacji -->
        </opinion>
</opinions>

GetPrices

Pobranie cen produktów.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
return_specialsniebooleanfalseczy dla produktów/wariantów w promocji ma być zwrócona cena podstawowa (false) czy promocyjna (true)
offsetnieint0pierwszy wymiar stronicowania – przesunięcie
limitnieint0drugi wymiar stronicowania – ilość produktów, dla których zostanie zwrócona cena; dla wartości 0 zwrócone zostaną wszystkie ceny, bez stronicowania
store_idnieint0ID sklepu dla którego pobrać ceny

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$response = $client->GetPrices($authenticate, true, 0, 100);
header('Content-Type: application/xml');
echo $response;

Dane zwracane + komentarze:

<prices>
    <price>
        <external_id><![CDATA[10384]]></external_id> <!-- zawiera id produktu w AtomStore lub "c_" + id wariantu -->
        <code><![CDATA[GGH-0302]]></code> <!-- kod produktu lub wariantu -->
        <price_netto>29.4168</price_netto> <!-- cena netto, precyzja do 4 miejsc po przecinku -->
        <vat>23</vat> <!-- stawka VAT -->
        <price_brutto>36.18</price_brutto> <!-- cena brutto, precyzja do 2 miejsc po przecinku -->
        <special>0</special> <!-- 0 dla ceny podstawowej, 1 dla ceny promocyjnej -->
    </price>
    <price>
        <external_id><![CDATA[11579]]></external_id>
        <code><![CDATA[M51611162-TAN]]></code>
        <price_netto>42.8522</price_netto>
        <vat>23</vat>
        <price_brutto>52.71</price_brutto>
        <special>1</special>
        <price_promo>42.8522</price_promo>
        <sale_name quantity="0">Gorąca jesień</sale_name> <!-- Informacja o nazwie wysyłki + ilość docelowa do jakiej obowiązuje wyprzedaż -->
        <date_from>2015-09-01</date_from> <!-- data rozpoczęcia wyprzedaży -->
        <date_to>2015-09-15</date_to> <!-- data zakończenia wyprzedaży -->
        <stores>1,3</stores> <!-- ID sklepów (multistore), oddzielone przecinkiem, dla których obowiązuje promocja -->
    </price>
</prices>

Uwagi:
– metoda nie pozwala na pobranie cen z dodatkowych cenników zdefiniowanych w sklepie,
– jeden produkt z wariantami może być reprezentowany w zwracanych danych jako wiele pozycji <price>, każdy wariant z osobna, stronicowanie dotyczy natomiast produktów,
– jeśli przekazano parametr 'limit’ > 0, dane zwracane są w kolejności zgodnej z identyfikatorami cen w bazie danych AtomStore, rosnąco; jeśli nie przekazano parametru 'limit’ (lub przekazano 0), kolejność jest nieustalona.

GetProducers

Pobranie słownika producentów.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
offsetnieint0pierwszy wymiar stronicowania – przesunięcie
limitnieint10000drugi wymiar stronicowania – ilość zwracanych producentów

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$response = $client->GetProducers($authenticate);
header('Content-Type: application/xml');
echo $response;

Dane zwracane + komentarze: 

<producers>
    <producer>
        <id>1</id> <!-- id producenta w AtomStore -->
        <name><![CDATA[ GUARDER ]]></name>
        <desc><![CDATA[ przykładowy opis ]]></desc> <!-- opis, może zawierać znaczniki HTML -->
    </producer>
    <producer>
        <id>2</id>
        <name><![CDATA[ PJ ]]></name>
        <desc><![CDATA[ ]]></desc>
        <logo>...</logo> <!-- znacznik obecny gdy wprowadzono logo producenta, tu zakodowane w base64 -->
    </producer>
</producers>

Uwagi:
– dane zwracane są w kolejności zgodnej z identyfikatorami producentów w bazie danych AtomStore, rosnąco.

GetProductByCode

Pobranie identyfikatora lub pełnych danych produktu o zadanym kodzie.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
codetakstringkod szukanego produktu
only_idnieint11 = zwrócony zostanie jedynie identyfikator towaru w AtomStore; 0 = zwrócone zostaną pełne dane produktu w formacie XML zgodnym z metodą GetProducts
check_combinationsnieint01 = dodatkowa próba odnalezienia produktu po kodzie konkretnego wariantu (np. rozmiaru); 0 = produkt odszukiwany tylko i wyłącznie wg kodu produktu

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$response = $client->GetProductByCode($authenticate, 'kkk111');
echo $response;

Dane zwracane: 

12001

Uwagi:
– w przypadku towaru będącego w koszu o zadanym kodzie zwrócony zostanie komunikat IN_TRASH,
– w przypadku braku towaru o zadanym kodzie zwrócony zostanie komunikat NOT_FOUND,
– pełne dane produktu zwracane są analogicznie do wywołania metody GetProducts z parametrami all_images=1 (komplet zdjęć), combinations=1 (dane wariantów), get_attributes=1 (wszystkie atrybuty).

GetProductQuantities

Pobranie stanów w magazynie własnym i u dostawców, a także informacji o bieżącym statusie dostępności produktów.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
reservationsniebooleanfalseczy zwracane stany mają być pomniejszone o ilości zarezerwowane w niezrealizowanych zamówieniach (niezalecane)
modifiedniestring1970-01-01data ostatniej zmiany – parametr pozwalający na różnicowe pobieranie danych;
zwracane są tylko stany produktów zmodyfikowanych z tą datą lub później;
możliwe przekazanie daty i godziny, np. 2015-05-20 20:47:59
include_suppliersniebooleanfalseczy zwracane stany mają obejmować tylko magazyn własny (false), czy również ilości dostępne u dostawców (true)
separate_suppliersniestring identyfikatory dostawców (oddzielone przecinkiem) – stany u wskazanych w ten sposób dostawców zostaną zwrócone jako osobne pozycje z oznaczeniem dostawcy; parametru tego należy używać jednocześnie z include_suppliers=false, aby ilości dostępne u dostawców nie były zwracane jednocześnie na dwa sposoby
store_idniestring id sklepu (w ramach modułu Multistore), z którego mają zostać pobrane stany magazynowe (wiele sklepów – id oddzielone przecinkami); domyśnie zwracane są wszystkie kartoteki
codeniestring kod produktu lub wariantu dla którego mają zostać pobrane stany magazynowe
return_externalsniebooleanfalseZwracać mapowania produktów / wariantów

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$response = $client->GetProductQuantities($authenticate, false, '2015-05-20 20:47:59');
header('Content-Type: application/xml');
echo $response;

Dane zwracane + komentarze: 

<products>
    <product>
        <code>M51616151-BK</code> <!-- kod produktu -->
        <own>1</own> <!-- oznaczenie magazynu własnego -->
        <quantity>0</quantity> <!-- stan magazynowy -->
        <purchase_price>19.50</purchase_price> <!-- cena zakupu netto -->
        <auto_status>1</auto_status> <!-- wskazanie, iż produkt ma automatyczny status dostępności -->
    </product>
    <product>
        <code>M51616151-BK</code>
        <inventory_supplier>Dostawca X</inventory_supplier> <!-- nazwa dostawcy-->
        <quantity>432</quantity> <!-- stan u dostawcy -->
        <purchase_price>19.50</purchase_price> <!-- cena zakupu netto -->
    </product>
    <product>
        <code>M51616151-TAN</code>
        <own>1</own>
        <quantity>22</quantity>
        <purchase_price>19.50</purchase_price> <!-- cena zakupu netto -->
        <status_name>
            <![CDATA[ Dostępny wkrótce ]]>
        </status_name> <!-- nazwa ręcznego statusu dostępności, jeśli został przypisany do produktu -->
    </product>
</products>

Uwagi:
– warianty produktów stanowią osobne pozycje <product> w XML, z własnym kodem i własnym stanem magazynowym,
– nie są zwracane produkty będące zestawami, a także produkty i warianty z pustym kodem,
– kolejność zwracanych danych jest nieustalona.

GetProducts

Pobranie pełnych danych towarowych.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
product_idniestring id produktu w AtomStore LUB zakres id w formie 'x-y’
all_imagesnieint00 – zwrócona zostanie informacja tylko o głównym zdjęciu produktu;
1 – zwrócone zostaną informacje o wszystkich zdjęciach przypisanych do produktu
image_sizenieimagesizenullstruktura składająca się z pól 'width’ i 'height’, pozwala narzucić maksymalne rozmiary dla zwracanych zdjęć produktu – pobierane dane będą zawierać odnośniki do gotowych miniatur w zadanym rozmiarze
combinationsnieint00 – dane zwracane bez informacji o wariantach produktu;
1 – dane zwracane wraz z informacjami o wariantach produktu
get_attributesniestring00 – dane z wyłączeniem atrybutów opisujących poszczególne towary;
1 – dane wraz z atrybutami;
1[x,y] – dane wraz z atrybutami o identyfikatorach x i y (id widoczne w panelu sklepu i zwracane z metody GetAttributes)
modifiedniestring1970-01-01data ostatniej zmiany – parametr pozwalający na różnicowe pobieranie danych;
zwracane są tylko produkty zmodyfikowane z tą datą lub później;
możliwe przekazanie daty i godziny, np. 2015-05-20 20:47:59
only_new_productsnieint00 – zwrócone zostaną produkty dodane lub zmodyfikowane z datą z parametru 'modified’ lub później;
1 – zwrócone zostaną tylko produkty nowe względem daty z parametru 'modified’
limitnieint0ilość pobieranych kartotek;
0 – brak limitu
price_list_idnieint0id cennika, z którego zostaną odczytane ceny;
0 – cennik domyślny
verifiedniestring 0 – tylko kartoteki niezweryfikowane (oznaczenie administracyjne, bez wpływu na dostępność i wyświetlanie towarów); 1 – tylko kartoteki zweryfikowane; ” – brak filtrowania po fladze weryfikacji
phraseniestring fraza, po której zostaną wyszukane produkty
store_idniestring id sklepu (w ramach modułu Multistore), z którego mają zostać pobrane towary (wiele sklepów – id oddzielone przecinkami);
produkty niepasujące zostaną zwrócone jako pozycje usunięte, z ograniczonym zestawem danych;
” – wszystkie kartoteki
product_filter_idniestring id dynamicznej listy produktu (wiele – rozdzielone przecinkiem)

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$imagesize = array('width' => 250, 'height' => 150);
$response = $client->GetProducts($authenticate, 15249, 1, $imagesize, 1, 1);
header('Content-Type: application/xml');
echo $response;

Dane zwracane + komentarze: 

<products>
    <product>
        <id>15249</id> <!-- id produktu w AtomStore -->
        <created>2015-05-20 21:59:33</created> <!-- data dodania -->
        <modified>2015-05-20 22:10:02</modified> <!-- data ostatniej modyfikacji -->
        <code>kod-zestawu-X</code> <!-- kod produktu -->
        <product_name> <!-- nazwa -->
            <![CDATA[[Zestaw] Kulki Guarder + Lufa precyzyjna o długości 510 mm]]>
        </product_name>
        <product_name lang="eng"> <!-- nazwa -->
            <![CDATA[[Zestaw] Kulki Guarder + precise gun of length 510 mm]]>
        </product_name>
        <product_description> <!-- opis, może zawierać znaczniki HTML -->
            <![CDATA[Kulki 0,30-1000 [Guarder]<br /><br />Firma GUARDER wyszła na przeciw oczekiwaniom graczy...]]>
        </product_description>
        <product_description lang="eng"> <!-- description, may have html tags -->
            <![CDATA[Kulki 0,30-1000 [Guarder]<br /><br />Firma GUARDER wyszła na przeciw oczekiwaniom graczy...]]>
        </product_description>
        <producer_name> <!-- nazwa producenta -->
            <![CDATA[ Guarder ]]>
        </producer_name>
        <category aid="33"> <!-- kategoria jako ścieżka, poziomy oddzielone ukośnikiem; aid = identyfikator kategorii w sklepie -->
            <![CDATA[ WYPOSAŻENIE TAKTYCZNE/AKCESORIA ]]>
        </category>
        <category aid="22"> <!-- dodatkowa kategoria (może być ich wiele) -->
            <![CDATA[ MAGAZYNKI ]]>
        </category>
        <attributes> <!-- atrybuty - ich nazwy i wartości -->
            <attribute>
                <name><![CDATA[ Rodzaj_akumulatora ]]></name>
                <value><![CDATA[ litowo-jonowy ]]></value>
            </attribute>
            <attribute>
                <name><![CDATA[ Okres_gwarancji ]]></name>
                <value><![CDATA[ 24 m-ce ]]></value>
            </attribute>
            <attribute>
                <name><![CDATA[ Materiał ]]></name>
                <value><![CDATA[ żelazo ]]></value>
            </attribute>
            <attribute>
                <name><![CDATA[ Kolor ]]></name>
                <value><![CDATA[ czarny ]]></value>
            </attribute>
        </attributes>
        <price_netto>52.1138</price_netto> <!-- cena netto -->
        <price_promo>32.0000</price_promo> <!-- cena promocyjna netto; znacznik obecny, jeśli promocja jest zdefiniowana -->
        <purchase_price>0.0000</purchase_price> <!-- cena zakupu netto; znacznik obecny, jeśli da się tę cenę ustalić -->
        <vat_rate>23</vat_rate> <!-- stawka podatkowa -->
        <quantity>0</quantity> <!-- stan w magazynie własnym -->
        <status_id>1</status_id> <!-- Id statusu dostępności -->
        <status_name><![CDATA[ Dostepny ]]></status_name> <!-- Nazwa statusu dostępności -->
        <new>1</new> <!-- czy produkt jest oznaczony jako nowość (1 = tak, 0 = nie) -->
        <recommended>0</recommended> <!-- czy produkt jest oznaczony jako wyróżniony -->
        <bestseller>0</bestseller> <!-- czy produkt jest na liście bestsellerów -->
        <weight>0.6000</weight> <!-- waga (ciężar) produktu w kg -->
        <views>0</views> <!-- ilość odsłon karty produktu -->
        <purchases>0.0000</purchases> <!-- ilość zakupiona, w dowolnym okresie -->
        <active>1</active> <!-- czy produkt jest aktywny -->
        <only_gratis>0</only_gratis> <!-- czy produkt jest dostępny tylko jako gratis -->
        <only_suppliers>0</only_suppliers> <!-- czy dostępność u dostawców jest priorytetowa względem magazynu własnego  -->
        <login_request>0</login_request> <!-- czy produkt jest dostępny tylko dla zalogowanych -->
        <suggested_price>0.0000</suggested_price> <!-- cena katalogowa (rynkowa) netto -->
        <loyalty_points_price>15000</loyalty_points_price> <!-- cena punktowa; pole obecne przy włączonym p. lojalnościowym -->
        <loyalty_points_addition>30</loyalty_points_addition> <!-- ilość punktów za zakup; pole obecne przy wł. p. lojalnościowym -->
        <unit>sztuka</unit> <!-- jednostka -->
        <item_unit>sztuka</item_unit> <!-- podjednostka -->
        <items_per_package>5</items_per_package> <!-- ilość sztuk w opakowaniu (na użytek rabatowania w B2B) -->
        <min_order>1.0000</min_order> <!-- minimum logistyczne -->
        <cycle>3</cycle> <!-- cykl życia, ilość dni -->
        <images> <!-- zdjęcia -->
            <image>
                <name> <!-- nazwa pliku -->
                    <![CDATA[ 2_5392_0_3183.jpg ]]>
                </name>
                <title> <!-- tytuł zdjęcia (dla SEO) -->
                    <![CDATA[[Zestaw] Kulki + Lufa]]>
                </title>
                <description> <!-- opis zdjęcia (dla SEO) -->
                    <![CDATA[[Zestaw] Kulki + Lufa]]>
                </description>
                <url>http://demo.atomstore.pl/img/imagecache/150x100_product_media_2_5392_0_3183.jpg</url> <!-- URL zdjęcia -->
                <stores_excluded>2,4</stores_excluded> <!-- id wykluczonych sklepów (multistore) -->
            </image>
            <image>
                <name>
                    <![CDATA[ 300x240_product_media_SRB_229_1.jpg ]]>
                </name>
                <title>
                    <![CDATA[[Zestaw] Kulki + Lufa]]>
                </title>
                <description>
                    <![CDATA[[Zestaw] Kulki + Lufa]]>
                </description>
                <url>http://demo.atomstore.pl/img/imagecache/150x120_product_media_SRB_229_1.jpg</url>
                <stores_excluded></stores_excluded>
            </image>
        </images>
        <tags> <!-- tagi oddzielone przecinkami -->
            <![CDATA[ tag1,tag2,test ]]>
        </tags>
        <tags lang="eng"> <!-- tags divided by commas -->
            <![CDATA[ tag1,tag2,test ]]>
        </tags>
        <seo_alias>zestaw-kulki-guarder-lufa-precyzyjna-o-dlugosci-510-mm</seo_alias> <!-- alias na rzecz przyjaznego linku -->
        <seo_title> <!-- title strony produktu (metatag dla SEO) -->
            <![CDATA[ test SEO title ]]>
        </seo_title>
        <seo_title lang="eng">
            <![CDATA[ test SEO title ]]>
        </seo_title>
        <seo_keywords> <!-- słowa kluczowe strony produktu (dla SEO) -->
            <![CDATA[ test,SEO,keywords ]]>
        </seo_keywords>
        <seo_keywords lang="eng">
            <![CDATA[ test,SEO,keywords ]]>
        </seo_keywords>
        <seo_description> <!-- opis strony produktu (metatag dla SEO) -->
            <![CDATA[ test SEO description ]]>
        </seo_description>
        <seo_description lang="eng">
            <![CDATA[ test SEO description ]]>
        </seo_description>
        <update>0</update> <!-- znacznik obecny gdy przekazano parametr only_new_products = 1, patrz: SetProducts -->
        <url>http://demo.atomstore.pl/zestaw-kulki-guarder-lufa-precyzyjna-o-dlugosci-510-mm</url> <!-- adres strony produktu -->
        <url lang="eng">http://demo.atomstore.pl/zestaw-kulki-guarder-lufa-precyzyjna-o-dlugosci-510-mm</url>
        <package_content kitID="78"> <!-- znacznik obecny przy włączonym module zestawów, niepusty jeśli produkt jest zestawem -->
            <code quantity="1">BB-30(1000)</code> <!-- ilość i kod produktu składowego -->
            <code quantity="1">RAG-WE--017(L)</code> <!-- UWAGA: podprodukty bez kodu nie są zwracane -->
        </package_content>
        <related_products> <!-- produkty powiązane -->
            <related_product>pr-20180802-1056</related_product> <!-- kod produktu powiązanego -->
            <related_product>pr-20180802-1057</related_product>
        </related_products>
        <related_product_filter>produkty</related_product_filter> <!-- etykieta dynamicznej listy -->
        <custom_weight>100</custom_weight> <!-- priorytet sortowania-->
    </product>
    <product>
        <code>pr-20180802-1052</code>
        <!-- (...) -->
        <service code="dodatkowa gwarancja">1</service> <!-- czy produkt jest usługą + opcjonalnie kod grupy usług -->
        <services></services>
    </product>
    <product>
        <code>pr-20180802-1107</code>
        <!-- (...) -->
        <service>0</service>
        <services> <!-- lista usług przypisanych do produktu -->
            <code><![CDATA[pr-20180802-1111]]></code> <!-- kod produktu będącego usługą -->
            <code><![CDATA[pr-20180802-1112]]></code>
        </services>
    </product>
</products>

Uwagi:
– dla produktów przeniesionych do kosza w danych znajdzie się dodatkowo znacznik <deleted>1</deleted> (patrz: SetProducts); UWAGA: towary normalnie usunięte nie figurują w bazie danych AtomStore, więc nie zostaną zwrócone z GetProducts,- strukutura danych (wewnątrz <product>) dla produktów z wariantami, gdy przekazano parametr 'combinations’ = 1: 

<combinations>
    <combination>
        <id>123</id> <!-- id wariantu w AtomStore -->
        <code>kod_wariantu_X</code> <!-- kod wariantu -->
        <quantity>0</quantity> <!-- stan magazynowy -->
        <status_id>1</status_id> <!-- Id statusu dostępności -->
        <status_name><![CDATA[ Dostepny ]]></status_name> <!-- Nazwa statusu dostępności -->
        <price_modifier>+</price_modifier> <!-- modyfikator ceny (+, -, =, %) -->
        <price_value>0.00</price_value> <!-- wartość modyfikacji ceny (netto) -->
        <purchase_price>0.00</purchase_price> <!-- cena zakupu (netto) -->
        <suggested_price>0.00</suggested_price> <!-- cena katalogowa (netto) -->
        <attributes> <!-- atrybuty do wyboru -->
            <attribute>
                <name><![CDATA[Rozmiar]]></name>
                <value><![CDATA[L]]></value>
            </attribute>
            <attribute>
                <name><![CDATA[Kolor]]></name>
                <value><![CDATA[zielony]]></value>
            </attribute>
        </attributes>
        <params> <!-- dodatkowe atrybuty opisujące wariant -->
            <param>
                <name><![CDATA[EAN]]></name>
                <value><![CDATA[2201808021706]]></value>
            </param>
        </params>
    </combination>
    <combination>
        <id>124</id>
        <code>kod_wariantu_Y</code>
        <quantity>0</quantity>
        <price_modifier>=</price_modifier>
        <price_value>159.99</price_value>
        <attributes>
            <attribute>
                <name><![CDATA[Rozmiar]]></name>
                <value><![CDATA[XXL]]></value>
            </attribute>
        </attributes>
    </combination>
</combinations>

– znaczniki występujące w danych warunkowo:

categorieswystępuje tyle razy, w ilu kategoriach jest produkt, w szczególności 0 
attributeswystępuje tylko jeśli przekazano parametr 'get_attributes’ o wartości innej niz 0
price_promowystępuje, gdy produkt jest obecnie w promocji
purchase_pricewystępuje, gdy da się ustalić cenę zakupu
only_suppliersnie występuje, jeśli moduł „Dostawcy” jest wyłączony
loyalty_points_pricenie występuje, jeśli moduł „Program lojalnościowy” jest wyłączony
loyalty_points_additionj.w.
imagesnie występuje, jeśli produkt nie ma przypisanego żadnego zdjęcia
combinationswystępuje dla produktów z wariantami, jeśli przekazano parametr 'combinations’ = 1
deletedwystępuje jedynie z wartością 1, jeśli produkt został przeniesiony do kosza
updatewystępuje jedynie z wartością 0, jeśli przekazano parametr 'only_new_products’ = 1 (patrz: SetProducts)
package_contentnie występuje, jeśli moduł „Zestawy” jest wyłączony
servicetylko przy włączonym module „Usługi”
servicesj.w.
custom_weightwystępuje, jeśli priorytety sortowania są stosowane (konfiguracja AtomStore)

– zwracane dane są sortowane w ustalony sposób tylko jeśli przekazano parametr 'limit’ > 0, wówczas produkty są uporządkowane wg daty ostatniej modyfikacji lub wg daty dodania (jeśli przekazano parametr 'only_new_products’ = 1), rosnąco,
różnicowanie danych: pobieranie wszystkich produktów w 1 zapytaniu jest niewskazane; preferowaną metodą podziału jest wykorzystanie parametru 'modified’ i 'limit’; po stronie klienta SOAP należy wyodrębnić z pierwszego pakietu maksymalną wartość pola <modified> (lub <created>, jeśli przekazano parametr 'only_new_products’ = 1), a następnie przekazać tę datę do kolejnego wywołania GetProducts, itd.; alternatywnie skorzystać można z metody GetProductsIdsRange i parametru 'product_id’, bez użycia parametru 'limit’ (pakiety wydzielone w ten sposób mogą zawierać różną ilość towarów, jeśli w podawanych zakresach id niektóre towary były usuwane).

GetProductsIdsRange

Pobranie zakresu id produktów w bazie AtomStore. Zwrócony zakres można dowolnie podzielić, a następnie przekazywać kolejne fragmenty w parametrze 'product_id’ do metody GetProducts celem zmniejszenia ilości danych pobieranych w jednym zapytaniu. Jest to jeden z 2 sposobów porcjowania danych z metody GetProducts, obydwa zostały objaśnione w opisie metody GetProducts.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$response = $client->GetProductsIdsRange($authenticate);
echo $response;

Dane zwracane: 

8496-15247

GetSpecials

Pobranie szczegółowych informacji o promocjach.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
return_inactiveniebooleanfalseczy mają zostać zwrócone promocje nieaktywne / nieaktualne
modifiedniestring0000-00-00 00:00:00zwrócenie promocji dodanych/zmienionych z tą datą lub później
store_idniestring pobranie tylko promocji obowiązujących w zadanym sklepie (multistore);
możliwe jest podanie wielu identyfikatorów poprzez oddzielenie ich znakiem |

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$response = $client->GetSpecials($authenticate);
header('Content-Type: application/xml');
echo $response;

Dane zwracane + komentarze: 

<specials>
    <special>
        <product_id>1234</product_id> <!-- id produktu w AtomStore -->
        <code><![CDATA[HHG-0302]]></code> <!-- kod produktu lub wariantu -->
        <price>8.1220</price> <!-- cena promocyjna netto -->
        <percentage>50.00</percentage> <!-- procent promocji (tylko dla promocji procentowych) -->
        <happy_hours>0</happy_hours> <!-- promocja typu "happy hours" (1 = tak, 0 = nie) -->
        <date_from>2018-12-31 23:59:59</date_from> <!-- data/godzina rozpoczęcia (może być pusta) -->
        <date_to></date_to> <!-- data/godzina zakończenia (może być pusta) -->
        <mainpage>1</mainpage> <!-- promocja oznaczona jako "strona główna" (1 = tak, 0 = nie) -->
        <name><![CDATA[noworoczne okazje]]></name> <!-- nazwa promocji (może być pusta) -->
        <active>0</active> <!-- promocja aktywna i aktualna (1 = tak, 0 = nie) -->
        <modified>2018-12-15 12:20:20</modified> <!-- data ostatniej modyfikacji -->
        <sale_id>123</sale_id> <!-- id wyprzedazy -->
        <sale_name quantity_to="1">Gorąca jesień</sale_name> <!-- Informacja o nazwie wysyłki + ilość docelowa do jakiej obowiązuje wyprzedaż -->
    </special>
</specials>

Uwagi:
– dla promocji procentowej wartość kwotowa w polu <price> pozostaje pusta lub wyliczona – zależnie od konfiguracji Atom API,
– dla promocji typu „happy hours” w polach daty rozpoczęcia i zakończenia widnieją jedynie godziny,
– B2B: promocje indywidualne nie są zwracane,
– dane zwracane są w kolejności zgodnej z datami rozpoczęcia promocji, rosnąco.

SetCategories

Zapis kategorii, bez przypisań produktów. Do poprawnej integracji katalogu nie jest konieczne wykorzystywanie tej metody, ponieważ w danych produktu wysyłanych do SetProducts można wskazać ścieżkę kategorii słownie (poziomy oddzielone ukośnikami). Jest to zalecany tryb integracji, natomiast nie ma wówczas możliwości edytowania nazw kategorii (ta sama kategoria wysłana ze zmienioną nazwą spowoduje utworzenie nowej, zbędnej instancji). Można więc zarządzać drzewem przez metodę SetCategories, w ten sposób nadać kategoriom własne identyfikatory i z ich zachowaniem zmieniać nazwy czy „rodziców” w drzewie. Przypisanie produktu do kategorii wymaga wówczas wskazania jej identyfikatora (patrz: SetProducts).

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
messagetakmessagestruktura zawierająca pole 'xml’, które powinno zawierać ciąg znaków w formacie XML; opis formatu poniżej

Format XML + komentarze:

<categories>
    <category>
        <id>kod_p_1</id> <!-- zewnętrzny identyfikator kategorii -->
        <name>Muzyka</name> <!-- nazwa kategorii -->
        <pid></pid> <!-- kategorie główne nie mają wskazanej kategorii nadrzędnej ("rodzica") -->
    </category>
    <category>
        <id>kod_p_2</id>
        <name>Książki</name>
        <pid></pid>
    </category>
    <category>
        <id>kod_m_1</id>
        <name>Klasyka</name>
        <pid>kod_p_1</pid> <!-- zewnętrzny identyfikator kategorii nadrzędnej ("rodzica") -->
    </category>
    <category>
        <id>kod_m_2</id>
        <name>Pop</name>
        <name lang="eng">Britpop</name> <!-- tłumaczenie nazwy kategorii -->
        <pid>kod_p_1</pid>
        <hidden>0</hidden> <!-- kategoria ukryta (1 = tak, 0 = nie) -->
        <image_base64>...</image_base64> <!-- zdjęcie zakodowane w base64 -->
        <image_url>...</image_url> <!-- link do zdjęcia -->
        <description>Muzyka popowa</description> <!-- opis -->
        <seo_name> <!-- alternatywna nazwa dla znacznika h1 itd. -->
            <![CDATA[ Muzyka pop ]]>
        </seo_name>
        <seo_title> <!-- title strony kategorii (metatag dla SEO) -->
            <![CDATA[ test SEO title ]]>
        </seo_title>
        <seo_keywords> <!-- słowa kluczowe strony kategorii (dla SEO) -->
            <![CDATA[ test,SEO,keywords ]]>
        </seo_keywords>
        <seo_description> <!-- opis strony kategorii (metatag dla SEO) -->
            <![CDATA[ test SEO description ]]>
        </seo_description>
    </category>
</categories>

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$xml = '<categories><category><id>kod_kategorii</id><name>Dla dzieci</name><pid>kod_rodzica</pid></category></categories>';
$message = array('xml' => $xml);
$response = $client->SetCategories($authenticate, $message);
echo $response;

Dane zwracane: 

OK

Uwagi:
– API posiada zabezpieczenie przed wysłaniem w pierwszej kolejności podkategorii, później kategorii nadrzędnej, jednak sugerowane jest zachowanie logicznego porządku: najpierw dane kategorii nadrzędnych, potem kategorii wewnątrz itd.,
– aktualnie metoda nie pozwala na usuwanie kategorii ani na zmianę ich kolejności,
– nie ma ograniczeń odnośnie ilości poziomów zagnieżdżenia.

SetCombinations

Zapis kategorii, bez przypisań produktów. Do poprawnej integracji katalogu nie jest konieczne wykorzystywanie tej metody, ponieważ w danych produktu wysyłanych do SetProducts można wskazać ścieżkę kategorii słownie (poziomy oddzielone ukośnikami). Jest to zalecany tryb integracji, natomiast nie ma wówczas możliwości edytowania nazw kategorii (ta sama kategoria wysłana ze zmienioną nazwą spowoduje utworzenie nowej, zbędnej instancji). Można więc zarządzać drzewem przez metodę SetCategories, w ten sposób nadać kategoriom własne identyfikatory i z ich zachowaniem zmieniać nazwy czy „rodziców” w drzewie. Przypisanie produktu do kategorii wymaga wówczas wskazania jej identyfikatora (patrz: SetProducts).

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
messagetakmessagestruktura zawierająca pole 'xml’, które powinno zawierać ciąg znaków w formacie XML; opis formatu poniżej

Format XML + komentarze:

<combinations>
    <combination>
        <code>kod_1</code> <!-- ten produkt stanie się kartoteką z wariantami -->
        <code>kod_2</code> <!-- produkt, który stanie się wariantem produktu "kod_1" -->
        <code>kod_3</code> <!-- produkt, który stanie się wariantem produktu "kod_1" -->
    </combination>
</combinations>

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$xml = '<combinations><combination><code>x</code><code>y</code></combination></combinations>';
$message = array('xml' => $xml);
$response = $client->SetCombinations($authenticate, $message);
echo $response;

Dane zwracane: 

OK

Uwagi:
– API posiada zabezpieczenie przed wysłaniem w pierwszej kolejności podkategorii, później kategorii nadrzędnej, jednak sugerowane jest zachowanie logicznego porządku: najpierw dane kategorii nadrzędnych, potem kategorii wewnątrz itd.,
– aktualnie metoda nie pozwala na usuwanie kategorii ani na zmianę ich kolejności,
– nie ma ograniczeń odnośnie ilości poziomów zagnieżdżenia.

SetGratis

Dodawanie promocji, gratisów, zniżek.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
messagetakmessagestruktura zawierająca pole 'xml’, które powinno zawierać ciąg znaków w formacie XML; opis formatu poniżej

Format XML + komentarze:

<promotions>
    <promotion type="quantity_discount"> <!-- zniżki ilościowe-->
      <main_items>
        <akronim>123</akronim> <!-- kody produktow -->
        <akronim>567</akronim>
      </main_items>
      <discounts>
        <discount from="5">20</discount> <!-- próg ilościowy i procent zniżki -->
        <discount from="7">50</discount>
      </discounts>
    </promotion>
    <promotion type="amount_gratis"> <!-- gratis od kwoty -->
      <gratis_items>
        <akronim from="100" quantity="1">123</akronim> <!-- wymagana kwota, ilość gratis, kod produktu-->
        <akronim from="200" quantity="2">567</akronim>
      </gratis_items>
    </promotion>
    <promotion type="products_gratis" from="1" multiplication="yes"> <!-- gratis za zakup produktu-->
    <!-- from=wymagana liczba sztuk, multiplication=czy korzyść ma być powtarzana-->
      <main_items> <!-- produkty bazowe-->
        <akronim>123</akronim>
        <akronim>567</akronim>
      </main_items>
      <gratis_items> <!-- produkty gratis-->
        <akronim quantity="1">123</akronim>
        <akronim quantity="2">567</akronim>
      </gratis_items>
    </promotion>
    <promotion type="common"> <!-- promocje -->
      <main_items>
        <akronim price="12.12">123</akronim> <!-- kod produktu i cena promocyjna -->
        <akronim percentDiscount="30">55</akronim> <!-- kod produktu i procent promocji -->
      </main_items>
    </promotion>
</promotions>

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$xml = '<promotions>';
$xml .= '<promotion type="common">';
$xml .= '<main_items>
<akronim price="12.12">123</akronim>
<akronim percentDiscount="30">55</akronim>
</main_items>';
$xml .= '</promotion>';
$xml .= '</promotions>';
$message = array('xml' => $xml);
$response = $client->SetGratis($authenticate, $message);
echo $response;

Dane zwracane: 

OK

Uwagi:
– metoda usuwa wszystkie nieprzekazane promocje

SetOpenPackage

Dodawanie i aktualizacja zestawów otwartych. 

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
messagetakmessagestruktura zawierająca pole 'xml’, które powinno zawierać ciąg znaków w formacie XML; opis formatu poniżej

Format XML + komentarze:

<products>
  <product>
    <code>TB-CS074</code> <!-- kod towaru, który ma się stać zestawem otwartym -->
    <external_id>RR34BHCSPOVC</external_id> <!-- alternatywna identyfikacja towaru -->
    <product_name><![CDATA[product name]]></product_name> <!-- aktualizacja nazwy produktu -->
    <product_description><![CDATA[product description]]></product_description> <!-- aktualizacja opisu produktu -->
    <package_content>  <!-- elementy zestawu -->
        <code group_id="123" group_name="grupa 1" group_min_choices="1" group_max_choices="2" quantity="2">TB-CS075</code>
        <code group_id="22" group_name="grupa 2" group_min_choices="1" group_max_choices="3" quantity="1">TB-CS076</code>
          <!-- group_id="123" / group_name="grupa 1" → ID lub nazwa grupy -->
          <!-- quantity - ilość sztuk produktu, który jest do wyboru -->
          <!-- group_min_choices="1" group_max_choices="2"  ile produktów z danej grupy mozna wybrać -->
    </package_content>
  </product>
</products>

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$xml = '<products>';
$xml .= '<product>';
$xml .= '
    <code>TB-CS074</code>
    <package_content>
        <code group_id="123" group_name="abc" group_min_choices="1" group_max_choices="2" quantity="2">TB-CS075</code>
    </package_content>
';
$xml .= '</product>';
$xml .= '</products>';
$message = array('xml' => $xml);
$response = $client->SetOpenPackage($authenticate, $message);
echo $response;

Dane zwracane: 

OK

Uwagi:
– Produkt, który ma się stać zestawem, musi już istnieć
– Grupy wyboru muszą być wczesniej zdefiniowane w panelu lub metodą SetOpenPackageGroup

SetOpenPackageGroups

Definiowanie grup wyboru dla zestawów otwartych. 

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
messagetakmessagestruktura zawierająca pole 'xml’, które powinno zawierać ciąg znaków w formacie XML; opis formatu poniżej

Format XML + komentarze:

<groups>
    <group>
      <id>123</id> <!-- id grupy -->
      <name>Wybierz krawat</name> <!-- nazwa grupy -->
      <min>2</min> <!-- minimalna liczba produktów do wyboru -->
      <max>2</max> <!-- maksymala liczba produktów do wyboru -->
      <max_quantity>123</max_quantity> <!-- wymagana ilość sztuk -->
      <max_quantity_type>equal</max_quantity_type> <!-- wymagana ilość sztuk, equal=dokładnie | max=maksymalnie -->
      <include_discount>1</include_discount> <!-- czy produkty z tej grupy podlegają zniżce procentowej zestawu -->
 </group>
</groups>

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$xml = '<groups>';
$xml .= '<group>';
$xml .= '
      <id>123</id>
      <name>Wybierz krawat</name>
      <max_quantity>123</max_quantity>
      <max_quantity_type>equal</max_quantity_type>
      <include_discount>1</include_discount>
      <min>2</min>
      <max>2</max>
';
$xml .= '</group>';
$xml .= '</groups>';
$message = array('xml' => $xml);
$response = $client->SetOpenPackageGroups($authenticate, $message);
echo $response;

Dane zwracane: 

<groups>
    <group>
      <id>123</id>
      <name>Wybierz krawat</name>
 </group>
</groups>

Uwagi:
– Dodając nową grupę, należy przekazać jej dane bez pola <id>, a na potrzeby kolejnych wywołań zachować <id>, które zostanie zwrócone

SetOpinions

Dodawanie opinii o produktach (recenzji). 

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
messagetakmessagestruktura zawierająca pole 'xml’, które powinno zawierać ciąg znaków w formacie XML; opis formatu poniżej

Format XML + komentarze:

<opinions>
        <opinion>
            <code>aa8f3ifhf</code> <!-- kod produktu -->
            <username>Maciej A.</username> <!-- autor (wymagane) -->
            <email>maciej.a@atomstore.pl</email> <!-- adres email autora (wymagany) -->
            <content> <!-- treść opinii -->
                <![CDATA[ bardzo udany produkt ]]> <!-- zalecany komentarz CDATA (wymagany)-->
            </content>
            <note>5</note> <!-- ocena od 1 do 5 -->
            <status>1</status> <!-- status(aktywność) -->
            <benefits><![CDATA[ benefity ]]></benefits> <!-- benefity -->
            <defects><![CDATA[ urwana rączka ]]></defects> <!-- usterki -->
            <locale>pol</locale> <!-- jezyk -->
            <created>2023-06-01 09:55:05</created> <!-- data utworzenia (opcjonalnie) -->                  
        </opinion>
        <opinion>
            <external_id>jh3829f</external_id> <!-- identyfikator zewnętrzny - alternatywna identyfikacja towaru -->
            <username>maciek</username>
            <email>maciej@klex.pl</email>
            <content>
                <![CDATA[ ten kolor na zdjęciu wyglądał inaczej ]]>
            </content>
            <note>3</note>
            <locale>eng</locale> <!-- jezyk -->
        </opinion>
</opinions>

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$xml = '<opinions>';
$xml .= '<opinion>';
$xml .= '<code>kod_produktu_X</code><username>Maciej A.</username><email>maciej.a@atomstore.pl</email>';
$xml .= '<note>5</note><content>Rewelacja!</content>';
$xml .= '</opinion>';
$xml .= '</opinions>';
$message = array('xml' => $xml);
$response = $client->SetOpinions($authenticate, $message);
echo $response;

Dane zwracane: 

OK

Uwagi:
– metoda nie pozwala na aktualizowanie istniejących recenzji (nie są identyfikowane wg produktu i osoby recenzującej),
– przesłane opinie zapisywane są w sklepie jako zatwierdzone.

SetPrices

Zapis cen podstawowych, promocyjnych (w szczególności wyprzedaży) oraz cen w dodatkowych cennikach zdefiniowanych w sklepie. Zapis zarówno na rzecz produktów, jak i na rzecz wariantów zidentyfikowanych podanym kodem.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
messagetakmessagestruktura zawierająca pole 'xml’, które powinno zawierać ciąg znaków w formacie XML; opis formatu poniżej

Format XML, różne konfiguracje + komentarze:

<prices>
    <price>
        <code>kkk_1</code> <!-- kod produktu lub wariantu (patrz: "Uwagi" poniżej) -->
        <price_netto>12.1234</price_netto> <!-- cena netto, precyzja do 4 miejsc po przecinku -->
    </price>
    <price>
        <code>kkk_2</code>
        <price_brutto>99.99</price_brutto> <!-- można przekazać cenę brutto, 2 miejsca po przecinku -->
        <vat_rate>23</vat_rate> <!-- przy przekazywaniu ceny brutto zalecana jest również stawka VAT -->
    </price>
    <price>
        <code>kkk_3</code>
        <price_netto>12.1234</price_netto>
        <vat_rate>23</vat_rate> <!-- stawkę VAT można przekazać do zapisu zawsze, nie tylko przy cenach brutto -->
        <purchase_price>80,50</purchase_price> <!-- opcjonalny zapis ceny zakupu (netto) -->
        <suggested_price>115,00</suggested_price> <!-- opcjonalny zapis ceny katalogowej (netto) -->
    </price>
    <price>
        <code>kkk_4</code>
        <price_netto>7.1234</price_netto>
        <price_list_id>2</price_list_id>
        <!-- opcjonalne wskazanie id cennika, do którego ma być zapisana cena;
        id cennika można odczytac w panelu → SPRZEDAŻ → CENNIKI;
        niezidentyfikowany cennik NIE zostanie utworzony -->
    </price>
    <price>
        <code>kkk_5</code>
        <price_promo>10.1234</price_promo> <!-- cena promocyjna netto -->
        <name><![CDATA[wyjątkowe okazje]]></name> <!-- nazwa promocji, opcjonalnie -->
    </price>
    <price>
        <code>kkk_6</code>
        <price_promo_brutto>11.00</price_promo_brutto> <!-- można przekazać cenę promocyjną brutto -->
        <vat_rate>23</vat_rate> <!-- zapis ceny promocyjnej brutto wymaga podania stawki VAT -->
    </price>
    <price>
        <code>kkk_7</code>
        <price_promo>10.1234</price_promo>
        <mainpage>1</mainpage> <!-- promocję można oznaczyć jako "Strona główna: tak" -->
        <date_from>2015-09-01</date_from> <!-- data rozpoczęcia promocji, opcjonalnie -->
        <date_to>2015-09-15</date_to> <!-- data zakończenia promocji, opcjonalnie -->
    </price>
    <price>
        <code>kkk_8</code>
        <price_promo>0</price_promo> <!-- zerowa cena promocyjna kasuje promocję -->
    </price>
    <price>
        <code>kkk_9</code>
        <price_promo_brutto>0</price_promo_brutto> <!-- j.w. -->
    </price>
    <price>
        <code>kkk_10</code>
        <price_promo>5.4321</price_promo>
        <stores>1,3</stores><!-- ID sklepów (multistore), oddzielone przecinkiem, dla których ma obowiązywać promocja (opcjonalnie) -->
        <sale_name quantity_to="0">Gorąca jesień</sale_name> <!-- przypisanie produktu do wyprzedaży o wskazanej nazwie + ilość docelowa -->
        <date_from>2015-09-01</date_from> <!-- data rozpoczęcia wyprzedaży, opcjonalnie -->
        <date_to>2015-09-15</date_to> <!-- data zakończenia wyprzedaży, opcjonalnie -->
    </price>
    <price>
        <code>kkk_11</code>
        <price_promo>0</price_promo> <!-- zerowa cena promocyjna... -->
        <sale_name></sale_name> <!-- ...i znacznik "sale_name" - usunięcie produktu z wyprzedaży  -->
    </price>
    <price>
        <external_id>vsh38v39h</external_id> <!-- identyfikator zewnętrzny - alternatywna identyfikacja towaru -->
        <price_netto>99.99</price_netto>
    </price>
    <price>
        <code>kkk_8</code>
        <percentage_promo>10</percentage_promo>
    </price>
    <price>
        <code>kkk_8</code>
        <percentage_promo>0</percentage_promo> <!-- zerowy procent promocyjny kasuje promocję -->
    </price>
</prices>

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$xml = '<prices><price><code>XYZ</code><price_netto>100.1234</price_netto></price></prices>';
$message = array('xml' => $xml);
$response = $client->SetPrices($authenticate, $message);
echo $response;

Dane zwracane: 

OK

Uwagi:
– jeśli podany kod (<code>) zostaje odnaleziony w wariantach, cena zapisywana jest dla wariantu (wraz z modyfikatorem '=’), przy czym można to wyłączyć w ustawieniach API (np. jeśli wszystkie warianty mają dziedziczyć cenę z produktu, do którego są przypisane),
– jeśli podany kod wpisany jest zarówno dla któregoś wariantu, jak i dla produktu, to zależnie od ustawień API cena może być zapisana dla wariantu i produktu / tylko dla wariantu / tylko dla produktu,
– jeśli wysyłana jest cena promocyjna, system sprawdza, czy na dany produkt (lub wariant) jest obecnie zdefiniowana promocja; jeśli tak, promocja jest nadpisywana, jeśli nie, jest dodawana,
– produkt nie może być jednocześnie w promocji i na wyprzedaży, zatem przypisanie do wyprzedaży usuwa standardową promocję i odwrotnie,
– daty <date_from> i <date_to> podane dla wyprzedaży zostaną zastosowane do wszystkich produktów objętych tą samą wyprzedażą, jeśli natomiast nie zostały podane, będą zaczerpnięte z dotychczasowych danych wyprzedaży,
– przy identyfikacji za pomocą znacznika <external_id> nie ma możliwości rozpoznawania i nadpisywania wariantów (patrz: Identyfikacja produktów).

SetProducers

Dodawanie i aktualizowanie danych producentów (bez przypisywania produktów).

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
messagetakmessagestruktura zawierająca pole 'xml’, które powinno zawierać ciąg znaków w formacie XML; opis formatu poniżej

Format XML + komentarze:

<producers>
    <producer>
        <name>ABC</name> <!-- nazwa producenta -->
        <desc> <!-- opis, zalecany w komentarzu CDATA, może zawierać znaczniki HTML -->
            <![CDATA[ testowy opis ]]>
        </desc>
        <logo>...</logo> <!-- opcjonalnie, logo zakodowane w base64 -->
    </producer>
    <producer>
        <id>123</id> <!-- id producenta w AtomStore - wskazanie producenta, którego dane mają zostać zaktualizowane -->
        <name>DEF</name>
        <desc><![CDATA[]]></desc>
    </producer>
    <producer>
        <id>124</id>
        <delete>1</delete> <!-- dyspozycja usunięcia producenta -->
    </producer>
<producers>

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$xml = '<producers><producer><name>ABC</name><desc></desc></producer></producers>';
$message = array('xml' => $xml);
$response = $client->SetProducers($authenticate, $message);
header('Content-Type: application/xml');
echo $response;

Dane zwracane: 

<savedProducers>
    <savedProducer>
        <id>987</id>
        <name>
            <![CDATA[ ABC ]]>
        </name>
    </savedProducer>
</savedProducers

Uwagi:
– aktualizowanie danych producentów jest możliwe tylko na podstawie <id>, wymagane jest zatem rejestrowanie w zewnętrznym systemie identyfikatorów zawartych w strukturze zwrotnej,
– w przypadku nieokreślenia <id> lub wskazania nieistniejącego producenta, zostanie utworzony nowy producent,
– znacznik <id> nie pozwala narzucić własnego identyfikatora,
– struktura zwrotna zawiera dane zarówno właśnie dodanych, jak i zaktualizowanych producentów (może zawierać wiele węzłów <savedProducer>),
– struktura zwrotna nie zawiera danych usuniętych producentów,
– przekazanie pustego znacznika <logo> spowoduje usunięcie loga producenta,
– dyspozycja usunięcia producenta (<delete>1</delete>) działa tylko jeśli przekazano <id> istniejącego producenta.

SetProductQuantities

Zapis stanów magazynowych dla produktów lub wariantów, na rzecz magazynu własnego lub dostawców (magazyny dodatkowe), a także przypisywanie towarom statusów dostępności.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
messagetakmessagestruktura zawierająca pole 'xml’, które powinno zawierać ciąg znaków w formacie XML; opis formatu poniżej

Format XML + komentarze:

<producers>
    <producer>
        <name>ABC</name> <!-- nazwa producenta -->
        <desc> <!-- opis, zalecany w komentarzu CDATA, może zawierać znaczniki HTML -->
            <![CDATA[ testowy opis ]]>
        </desc>
        <logo>...</logo> <!-- opcjonalnie, logo zakodowane w base64 -->
    </producer>
    <producer>
        <id>123</id> <!-- id producenta w AtomStore - wskazanie producenta, którego dane mają zostać zaktualizowane -->
        <name>DEF</name>
        <desc><![CDATA[]]></desc>
    </producer>
    <producer>
        <id>124</id>
        <delete>1</delete> <!-- dyspozycja usunięcia producenta -->
    </producer>
<producers>

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$xml = '<products><product><code>kkk_111</code><quantity>14</quantity></product></products>';
$message = array('xml' => $xml);
$response = $client->SetProductQuantities($authenticate, $message);
echo $response;

Dane zwracane: 

OK

Uwagi:
– zapis statusów dostępności funkcjonuje prawidłowo tylko dla statusów nieautomatycznych (niezależnych od liczbowego stanu magazynowego),
– status dostępności może zostać przypisany tylko do produktu (nie do wariantu),
– niezidentyfikowany nazwą status dostępności zostanie automatycznie zdefiniowany,
– automatyczny status dostępności jest nadawany gdy podano znacznik <auto_status> lub też samoczynnie – przy zapisie dodatniego stanu magazynowego (ustawienie API),
– w 1 wywołaniu metody można wskazać ten sam towar wielokrotnie – dla różnych dostawców/magazynów (patrz: kod „kkk_111” w sekcji „Format danych” powyżej),
– niezidentyfikowany nazwą dostawca/magazyn nie zostanie automatycznie utworzony,
– przy identyfikacji za pomocą znacznika <external_id> nie ma możliwości rozpoznawania i nadpisywania wariantów (patrz: Identyfikacja produktów).

SetProducts

Zapis danych produktów, m.in. opisu, kategorii, producenta, atrybutów, wariantów, ceny podstawowej, stanu w m. własnym.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
messagetakmessagestruktura zawierająca pole 'xml’, które powinno zawierać ciąg znaków w formacie XML; opis formatu poniżej

Format XML + komentarze:

<products>
    <product>
        <code>k50456430806</code> <!-- kod produktu -->
        <product_name> <!-- nazwa, zalecany komentarz CDATA -->
            <![CDATA[ Lampa podłogowa biała ]]>
        </product_name>
        <product_name lang="eng"> <!-- nazwa, zalecany komentarz CDATA -->
            <![CDATA[ White floor lamp ]]>
        </product_name>
        <product_description> <!-- opis w komentarzu CDATA, może zawierać znaczniki HTML -->
            <![CDATA[ <p>Testowy opis</p> ]]>
        </product_description>
        <product_description lang="eng"> <!-- opis w komentarzu CDATA, może zawierać znaczniki HTML -->
            <![CDATA[ <p>test description</p> ]]>
        </product_description>
        <producer_name> <!-- nazwa producenta, zalecany komentarz CDATA -->
            <![CDATA[ Zuiver ]]>
        </producer_name>
        <category> <!-- ścieżka kategorii -->
            <![CDATA[ Oświetlenie/lampy podłogowe ]]>
        </category>
        <category main="1"> <!-- druga kategoria, wskazana jako główna poprzez parametr main = 1 -->
            <![CDATA[ Oświetlenie/oszczędne ]]>
        </category>
        <category main="1"> <!-- główna kategoria w innym drzewie (multistore) -->
            <![CDATA[ elektro-outlet/Oświetlenie/Lampy ]]>
        </category>
        <allow_multicategories require_any="0">0</allow_multicategories>
        <!--
        allow_multicategories: czy pozostawić dotychczasowe kategorie (domyślnie 1 = tak);
        require_any (istotne przy allow_multicategories = 0): czy dotychczasowe kategorie zostaną usunięte bewzględnie (0),
        czy tylko jeśli wskazano inne kategorie (1)
        -->
        <in_search>0</in_search> <!-- wyświetlaj w wynikach wyszukiwania -->
        <in_categories>0</in_categories> <!-- wyświetlaj w kategoriach -->
        <attributes> <!-- atrybuty -->
            <attribute>
                <code> <!-- kod atrybutu (priorytet) -->
                    material
                </code>
                <name> <!-- nazwa atrybutu -->
                    <![CDATA[ Materiał ]]>
                </name>
                <code_value> <!-- kod  wartosci atrybutu (priorytet) -->
                    material
                </code_value>
                <value> <!-- wartość atrybutu -->
                    <![CDATA[ 100% polyester ]]>
                </value>
            </attribute>
            <attribute>
                <name>
                    <![CDATA[ Zawartość pudełka ]]>
                </name>
                <value delete="1"> <!-- kasowanie pojedynczej wartości atrybutu wielowartościowego -->
                    <![CDATA[ dodatkowy abażur ]]>
                </value>
            </attribute>
        </attributes>
        <multi_attrs> <!-- cechy grupowe -->
            <multi_attr>
                <code> <!-- kod cechy grupowej (priorytet) -->
                    color
                </code>
                <name> <!-- nazwa cechy grupowej -->
                    <![CDATA[ Kolor ]]>
                </name>
                <name lang="eng"> <!-- nazwa cechy grupowej -->
                    <![CDATA[ Color ]]>
                </name>
                <multi_values> <!-- wartości cechy grupowej -->
                    <multi_value>
                        <code_value>czerwony</code_value><!-- kod wartosci cechy grupowej (priorytet) -->
                        <value><![CDATA[czerwony]]></value>
                        <value lang="eng"><![CDATA[red]]></value>
                    </multi_value>
                    <multi_value>
                        <value><![CDATA[zielony]]></value>
                        <value lang="eng"><![CDATA[green]]></value>
                    </multi_value>
                </multi_values>
            </multi_attr>
        </multi_attrs>
        <price_netto>928.4553</price_netto> <!-- cena podstawowa netto -->
        <purchase_price>777.80</purchase_price> <!-- cena zakupu netto -->
        <vat_rate>23</vat_rate> <!-- stawka VAT -->
        <quantity>1</quantity> <!-- stan w magazynie własnym -->
        <new>0</new> <!-- czy produkt ma być oznaczony jako nowość (1 = tak, 0 = nie) -->
        <recommended>0</recommended> <!-- czy produkt ma zostać wyróżniony -->
        <bestseller>1</bestseller> <!-- czy produkt ma trafić na listę bestsellerów -->
        <bestseller_weight>3</bestseller_weight> <!-- pozycja produktu na liście bestsellerów (1 = pozycja pierwsza) -->
        <weight>3.9000</weight> <!-- waga (ciężar) produktu w kg -->
        <active>1</active> <!-- aktywność produktu -->
        <verified>1</verified> <!-- czy zweryfikowano dane towaru (pole informacyjne) -->
        <only_gratis>0</only_gratis> <!-- czy produkt ma być dostępny tylko jako gratis -->
        <only_suppliers>0</only_suppliers> <!-- czy dostępność u dostawców ma być priorytetowa względem magazynu własnego -->
        <only_kit>0</only_kit> <!-- czy produkt ma być dostępny tylko w zestawach -->
        <login_request>0</login_request> <!-- czy produkt ma być dostępny tylko dla zalogowanych -->
        <suggested_price>928.4553</suggested_price> <!-- cena katalogowa (rynkowa) netto -->
        <loyalty_points_price>15000</loyalty_points_price> <!-- program lojajnościowy: cena punktowa -->
        <loyalty_points_addition>30</loyalty_points_addition> <!-- program lojalnosciowy: ilość punktów za zakup -->
        <unit>sztuka</unit> <!-- jednostka -->
        <item_unit>sztuka</item_unit> <!-- podjednostka -->
        <items_per_package>5</items_per_package> <!-- ilość sztuk w opakowaniu (na użytek rabatowania w B2B) -->
        <min_order>1.0000</min_order> <!-- minimum logistyczne (obsługiwane tylko w B2B) -->
        <max_order>2.0000</max_order> <!-- maksimum w koszyku -->
        <cycle>3</cycle> <!-- cykl życia, ilość dni -->
        <tags> <!-- tagi oddzielone przecinkami -->
            <![CDATA[ nowoczesne oświetlenie,lampy ]]>
        </tags>
        <tags lang="eng"> <!-- tagi oddzielone przecinkami -->
            <![CDATA[ Innovative lighting, lamps ]]>
        </tags>
        <seo_alias>lampa-podlogowa-tripod-wood-biala</seo_alias> <!-- alias na rzecz przyjaznego linku -->
        <seo_title> <!-- title strony produktu (metatag dla SEO) -->
            <![CDATA[ test SEO title ]]>
        </seo_title>
        <seo_title lang="eng">
            <![CDATA[ test SEO title ]]>
        </seo_title>
        <seo_title lang="rus">
            <![CDATA[ test SEO title ]]>
        </seo_title>
        <seo_keywords> <!-- słowa kluczowe strony produktu (dla SEO) -->
            <![CDATA[ test,SEO,keywords ]]>
        </seo_keywords>
        <seo_keywords lang="eng">
            <![CDATA[ test,SEO,keywords ]]>
        </seo_keywords>
        <seo_keywords lang="rus">
            <![CDATA[ test,SEO,keywords ]]>
        </seo_keywords>
        <seo_description> <!-- opis strony produktu (metatag dla SEO) -->
            <![CDATA[ test SEO description ]]>
        </seo_description>
        <seo_description lang="eng">
            <![CDATA[ test SEO description ]]>
        </seo_description>
        <seo_description lang="rus">
            <![CDATA[ test SEO description ]]>
        </seo_description>
        <related_products> <!-- produkty powiązane -->
            <related_product>k50456430807</related_product> <!-- kod produktu powiązanego -->
            <related_product>k50456430808</related_product>
        </related_products>
        <related_product_filter>produkty</related_product_filter>  <!-- etykieta dynamicznej listy -->
        <custom_weight></custom_weight> <!-- priorytet sortowania -->
        <shipping_individuals> <!-- indywidualne warunki dla wybranych form dostawy -->
            <shipping_method>
                <id>12</id> <!-- id formy dostawy w AtomStore (zwracane z metody GetShippingMethods) -->
                <price>0</price> <!-- indywidualny koszt dostawy, podany w netto -->
                <gratis>0</gratis> <!-- dostawa gratis (1 = tak, 0 = nie) -->
                <exclusion>1</exclusion> <!-- forma dostawy niedostępna dla produktu (1 = tak, 0 = nie) -->
            </shipping_method>
            <shipping_method> <!-- dyspozycja usunięcia indywidualnych warunków dla wskazanej formy dostawy -->
                <id>18</id>
                <delete>1</delete>
            </shipping_method>
        </shipping_individuals>
        <payment_methods_exclusions keep_current="1"> <!-- formy płatności wykluczone przy zakupie tego towaru, keep_current="1"/"0" -> czy zachować dotychczasowe wykluczenia -->
            <payment_method_id>4</payment_method_id> <!-- id formy płatności w AtomStore -->
            <payment_method_id>5</payment_method_id>
        </payment_methods_exclusions>
        <external_ids> <!-- zapis dodatkowych kodów towaru (informacyjnie) -->
            <external_id>
                <module_key>HURTOWNIA_X</module_key> <!-- klucz integracji / dostawcy danych -->
                <id>HX_k50456430806</id> <!-- kod / identyfikator -->
            </external_id>
        </external_ids>
    </product>
    <product>
        <code>k60456430806</code>
        <update>0</update> <!-- czy produkt istniejący ma być nadpisany (1 = tak, 0 = nie) -->
        <product_name>
            <![CDATA[ Mitologia grecka ]]>
        </product_name>
        <producer_id>712</producer_id> <!-- przypisanie producenta poprzez jego id w AtomStore -->
        <category>ext_1234</category> <!-- przypisanie kategorii poprzez zewn. identyfikator (patrz: SetCategories) -->
        <category aid="ext_1244"> <!-- zewn. identyfikator kategorii oraz ścieżka - priorytet zewn. identyfikatora -->
            <![CDATA[ Edukacja/Lektury ]]>
        </category>
        <price_brutto>9.99</price_brutto> <!-- możliwe podanie ceny brutto, zalecane wówczas podanie stawki VAT -->
        <vat_rate>23</vat_rate>
        <ebook>1</ebook> <!-- czy produkt ma być oznaczony jako ebook (niezalecane) -->
    </product>
    <product>
        <code>k65456430806</code>
        <category_id>6431</category_id> <!-- przypisanie kategorii poprzez id w AtomStore -->
        <category_id main="1">6231</category_id>
    </product>
    <product>
        <code>k70456430806</code>
        <deleted>1</deleted> <!-- dyspozycja usunięcia produktu -->
    </product>
    <product>
        <code>k80456430806</code>
        <ignored_fields>name,desc,producer_name,category,attributes,active,price_netto,price_brutto,seo,recommended,new</ignored_fields>
        <!--
        poprzez ignored_fields można określić dane, które mają zostać zignorowane podczas aktualizowania
        produktów już istniejących, np. <ignored_fields>name,desc</ignored_fields> spowoduje, że nazwa i opis
        będą wykorzystane tylko przy tworzeniu kartoteki, a ignorowane podczas jej aktualizacji
        (fraza seo odpowiada znacznikom seo_title, seo_keywords, seo_description)
        -->
        <product_name>
            <![CDATA[ Zestaw: lampa + żarówka ]]>
        </product_name>
        <package_content> <!-- tworzenie/aktualizacja zestawu, wymagane wskazanie produktów składowych -->
            <code quantity="1">k80456430806_a</code> <!-- kod produktu składowego oraz jego ilość w zestawie -->
            <code quantity="2">k80456430806_b</code> <!-- j.w. -->
        </package_content>
    </product>
    <product>
        <code>k90456430806</code>
        <product_name>
            <![CDATA[ Album mp3 ]]>
        </product_name>
        <files delete_unsent="1">
            <!--
            pliki do pobrania, zapisywane do biblioteki produktu wirtualnego;
            delete_unsent - czy pliki niewskazane w XML, ale wcześniej zdefiniowane, mają być usunięte (1 = tak, 0 = nie);
            pliki należy wskazać adresem URL - zostaną jednorazowo zaimportowane do bazy sklepu
            -->
            <file>http://...com.pl/ftp/mp3/testmp3.mp3</file>
            <file>http://...com.pl/ftp/mp3/testmp4.mp3</file>
        </files>
    </product>
    <product>
        <external_id>ei_1222</external_id> <!-- identyfikator zewnętrzny - alternatywna identyfikacja towaru -->
        <new>0</new>
    </product>
    <product>
        <product_id>15248</product_id> <!-- wskazanie produktu poprzez jego id w AtomStore -->
        <new>0</new>
    </product>
    <product>
        <code>pr-20180802-1052</code>
        <!-- (...) -->
        <service code="dodatkowa gwarancja">1</service> <!-- czy produkt jest usługą + opcjonalnie kod grupy usług -->
        <services></services>
    </product>
    <product>
        <code>pr-20180802-1107</code>
        <!-- (...) -->
        <service>0</service>
        <services> <!-- lista usług przypisanych do produktu -->
            <code><![CDATA[pr-20180802-1111]]></code> <!-- kod produktu będącego usługą -->
            <code><![CDATA[pr-20180802-1112]]></code>
        </services>
    </product>
</products>

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$xml = '<products><product><code>kkk_111</code><product_name>Lampa</product_name></product></products>';
$message = array('xml' => $xml);
$response = $client->SetProducts($authenticate, $message);
echo $response;

Dane zwracane: 

OK

Uwagi:
– jedynym wymaganym znacznikiem jest identyfikator produktu; dla zmniejszenia objętości przetwarzanych danych zalecane jest wysyłanie jedynie niepustych pól,- jeśli podany kod (<product> → <code>) zostaje odnaleziony w wariantach, aktualizowane są parametry, waga, a także cena wariantu (wraz z modyfikatorem '=’), przy czym można to wyłączyć w ustawieniach API (np. jeśli wszystkie warianty mają dziedziczyć cenę z produktu, do którego są przypisane),
– jeśli podany kod wpisany jest zarówno dla któregoś wariantu, jak i dla produktu, to zależnie od ustawień API zapis może obejmować cenę wariantu + dane produktu / tylko cenę wariantu / tylko dane produktu,
– przy identyfikacji za pomocą znacznika <external_id> nie ma możliwości rozpoznawania i nadpisywania wariantów (patrz: Identyfikacja produktów),
tworzenie wariantów może odbywać się za pomocą metody SetCombinations (niezalecane) lub poprzez przekazanie do SetProducts, wewnątrz znacznika <product>, następującej struktury danych (również do nadpisywania): 

<combinations>
    <combination>
        <code>kod_wariantu_X</code> <!-- kod wariantu -->
        <price_modifier>+</price_modifier> <!-- modyfikator ceny (+, -, =, %) -->
        <price_value>0.00</price_value> <!-- wartość modyfikacji ceny (netto) -->
        <attributes> <!-- atrybuty do wyboru -->
            <attribute>
                <name><![CDATA[Rozmiar]]></name>
                <value><![CDATA[L]]></value>
            </attribute>
            <attribute>
                <name><![CDATA[Kolor]]></name>
                <value><![CDATA[zielony]]></value>
            </attribute>
        </attributes>
        <params> <!-- dodatkowe atrybuty opisujące wariant -->
            <param>
                <name><![CDATA[EAN]]></name>
                <value><![CDATA[2201808021706]]></value>
            </param>
        </params>
    </combination>
    <combination>
        <code>kod_wariantu_Y</code>
        <price_modifier>=</price_modifier>
        <price_value>150.5050</price_value>
        <purchase_price>140.4040</purchase_price> <!-- cena zakupu (netto) -->
        <suggested_price>160.6060</suggested_price> <!-- cena katalogowa (netto) -->
        <active>1</active> <!-- aktywność wariantu -->
        <verified>0</verified> <!-- czy zweryfikowano dane wariantu (pole informacyjne) -->
        <attributes>
            <attribute>
                <name><![CDATA[Rozmiar]]></name>
                <value><![CDATA[XXL]]></value>
            </attribute>
        </attributes>
        <image_url>http://...</image_url> <!-- adres URL zdjęcia wariantu -->
        <external_ids> <!-- zapis dodatkowych kodów wariantu (informacyjnie) -->
            <external_id>
                <module_key>HURTOWNIA_X</module_key> <!-- klucz integracji / dostawcy danych -->
                <id>HX_wY</id> <!-- kod / identyfikator -->
            </external_id>
        </external_ids>
    </combination>
</combinations>

– ustawianie bestsellerów jest możliwe tylko przy odpowiedniej konfiguracji AtomStore (domyślnie ustawiane są na podstawie sprzedaży),
– dopuszczalne jednostki przekazywane w polu <unit>: sztuka, komplet, para, opakowanie, kilogram, litr, metr, metr kwadratowy, metr sześcienny, gram, mililitr, miligram, 100, decymetr kwadratowy, kilometr,
– w danych atrybutów produktu (<product> → <attributes>) przekazywać można atrybuty typu „cecha” lub „cecha grupowa” (wielowartościowe); wysłanie jednej cechy dla atrybutu wielowartościowego powoduje dopisanie jej do dotychczasowych danych,
– atrybuty produktu: przekazanie pustej wartości (<value>) domyślnie NIE powoduje skasowania wartości, można to jednak włączyć w ustawieniach API,
– zestawy: produkty składowe można wskazać zarówno poprzez kody (<code>) jak i poprzez identyfikatory zewnętrzne (<external_id>); pusty znacznik <package_content> spowoduje, że kartoteka przestanie być zestawem (jeśli nim była),
– produkty powiązane można wskazać jedynie poprzez ich kody (<code>),
– indywidualne warunki dostawy powinny zawierać tylko jedną niepustą cechę: albo indywidualną stawkę, albo oznaczenie <gratis>, albo wykluczenie (w razie niepodania żadnego z tych pól zapisany zostanie indywidualny koszt równy 0),
– wykluczenia produktów z formami płatności mogą być odwoływane poprzez przekazanie pustego węzła <payment_methods_exclusions>; niepodane w nim formy płatności zostaną dla produktu przywrócone.

SetProductsImages

Upload lub wskazanie zdjęć produktów, a także usuwanie plików. Dodawane zdjęcia mogą być zakodowane w base64, wskazane adresem URL (http://...) lub też zapisane wcześniej na serwerze FTP sklepu i wskazane za pomocą nazw plików.

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
messagetakmessagestruktura zawierająca pole 'xml’, które powinno zawierać ciąg znaków w formacie XML; opis formatu poniżej

Format XML, różne konfiguracje + komentarze:

<product_images>
    <product_image>
        <code>kkk_111</code> <!-- kod produktu -->
        <image_name>Amoeba 2.jpg</image_name> <!-- nazwa pliku (wymagana) -->
        <image_content>...</image_content> <!-- zdjęcie zakodowane w base64 -->
        <title>...</title> <!-- tytuł (alt) w języku domyślnym (opcjonalnie, domyślnie przyjmuje nazwę produktu) -->
        <title lang="eng">...</title> <!-- tytuł (alt) w języku dodatkowym (opcjonalnie) -->
        <description>...</description> <!-- opis w języku domyślnym (opcjonalnie, domyślnie przyjmuje nazwę produktu) -->
        <description lang="eng">...</description> <!-- opis w języku dodatkowym (opcjonalnie) -->
    </product_image>
    <product_image>
        <code>kkk_111</code>
        <image_name>Amoeba 3.jpg</image_name>
        <image_url>http://...</image_url> <!-- adres URL, z którego ma zostać pobrane zdjęcie -->
    </product_image>
    <product_image>
        <code>kkk_111</code> <!-- kod produktu lub wariantu -->
        <no_content>1</no_content> <!-- dyspozycja odszukania pliku na serwerze FTP sklepu -->
        <image_name>sdfd_2.jpg</image_name> <!-- nazwa pliku na serwerze FTP (podkalog /media/products) -->
    </product_image>
    <product_image>
        <code>kkk_111</code>
        <image_name>Amoeba 4.jpg</image_name>
        <image_content>...</image_content>
        <dir>1_1000</dir> <!-- wskazanie podkatalogu systemowego, do którego ma zostać zapisane lub przeniesione zdjęcie -->
        <image_external_id>kkk_111_iii_111</image_external_id> <!-- zewnętrzny identyfikator zdjęcia, opcjonalnie -->
        <active>1</active> <!-- możliwość ustawienia statusu zdjęcia (1 = aktywne, 0 = nieaktywne) -->
        <weight>1</weight> <!-- możliwość zarządzania kolejnością (1 = zdjęcie główne, 2,3,4... = kolejne zdjęcia) -->
        <allegro>1</allegro> <!-- czy zdjęcie ma być użyte przy wystawianiu aukcji Allegro (1 = tak, 0 = nie) -->
        <allegro_miniature>0</allegro_miniature> <!-- wymuszanie zdjęcia jako miniatury na aukcjach Allegro (1 = tak, 0 = nie) -->
        <google_merchant>1</google_merchant> <!-- czy zdjęcie ma być widoczne w danych dla GMC (1 = tak, 0 = nie) -->
        <facebook_merchant>1</facebook_merchant> <!-- czy zdjęcie ma być widoczne w danych dla Facebook Feed (1 = tak, 0 = nie) -->
        <stores_by_id>1,3</stores_by_id> <!-- id wybranych sklepów (multistore), w których ma być widoczne zdjęcie -->
    </product_image>
    <product_image> <!-- usuwanie zdjęcia wskazanego nazwą pliku (niezalecane) -->
        <code>kkk_111</code> <!-- w tym trybie usuwania wymagane jest zidentyfikowanie produktu -->
        <image_name>sdfd_0.jpg</image_name>
        <deleted>1</deleted> <!-- dyspozycja skasowania zdjęcia -->
    </product_image> <!-- usuwanie zdjęcia wskazanego nadanym wcześniej identyfikatorem zewnętrznym (zalecane) -->
    <product_image>
        <image_external_id>kkk_111_iii_000</image_external_id>
        <deleted>1</deleted>
    </product_image>
    <product_image>
        <product_external_id>410522</product_external_id> <!-- identyfikator zewnętrzny - alternatywna identyfikacja towaru -->
        <no_content>1</no_content>
        <image_name>sdfd_5.jpg</image_name>
    </product_image>
</product_images>

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$xml = '<product_images>';
$xml .= '<product_image>';
$xml .= '<code>aiudhaw</code>';
$xml .= '<no_content>1</no_content>';
$xml .= '<image_name>plik.jpg</image_name>';
$xml .= '</product_image>';
$xml .= '</product_images>';
$message = array('xml' => $xml);
$response = $client->SetProductsImages($authenticate, $message);
echo $response;

Dane zwracane: 

OK

Uwagi:
– dopuszczane są tylko media o rozszerzeniach jpg, jpeg, png, gif, pdf, flv, swf, mov, xml, doc, zip; rozszerzenia te powinny być podane jawnie w nazwach plików,
– nazwa pliku może zostać automatycznie zmieniona, jeśli na serwerze istnieje już inny plik o tej samej nazwie lub jeśli identyczne zdjęcie zostało wcześniej przypisane do innego towaru (różne produkty nie mogą wspólnie używać tego samego pliku),
– to samo zdjęcie przypisywane do tego samego produktu pod zmienioną nazwą pliku jest rozponawane po jego zawartości – nie zostanie dodane ponownie ani nadpisane,
– z wymienionych wyżej powodów niezalecane jest usuwanie zdjęć za pomocą nazwy pliku, chyba że istnieje pewność, że wszystkie zdjęcia mają unikalne nazwy plików,
– znacznik <dir> nie pozwala na obsłużenie własnej struktury podkatalogów na serwerze FTP – wszystkie zdjęcia, które będą wskazywane nazwą pliku, powinny być umieszczone w jednym katalogu: /media/products; znacznik ten sugeruje docelową lokalizację zdjęcia i jest niezalecany, ponieważ w przypadku jego braku system sam wykonuje katalogowanie.

GetLandingPage

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
codetakstringkod Landing Page

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$response = $client->GetLandingPage($authenticate, 'landing-page-strona-testowa');
header('Content-Type: application/xml');
echo $response;

Dane zwracane + komentarze: 

<landing_page>
    <name>
        <![CDATA[Testowy]]>
    </name>
    <name lang="bul">
        <![CDATA[Testowy]]>
    </name>
    <name lang="cze">
        <![CDATA[Testowy]]>
    </name>
    <name lang="hun">
        <![CDATA[Testowy]]>
    </name>
    <url>https://demo.atomstore.pl/testowy</url>
    <url lang="cze">http://https://demo.atomstore.pl/cs/testowy</url>
    <url lang="bul">https://demo.atomstore.pl/bg/testowy</url>
    <url lang="hun">https://demo.atomstore.pl/hu/testowy</url>
    <description>
        <![CDATA[<p>#survey-4#</p>]]>
    </description>
    <banners>
        <banner>
            <id>1</id>
            <source_url>https://demo.atomstore.pl/img/pictures/2_kobiety_mobile(1).png</source_url>
            <target_url></target_url>
        </banner>
        <banner>
            <id>16</id>
            <source_url>https://demo.atomstore.pl/img/pictures/Screenshot.png</source_url>
            <target_url></target_url>
        </banner>
    </banners>
    <product_filter>
        <name>
            <![CDATA[kolekcja]]>
        </name>
        <url>https://demo.atomstore.pl/wszystkie-produkty</url>
    </product_filter>
</landing_page>

Uwagi:
– W zależności od tego czy do Landing Page przypisane są produkty (tag <product>) czy dynamiczna lista (tag <product_filter>) taki tag się pojawi

SetVouchers

Dodawanie/modyfikowanie bonów rabatowych. 

Parametry wejściowe:

nazwaobowiązkowytypdomyślnieopis
authenticatetakauthstruktura składająca się z pól 'login’ i 'password’
messagetakmessagestruktura zawierająca pole 'xml’, które powinno zawierać ciąg znaków w formacie XML; opis formatu poniżej

Format XML + komentarze:

<vouchers>
    <voucher>
        <name><![CDATA[Bon powrót do szkoły]]></name> <!-- Nazwa bonu w języku domyślnym -->
        <name lang="eng"><![CDATA[Back to school voucher]]></name>
        <value>100,00</value> <!-- Wartość bonu -->
        <codes>
            <code expires="2023-02-14 23:00:00">3a98fah3vhv8hv3v</code>
            <code value="150,00" used="30,99" expires="2023-01-31">oa2dfoahfoah2f</code>
        </codes>
    </voucher>
    <voucher>
        <name><![CDATA[Bon nowy rok]]></name> <!-- Nazwa bonu w języku domyślnym -->
        <delete>1</delete> <!-- Usunięcie Bonu -->
    </voucher>
</vouchers>

Przykładowe wywołanie (PHP): 

$client = new SoapClient('http://demo.atomstore.pl/atom_api/wsdl/atom_api');
$authenticate = array('login' => 'admin', 'password' => 'admin');
$xml = '<vouchers>
    <voucher>
        <name><![CDATA[Bon powrót do szkoły]]></name>
        <name lang="eng"><![CDATA[Back to school voucher]]></name>
        <value>100,00</value>
        <codes>
            <code expires="2023-02-14 23:00:00">3a98fah3vhv8hv3v</code>
            <code value="150,00" used="30,99" expires="2023-01-31">oa2dfoahfoah2f</code>
        </codes>
    </voucher>
</vouchers> ';
 
$message = array('xml' => $xml);
$response = $client->SetVouchers($authenticate, $message);
echo $response;

Dane zwracane: 

OK

Uwagi:
– rozpoznawanie istniejącego bonu odbywa się za pomocą domyślnego tagu <name> 
– kody rabatowe (tag <codes>) które nie zostaną przesłane w XML zostaną usunięte.