Skip to main content
Skip table of contents

Magento Schnittstelle

Inhalt

Export

Der Initialexport erfolgt über CSV-Dateien, welche vom Magento-Shop von einem FTP-Server geladen werden. Die Dateien haben immer eine Kennung im Dateinamen, ob die Datei bereits vollständig hochgeladen wurde. Ist die Datei vollständig hochgeladen, so wird dem Dateinamen die Endung _finished angefügt.

Die Exporte werden grundsätzlich einmal täglich ausgeführt. Hier werden die veränderten Artikel selektiert, welche der in der Konfiguration angegebenen where-Bedingung (siehe Kapitel 4 Konfiguration auf Seite ) entsprechen.

Die Überschriften in der CSV-Datei werden in Kleinbuchstaben und ohne Leerzeichen ausgegeben. Das Zellenbegrenzungszeichen (doppeltes Hochkomma) wird immer angegeben.

Artikelexport

Der Artikelexport wird auch dann ausgeführt, wenn eine Preisänderung an den Magento-Shop über einen Artikel gemeldet wird, welcher nicht existiert. Das Schnittstellenprogramm exportiert dann umgehend alle fehlenden Artikel des Abgleichdurchlaufs. Der Magento-Shop kontrolliert jede Minute auf neue Dateien und importiert diese sofort.

Dateiaufbau

Die Benennung der Datei erfolgt durch den konstanten Text ExportItems gefolgt von einem Zeitstempel. Für eine Datei welche am 01. April 1996 um 23.45 Uhr hochgeladen wird, bzw. wurde, lautet der Dateiname wie folgt: ExportItems_19960401_2345.csv, bzw. ExportItems_19960401_2345.

Für einen Artikel können mehrere Zeilen angegeben werden:

  • Eine Zeile pro Website, bzw. Store-View.
  • Eine Zeile zusätzlich mit einer beliebigen Website, bzw. Store-View für jedes zusätzliche Artikelbild.

Nachfolgend die enthaltenen Spalten mit dem etwaigen Spaltennamen aus dem Artikelstamm und der Beschreibung:

Spaltenname

Spalte

Beschreibung

sku

ARTIKELNUMMER

Die Artikelnummer.

name

BEZEICHNUNG1

Die Produktbezeichnung.

name2

BEZEICHNUNG2

Die Produktbezeichnung 2.

manufacturer

HERSTELLER

Der Hersteller in Großbuchstaben. Folgende Sonderzeichen warden durch Unterstriche ersetzt: \, /, !, ., COMMA, &, %, BLANK, ?, $, §, „. Umlaute werden ebenfalls ersetzt: Ä durch AE, Ü durch UE und Ö durch OE.

weight

BRUTTOGEWICHT

Das Bruttogewicht.

price

VK

Der Verkaufspreis.

base_price


Der Grundpreis.

qty

LAGERBESTAND

Der gesamte Lagerbestand aller WebShop-lager.

delivery_time

LIEFERZEIT

Die Lieferzeit.

meta_keyword

SUCHBEZEICHNUNG

Die Suchbezeichnung.

description

LANGTEXT

Der Langtext.

Der Langtext wird standardmäßig aus der Tabelle ARTIKELSTAMM Spalte LANGTEXT selektiert.

Der Wert des Langtextes kann über das Einstellungsfenster im LC.Interfaces - Magento - Artikelexport überschrieben werden. Wichtig: In der XML Konfiguration muss das Tag <LongtextSQL></LongtextSQL> vorhanden sein.

Fixwert (Muss mit einfachen Hochkomma angegeben werden): Beispiel: 'FIXWERT'

SQL Statement: Der Langtext kann auch aus einer anderen Tabelle selektiert werden. Wird ein SQL Statement angegeben, muss dieses in Klammern () gesetzt werden.

Beispiel:  (select t.text from zusatztexte t where t.dok_typ=1 and t.dok_inx=<a.NUMMER> and t.bezeichnung='LANGTEXT') - (Kein Strichpunkt am Ende des Statements!)

Es kann auf alle Spalten des Artikelstamms mit dem Alias a.<SPALTENNAME> zugegriffen werden.

image


Der Bildname.

small_image


Der Bildname.

thumbnail


Der Bildname.

ean_code

EAN_NR

Die EAN-Nummer.

store


Die Website.

website


Die WebSite.

attribute_set


Normal das Kürzel der Suchbezeichnung in Kleinbuchstaben gefolgt von einem Unterstrich und der Bezeichnung der Suchkategorie, wobei die Leerzeichen durch Unterstriche ersetzt werden, sonst Default.

type


Normal simple, außer für Artikelart L ugiftcert.

pollex_upselling_links


Die Artikelnummern der Upselling-Artikel durch Komma getrennt.

pollex_accessories_links


Die Artikelnummern der Zubehörartikel durch Komma getrennt.

pollex_category_ids


Eine durch Komma getrennte Zeichenkette von Hauptgruppen-, Sortiment-, Gruppen- und Reihennummer.

meta_title

BEZEICHNUNG1

Die Produktbezeichnung.

meta_description

LANGTEXT

Der Langtext.

thumbnail_label

BEZEICHNUNG1

Bildunterschrift des Vorschaubildes.

small_image_label

BEZEICHNUNG1

Bildunterschrift des kleinen Artikelbildes.

image_label

BEZEICHNUNG1

Bildunterschrift des Artikelbildes.

short_description

INFOTEXT

Infotext aus Artikelstamm.

status


Wenn ein Sonderpreis für den Artikel hinterlegt wurde Enabled, sonst Disabled.

tax_class_id


Für UST-Code 1 tax_reduced, sonst tax_full.

visibility


Immer Catalog, Search.

is_in_stock


True, wenn der Lagerbestand größer 0 ist, sonst false.

product_name

BEZEICHNUNG1

Die Produktbezeichnung.

pollex_special_attributes


Die Sonderprofilierungskriterien durch Komma getrennt.

ugifcert_amount_config


Der Gutscheinwert.

url_key


Der qualifizierte Produktname aus BEZEICHNUNG1 gebildet.

gross_price


Der Preis inklusive MwSt.

gross_base_price


Der Grundpreis inklusive MwSt.

attribut


Für jedes Profilierungskriterium wird eine Spalte angehängt, wobei alle Leerzeichen in der Spaltenüberschrift durch einen Unterstrich ersetzt werden.

stock_name


Für jedes Lager, außer dem Versandlager wird eine Spalte angehängt, welche aus stock_ und dem Ort des Lagers besteht.

Profilierungskriterien

Profilierungskriterien für den Artikelexport:

  • #01: Upsellingartikel. Artikelnummern durch Komma getrennt.

Lagerbestände

Die einzelnen Lagerbestände werden für die einzelnen Lager getrennt angegeben. Dabei wird das Versandlager über die Spalte qty angegeben. Die einzelnen Abholshops werden als zusätzliches Attribut angegeben. Zum Beispiel stock_wien für den Abholshop in Wien. Wichtig für die Bildung des Spaltennamens ist der Eintrag in der Spalte ORT der Tabelle LAGER.

Kundenexport

Der Kundenexport wird nur Initial ausgeführt, um die bestehenden Kunden im ERP-System im Magento-Shop anzulegen. Es werden keine Adressdaten gesendet, da der Kunde seine Liefer- und Rechnungsadressen im Magento-Shop selbst verwaltet.

Ist ein Standardansprechpartner vorhanden, so werden Kunden- und Adressdaten von diesem herangezogen, ansonsten werden die Kundenstammdaten verwendet.

Dateiaufbau

Die Benennung der Datei erfolgt durch den konstanten Text ExportCustomers gefolgt von einem Zeitstempel. Für eine Datei welche am 01. April 1996 um 23.45 Uhr hochgeladen wird, bzw. wurde, lautet der Dateiname wie folgt: ExportCustomers_19960401_2345.csv, bzw. ExportCustomers_19960401_2345.

Nachfolgend die enthaltenen Spalten mit dem etwaigen Spaltennamen aus dem Kundenstamm und der Beschreibung:

Spaltenname

Spalte

Beschreibung

pollex_customer_id

NUMMER

Die POLLEX-Kundennummer.

email

EMAIL

Die E-Mail-Adresse.

prefix

ANREDE

Die Anrede.

firstname

NAME1

Der Vorname des Standardansprechpartners, oder der Name1 aus dem Kundenstamm.

lastname

NAME2

Der Nachname des Standardansprechpartners, oder der Name2 aus dem Kundenstamm.

taxvat

UID_CODE

Die Steuernummer.

website


Die Website (Immer base).

password_hash


Ein MD5-Hashwert, welcher mit einem Salt-String versehen ist. Der Salt-String ist eine Zufallszeichenfolge aus einem Großbuchstaben, einem Kleinbuchstaben und einer Zahl, welcher anschließen mit einem Doppelpunkt getrennt an den Hashwert angehängt wird.

billing_firstname


Vorname des Standardansprechpartners.

billing_lastname


Nachname des Standardansprechpartners.

billing_street_full


Straße des Standardansprechpartners.

billing_postcode


Postleitzahl des Standardansprechpartners.

billing_city


Ort des Standardansprechpartners.

billing_country


Land des Standardansprechpartners.

billing_telephone


Telefonnummer des Standardansprechpartners.

billing_fax


Faxnummer des Standardansprechpartners.

billing_company

NAME1

Firmenbezeichnung falls Firmenkunde.

billing_prefix


Anrede und Titel des Standardansprechpartners.

shipping_firstname


Nicht gefüllt.

shipping_lastname


Vorname des Standardansprechpartners.

shipping_street_full


Nachname des Standardansprechpartners.

shipping_postcode


Straße des Standardansprechpartners.

shipping_city


Postleitzahl des Standardansprechpartners.

shipping_country


Ort des Standardansprechpartners.

shipping_postcode


Land des Standardansprechpartners.

shipping_telephone


Telefonnummer des Standardansprechpartners.

shipping_fax


Faxnummer des Standardansprechpartners.

shipping_company

NAME1

Firmenbezeichnung falls Firmenkunde.

shipping_prefix


Anrede und Titel des Standardansprechpartners.

pollex_invoice_address_id


Nicht gefüllt.

pollex_shipment_address_id


Nicht gefüllt.

group_id


Immer General.

group


Immer General.

company

NAME1

Firmenbezeichnung falls Firmenkunde.

dob


Geburtstag des Standardansprechpartners.

Import

WebServices

Über den TaskCenter-Server können nachfolgende Schnittstellen-Methoden genutzt werden.

Bestellungsimport

Methode im MiscService:

public double MagentoImportOrders(string databasename, string servername, string username, string password, string xml, out string xml)

Parameter:

  • Databasename (string): Der Name der Datenbank.
  • Servername (string): Der Servername auf dem die Datenbank läuft.
  • Username (string): Der Benutzername zur Anmeldung an die Datenbank.
  • Password (string): Das Passwort zur Anmeldung an die Datenbank.
  • Xml (string): Die Bestelldaten im XML-Format als Zeichenkette.
  • Ex (string): Fehlermeldung.

Rückgabewert: Die Bestellnummer, welche im Fehlerfall den Wert NaN hat.

Anmerkungen:

  • Versandart: Die Vorgabewerte aus Magento werden in der Zuordnungstabelle UEBERSETZUNGEN den POLLEX Werten zugeordnet.
  • Zahlungsbedingungen: Die Vorgabewerte aus Magento werden in der Zuordnungstabelle UEBERSETZUNGEN den POLLEX Werten zugeordnet.
  • Adressen: Die Rechnungs- und Lieferadresse werden, falls vorhanden, als freie Adresse im Angebot gespeichert.
  • Steuersatz: Wird auch importiert und somit der Nettopreis berechnet.
  • Ein Beispiel-Dokument einer Bestellung im XML-Format ist in Kapitel 7.1 Bestellung im XML-Format auf Seite dargestellt. Es werden nicht alle Angaben und Werte unterstützt.
  • Reparatur "User1" bis "User10" können mitübergeben werden
  • Profilierungen für den Auftrag können wie folgt mitübergeben werden: Profiling_<Name des Kriteriums> - Beispiel: <Profiling_MAGENTO_CUSTOMVALUE_01>

public string MagentoGetOrderPDF(string databasename, string servername, string username, string password, double customerNumber, double orderNumber)

Parameter:

  • Databasename (string): Der Name der Datenbank.
  • Servername (string): Der Servername auf dem die Datenbank läuft.
  • Username (string): Der Benutzername zur Anmeldung an die Datenbank.
  • Password (string): Das Passwort zur Anmeldung an die Datenbank.
  • CustomerNumber (double): Die Kundennummer.
  • OrderNumber (double): Die Bestellnummer.

Rückgabewert: Eine Zeichenkette, welche den Link zum PDF der Bestellung enthält.

Anmerkungen:

  • Der Ausgabepfad für das PDF ist der WebService-Pfad mit LC.NET/Company.

Kundenimport

Methoden im MiscService:

public double MagentoImportCustomerData(string databasename, string servername, string username, string password, string csv, out string ex)

Parameter:

  • Databasename (string): Der Name der Datenbank.
  • Servername (string): Der Servername auf dem die Datenbank läuft.
  • Username (string): Der Benutzername zur Anmeldung an die Datenbank.
  • Password (string): Das Passwort zur Anmeldung an die Datenbank.
  • Csv (string): Die Kundendaten im CSV-Format als Zeichenkette.

Rückgabewert: Die Kundennummer des neu angelegten, bzw. aktualisierten Kunden. Im Fehlerfall wird -1 zurückgegeben.

Aufbau CSV:

  • pollex_customer_id (für neuen Kunden leer)
  • website
  • email
  • prefix
  • firstname
  • lastname
  • taxvat
  • gender
  • is_subscribed
  • password (optional)

public double MagentoImportCustomerShippingAddress(string databasename, string servername, string username, string password, string csv, out string ex)

Parameter:

  • Databasename (string): Der Name der Datenbank.
  • Servername (string): Der Servername auf denen die Datenbank läuft.
  • Username (string): Der Benutzername zur Anmeldung an die Datenbank.
  • Password (string): Das Passwort zur Anmeldung an die Datenbank.
  • Csv (string): Die Daten der Lieferadresse im CSV-Format als Zeichenkette.

Rückgabewert: Die Nummer der neu angelegten, bzw. aktualisierten Lieferadresse. Im Fehlerfall wird -1 zurückgegeben.

Aufbau CSV:

  • pollex_customer_id (optional für bestehende Adresse)
  • pollex_shipment_address_id (für neue Adresse leer)
  • shipping_firstname
  • shipping_lastname
  • shipping_street_full
  • shipping_city
  • shipping_country
  • shipping_postcode

public double MagentoImportCustomerBillingAddress(string databasename, string servername, string username, string password, string csv, out string ex)

Parameter:

  • Databasename (string): Der Name der Datenbank.
  • Servername (string): Der Servername auf dem die Datenbank läuft.
  • Username (string): Der Benutzername zur Anmeldung an die Datenbank.
  • Password (string): Das Passwort zur Anmeldung an die Datenbank.
  • Csv (string): Die Daten der Rechnungsadresse im CSV-Format als Zeichenkette.

Rückgabewert: Die Kundennummer des aktualisierten Kunden. Im Fehlerfall wird -1 zurückgegeben.

Aufbau CSV:

  • pollex_customer_id (optional für bestehende Adresse)
  • pollex_invoice_address_id (für neue Adresse leer)
  • billing_firstname
  • billing_lastname
  • billing_street_full
  • billing_city
  • billing_country
  • billing_postcode

Live-Bestände

Die Aktualisierung erfolgt über Trigger. Diese fügen Daten bei Änderungen der Tabellen SONDERPREISE, LAGERBESTAND, ANGEBOTE und LIEFERSCHEIN in die Tabelle MAGENTO_UPDATE ein. Die Behandlung der eingefügten Daten erfolgt über LC.Interfaces.

Wird ein Artikel beim Aktualisieren nicht im Magento-Shop gefunden, so wird sofort eine CSV-Exportdatei für alle fehlenden Artikel des Abarbeitungsdurchgangs erstellt. Dies wird für die entsprechenden Einträge in der Tabelle MAGENTO_UPDATE vermerkt und so werden die Artikel beim nächsten Abarbeitungsdurchgang wieder überprüft.

Trigger

Es werden für folgende Tabellen Trigger benötigt: SONDERPREISE, LAGERBESTAND, ANGEBOTE, LIEFERSCHEINE und VORSCHLAGSARTIKEL.

Tabelle SONDERPREISE

SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento_item_update' and type = 'TR')
drop trigger trg_magento_item_update
GO
CREATE TRIGGER trg_magento_item_update
ON sonderpreise
AFTER UPDATE
AS
IF (UPDATE(sonderpreis_inkl) OR UPDATE(web))
BEGIN
insert into magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
select 0, i.artikelnummer, GetDate(), suser_name(), null, '', 1, i.sonderpreis_inkl, '', i.oe from inserted i, artikelstamm a where a.artikelnummer = i.artikelnummer and a.show_net = 1 and i.code = 14 and i.web = 1
insert into magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
select 0, i.artikelnummer, GetDate(), suser_name(), null, '', 4, i.sonderpreis_inkl, '', i.oe from inserted i, artikelstamm a where a.artikelnummer = i.artikelnummer and i.code = 14 and isnull(i.web, 0) = 0
END
IF EXISTS (select name from sysobjects where name = 'trg_magento_item_new' and type = 'TR')
drop trigger trg_magento_item_new
GO
CREATE TRIGGER trg_magento_item_new
ON sonderpreise
AFTER INSERT
AS
BEGIN
insert into magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
select 0, i.artikelnummer, GetDate(), suser_name(), null, '', 3, i.sonderpreis_inkl, '', i.oe from inserted i, artikelstamm a where a.artikelnummer = i.artikelnummer and a.show_net = 1 and i.code = 14 and i.web = 1
END
IF EXISTS (select name from sysobjects where name = 'trg_magento_item_delete' and type = 'TR')
drop trigger trg_magento_item_delete
GO
CREATE TRIGGER trg_magento_item_delete
ON sonderpreise
AFTER DELETE
AS
BEGIN
insert into magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
select 0, artikelnummer, GetDate(), suser_name(), null, '', 4, sonderpreis_inkl, '', oe from deleted where code = 14
END
Der obige Trigger trg_magento_item_delete wird auf alle Artikel angewandt und nicht nur auf WebShop-Artikel, da der Artikel bei der Pflege bereits die WebShop-Eigenschaft verlieren könnte und erst später seinen Preis. Dadurch würde der Trigger dann nicht mehr auf diese Preislöschung reagieren.
CREATE TRIGGER trg_magento_special_price
ON sonderpreise
AFTER INSERT, UPDATE
AS
IF (UPDATE(sonderpreis) OR UPDATE(von) OR UPDATE(auf))
BEGIN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT 0, i.artikelnummer, GetDate(), suser_name(), NULL, '', 11, i.sonderpreis, '', i.oe FROM inserted i, artikelstamm a WHERE a.artikelnummer = i.artikelnummer AND a.show_net = 1 AND i.code = 4
END

Tabelle LAGERBESTAND

SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento_stock' and type = 'TR')
drop trigger trg_magento_stock
GO
CREATE TRIGGER trg_magento_stock
ON lagerbestand
AFTER INSERT, UPDATE
AS
IF (UPDATE(bestand) OR UPDATE(off_auf))
BEGIN
insert into magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
select distinct 0, i.artnr, GetDate(), suser_name(), null, '', 2, i.lager, '', null from inserted i, artikelstamm a where i.artnr = a.artikelnummer and a.show_net = 1 and i.lager in (1,5,6,7,8,11,10,14,15) and not (select sum(b.bestand) from lagerbestand b where b.artnr = i.artnr and b.lager = i.lager) = (select sum(d.bestand) from deleted d where d.artnr = i.artnr and d.lager = i.lager and isnull(d.lagerort, -1) = isnull(i.lagerort, -1)) order by i.artnr, i.lager
END


Oracle:

CREATE OR REPLACE TRIGGER trg_magento_stock
AFTER INSERT OR UPDATE ON lagerbestand
FOR EACH ROW
BEGIN
IF (NVL(:old.bestand, 0) != NVL(:new.bestand, 0) OR NVL(:old.off_auf, 0) != NVL(:new.off_auf, 0)) THEN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT DISTINCT 0, :new.artnr, SYSDATE, USER, null, '', 2, :new.lager, '', null FROM artikelstamm a WHERE a.artikelnummer = :new.artnr AND (a.show_net = 1 OR EXISTS (SELECT '' FROM artikelstamm WHERE show_net = 1 AND artikelnummer IN (SELECT listennummer FROM artikellisten WHERE artikelnummer = :new.artnr)));
END IF;
END;
Trigger für SET-Artikel

SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento_stock' and type = 'TR')
drop trigger trg_magento_stock
GO
CREATE TRIGGER trg_magento_stock
ON lagerbestand
AFTER INSERT, UPDATE
AS
IF (UPDATE(bestand) OR UPDATE(off_auf))
BEGIN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT DISTINCT 0, i.artnr, GetDate(), suser_name(), GetDate(), suser_name(), 2, i.lager, '', NULL FROM inserted i, artikelstamm a WHERE i.artnr = a.artikelnummer AND a.show_net = 1 AND i.lager in (1,2,4,5,6,7,8,11,10,14,15,19) ORDER BY i.artnr, i.lager;
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT DISTINCT 0, a.artikelnummer, GetDate(), suser_name(), GetDate(), suser_name(), 2, i.lager, '', NULL FROM inserted i, artikelstamm a, artikellisten l WHERE a.artikelnummer = l.artikelnummer AND i.artnr = l.listennummer AND l.art IS NULL AND a.show_net = 1 AND i.lager IN (1,2,4,5,6,7,8,11,10,14,15,19) ORDER BY a.artikelnummer, i.lager
END


Oracle: Wird durch normalen Lagerbestands-Trigger vorgenommen.

Das Versandlager wird mit dem WebService catalogInventoryStockItemUpdate aktualisiert, die Abholshops mit dem WebService catalogProductUpdate.

Tabelle ANGEBOTE

TRG_MAGENTO_ORDER_COMPLETED

SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento _order_completed' and type = 'TR')
drop trigger trg_magento_order_completed
GO
CREATE TRIGGER trg_magento_order_completed
ON angebote
AFTER UPDATE
AS
IF (UPDATE(gel_anzahlung))
BEGIN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT 0, '', GetDate(), suser_name(), null, '', 5, 0, bestellnummer, mdtnr FROM inserted WHERE web_auftrag = 1 AND gel_anzahlung = gesamtvkbtto
END


Oracle:

CREATE OR REPLACE TRIGGER trg_magento_order_completed
AFTER UPDATE ON angebote
FOR EACH ROW
BEGIN
IF (NVL(:old.gel_anzahlung, 0) != NVL(:new.gel_anzahlung, 0) AND NVL(:new.web_auftrag, 0) = 1 AND :new.gel_anzahlung = :new.gesamtvkbtto) THEN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
VALUES (0, '', SYSDATE, USER, null, '', 5, 0, :new.bestellnummer, :new.mdtnr);
END IF;
END;
TRG_MAGENTO_ORDER_CANCELLED

SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento_order_cancelled' and type = 'TR')
drop trigger trg_magento_order_cancelled
GO
CREATE TRIGGER trg_magento_order_cancelled
ON angebote
AFTER UPDATE
AS
IF (UPDATE(erledigt) OR UPDATE(ABRUFCODE))
BEGIN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT 0, '', GetDate(), suser_name(), null, '', 7, 0, bestellnummer, mdtnr from inserted where web_auftrag = 1 and isnull(erledigt, 0) = 1 and abrufcode = 'STORNIERT'
END


Oracle:

CREATE OR REPLACE TRIGGER trg_magento_order_cancelled
AFTER UPDATE ON angebote
FOR EACH ROW
BEGIN
IF ((NVL(:old.erledigt, 0) != NVL(:new.erledigt, 0) OR NVL(:old.abrufcode, '') != NVL(:new.abrufcode, '')) AND NVL(:new.web_auftrag, 0) = 1 AND NVL(:new.erledigt, 0) = 1 AND :new.abrufcode = 'STORNIERT') THEN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
VALUES (0, '', SYSDATE, USER, null, '', 7, 0, :new.bestellnummer, :new.mdtnr);
END IF;
END;
TRG_MAGENTO_ORDER_PICKUP_READY

SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento_order_pickup_ready' and type = 'TR')
drop trigger trg_magento_order_pickup_ready
GO
CREATE TRIGGER trg_magento_order_pickup_ready
ON angebote
AFTER UPDATE
AS
IF (UPDATE(erledigt) OR UPDATE(ABRUFCODE))
BEGIN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT 0, '', GetDate(), suser_name(), null, '', 9, 0, bestellnummer, mdtnr FROM inserted WHERE web_auftrag = 1 and isnull(erledigt, 0) = 1 and abrufcode = 'ABHOLBEREIT'
END


Oracle:

CREATE OR REPLACE TRIGGER trg_magento_order_pickup_ready
AFTER UPDATE ON angebote
FOR EACH ROW
BEGIN
IF ((NVL(:old.erledigt, 0) != NVL(:new.erledigt, 0) OR NVL(:old.abrufcode, '') != NVL(:new.abrufcode, '')) AND NVL(:new.web_auftrag, 0) = 1 AND NVL(:new.erledigt, 0) = 1 AND :new.abrufcode = 'ABHOLBEREIT') THEN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
VALUES (0, '', SYSDATE, USER, null, '', 9, 0, :new.bestellnummer, :new.mdtnr);
END IF;
END;
TRG_MAGENTO_ORDER_COMMENT

SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento_order_comment' and type = 'TR')
drop trigger trg_magento_order_order_comment
GO
CREATE TRIGGER trg_magento_order_comment
ON angebote
AFTER UPDATE
AS
IF (UPDATE(erledigt) OR UPDATE(abrufcode) OR UPDATE(versandinfo))
BEGIN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT 0, '', GETDATE(), SUSER_NAME(), NULL, '', 10, 0, bestellnummer, mdtnr FROM inserted WHERE web_auftrag = 1 AND ISNULL(erledigt, 0) = 1 AND ISNULL(abrufcode, '') != '' AND ISNULL(versandinfo, '') != ''
END


Oracle:

CREATE OR REPLACE TRIGGER trg_magento_order_comment
AFTER UPDATE ON angebote
FOR EACH ROW
BEGIN
IF ((NVL(:old.erledigt, 0) != NVL(:new.erledigt, 0) OR NVL(:old.abrufcode, '') != NVL(:new.abrufcode, '') OR NVL(:old.versandinfo, '') != NVL(:new. versandinfo, '')) AND NVL(:new.web_auftrag, 0) = 1 AND NVL(:new.erledigt, 0) = 1 AND NVL(:new.abrufcode, '') != '' AND NVL(:new.versandinfo, '') != '') THEN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
VALUES (0, '', SYSDATE, USER, null, '', 10, 0, :new.bestellnummer, :new.mdtnr);
END IF;
END;

Tabelle LIEFERSCHEINE

SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento_item_order_completed' and type = 'TR')
drop trigger trg_magento_delivery_sent
GO
CREATE TRIGGER trg_magento_delivery_sent
ON lieferscheine
AFTER UPDATE
AS
IF (UPDATE(erledigt))
BEGIN
insert into magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
select 0, '', GetDate(), suser_name(), null, '', 6, 0, a.bestellnummer, i.mdtnr from inserted i, angebote a where a.web_auftrag = 1 and i.erledigt = 1 and a.angebotsnummer in (select top 1 p.auftragsnummer from lspositionen p where p.lsindex = i.inx) and i.mdtnr in (12,15,18)
END

Tabelle VORSCHLAGSARTIKEL

SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento_proposal_new' and type = 'TR')
drop trigger trg_magento_proposal_new
GO
CREATE TRIGGER trg_magento_proposal_new
ON vorschlagsartikel
AFTER INSERT, UPDATE
AS
BEGIN
update artikelstamm set md = GetDate(), mu = suser_sname() where artikelnummer in (select distinct i.vorschlagsartikel from inserted i)
END
SQL-Server:
IF EXISTS (select name from sysobjects where name = 'trg_magento_proposal_delete' and type = 'TR')
drop trigger trg_magento_proposal_delete
GO
CREATE TRIGGER trg_magento_proposal_delete
ON vorschlagsartikel
AFTER DELETE
AS
BEGIN
update artikelstamm set md = GetDate(), mu = suser_sname() where artikelnummer in (select distinct d.vorschlagsartikel from deleted d)
END

Tabelle ARTIKELSTAMM

SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento_item_show_net' and type = 'TR')
DROP TRIGGER trg_magento_item_show_net
GO
CREATE TRIGGER trg_magento_item_show_net
ON artikelstamm
AFTER UPDATE
AS
IF (UPDATE(show_net))
BEGIN
UPDATE sonderpreise SET web = 0 WHERE code = 14 AND artikelnummer IN (SELECT DISTINCT i.artikelnummer FROM inserted i, deleted d WHERE i.artikelnummer = d.artikelnummer AND ISNULL(i.show_net, 0) = 0 AND NOT i.show_net = d.show_net)
END

Tabelle ARTIKELSTAMM

Dieser Trigger legt automatisch einen Eintrag in Tabelle Sonderpreise und in Tabelle Unterbietung an. Als Minimalpreis wird Kalkulationspreis + Mindestdeckungsbeitrag eingetragen (OE muss im Trigger eingestellt werden)

SQL-Server:

IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'trg_magento_artikelstamm_update' AND type = 'TR')
DROP TRIGGER trg_magento_artikelstamm_update
GO
create trigger
trg_magento_artikelstamm_update
on artikelstamm
for insert, update
as
declare @artikelnummer varchar(20)
declare @existsUnterbietung smallint
declare @existsSonderpreise smallint
declare @mindestBetrag float;
declare @spinx float
declare myCursor cursor local forward_only
for select artikelnummer from inserted
open myCursor
fetch next from myCursor into @artikelnummer
while @@fetch_status = 0
begin
select @mindestBetrag=isNull(kalkulationspreis,0) +
isNull(kalkulationspreis,0)*isNull(mdb,0)/100 from artikelstamm
where artikelnummer=@artikelnummer
if (@mindestBetrag<=0)
begin
select @mindestBetrag=vk*1.2 from artikelstamm where artikelnummer=@artikelnummer
end
select @existsSonderpreise = count(*) from sonderpreise where code=14 and oe=4
and artikelnummer=@artikelnummer
if (@existsSonderpreise = 0)
begin
/* Kein Eintrage in WebShop-Artikel je OE vorhanden -> neuen Eintrag einfügen*/
update indizes set spinx=spinx+1
select @spinx=spinx from indizes
insert into sonderpreise(artikelnummer,code,inx,ltz_aend,meh,oe, sonderpreis_inkl,topangebot,web)
select artikelnummer,14,@spinx,getdate(),mengeneinheit,4, vk*1.2, 0,1 from inserted
end
select @existsUnterbietung = count(*) from unterbietung where artikelnummer = @artikelnummer
if (@existsUnterbietung = 0)
begin
/* Noch kein Eintrag in Unterbietung - diesen erstellen*/
insert into unterbietung(artikelnummer,oe,preisgrenze)
select artikelnummer,4,@mindestBetrag from inserted
end
if (@existsUnterbietung > 0)
begin
/* Bereits Eintrag in Unterbietung vorhanden - diesen aktualisieren*/
update unterbietung set preisgrenze=@mindestBetrag where
artikelnummer=@artikelnummer
end
fetch next from myCursor into @artikelnummer
end
close myCursor;
deallocate myCursor;

Tabelle WARENKORB

SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento_basket_insert' and type = 'TR')
DROP TRIGGER trg_magento_basket_insert
GO
CREATE TRIGGER trg_magento_basket_insert
ON warenkorb
AFTER INSERT
AS
BEGIN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT DISTINCT 0, i.artikelnummer, GetDate(), suser_name(), NULL, '', 2, i.lager, '', NULL FROM inserted i, artikelstamm a WHERE i.artikelnummer = a.artikelnummer AND a.show_net = 1 AND i.lager IN (1,11,21) ORDER BY i.artnr, i.lager
END
SQL-Server:
IF EXISTS (select name from sysobjects where name = 'trg_magento_basket_update' and type = 'TR')
DROP TRIGGER trg_magento_basket_update
GO
CREATE TRIGGER trg_magento_basket_update
ON warenkorb
AFTER INSERT
AS
IF (UPDATE(menge))
BEGIN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT DISTINCT 0, i.artikelnummer, GetDate(), suser_name(), NULL, '', 2, i.lager, '', NULL FROM inserted i, artikelstamm a WHERE i.artikelnummer = a.artikelnummer AND a.show_net = 1 AND i.lager IN (1,11,21) AND NOT (SELECT SUM(d.menge) FROM deleted d WHERE d.artikelnummer = i.artikelnummer AND d.lager = i.lager) = (SELECT SUM(w.menge) FROM warenkorb w WHERE w.artikelnummer = i.artikelnummer AND w.lager = i.lager) ORDER BY i.artnr, i.lager
END
SQL-Server:
IF EXISTS (select name from sysobjects where name = 'trg_magento_basket_delete' and type = 'TR')
DROP TRIGGER trg_magento_basket_delete
GO
CREATE TRIGGER trg_magento_basket_delete
ON warenkorb
AFTER DELETE
AS
BEGIN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT DISTINCT 0, d.artikelnummer, GetDate(), suser_name(), NULL, '', 2, d.lager, '', NULL FROM deleted d, artikelstamm a WHERE d.artikelnummer = a.artikelnummer AND a.show_net = 1 AND d.lager in (1,11,21) ORDER BY d.artnr, d.lager
END

Das Versandlager wird mit dem WebService catalogInventoryStockItemUpdate aktualisiert, die Abholshops mit dem WebService catalogProductUpdate.

Tabelle BEX_NVE

Der Trigger informiert den Magento-WebShop über die Änderung eines Paket-Status.

SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento_trackinglink' and type = 'TR')
DROP TRIGGER trg_magento_trackinglink
GO
CREATE TRIGGER trg_magento_trackinglink
ON bex_nve
AFTER INSERT
AS
BEGIN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT 0, '', GetDate(), suser_name(), null, '', 8, 0, l.bestellnummer, l.mdtnr FROM inserted i, lieferscheine l WHERE i.lsindex = l.inx AND (datalength(l.bestellnummer) = 9 OR (datalength(l.bestellnummer) > 9 AND l.bestellnummer LIKE '%-%'))
END


Oracle:

CREATE OR REPLACE TRIGGER trg_magento_trackinglink
AFTER INSERT ON bex_nve
FOR EACH ROW
BEGIN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT 0, '', SYSDATE, USER, null, '', 8, 0, l.bestellnummer, l.mdtnr FROM lieferscheine l WHERE l.inx = :new.lsindex AND (length(l.bestellnummer) = 9 OR (length(l.bestellnummer) > 9 AND l.bestellnummer LIKE '%-%'));
END;

PowerPay Bezahlung

Der Trigger informiert den Magento-WebShop über die Anlage des Lieferscheins zur Abbuchung des PowerPay Rechnungsbetrages.
SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento_powerpay_capture' and type = 'TR')
DROP TRIGGER trg_magento_powerpay_capture
GO
CREATE TRIGGER trg_magento_powerpay_capture
ON lieferscheine
AFTER INSERT,UPDATE
AS
BEGIN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT 0, '', GetDate(), suser_name(), null, '', 14, 0, i.bestellnummer, i.mdtnr FROM inserted i, angebote a, lspositionen p, WHERE i.inx = p.lsindex AND p.auftragsnummer = a.angebotsnummer AND a.ap in (400,401)
END

Abholung abgeschlossen

SQL-Server:

IF EXISTS (select name from sysobjects where name = 'trg_magento_pickup_finished' and type = 'TR')
drop trigger trg_magento_pickup_finished
GO
CREATE TRIGGER trg_magento_pickup_finished
ON angebote
AFTER UPDATE
AS
IF (UPDATE(erledigt))
BEGIN
INSERT INTO magento_update (exportiert, artikelnummer, ad, au, md, mu, typ, wert_num, wert, oe)
SELECT 0, '', GETDATE(), SUSER_NAME(), NULL, '', 15, 0, i.bestellnummer, i.mdtnr FROM inserted i WHERE i.web_auftrag = 1 AND ISNULL(i.erledigt, 0) = 1 AND i.mdtnr in (1) AND i.versandart = 'ABHOLUNG' AND
(EXISTS (SELECT '' from lspositionen lsp where lsp.AUFTRAGSNUMMER = i.angebotsnummer) OR EXISTS (SELECT '' FROM pos_kassenjournal k where bk.vk_belnr=i.angebotsnummer and k.auftragsnummer = i.angebotsnummer))
END

Tabellen

Für die Magento-Schnittstelle sind folgende Tabellen erforderlich.

MAGENTO_UPDATE

Die Tabelle ist wie folgt aufgebaut:

Name

Typ

Größe

Nulls

Bemerkung

ID

FLOAT

8

N

Eindeutiger Index. Wird automatisch generiert.

EXPORTIERT

SMALLINT

2

Y

0 = Unbehandelt
1 = Behandelt
2 = Wird behandelt
3 = Artikel noch nicht im Magento-WebShop vorhanden

ARTIKELNUMMER

CHAR

20

N

Artikelnummer

AD

TIMESTMP

10

Y

Datum/Uhrzeit wann der Datensatz angelegt wurde.

AU

CHAR

30

Y

Benutzer (LOGIN-KÜRZEL) der den Datensatz angelegt hat.

MD

TIMESTMP

10

Y

Datum der letzten Änderung durch das Schnittstellenprogramm.

MU

CHAR

30

Y

Benutzer (LOGIN-KÜRZEL) der die letzte Änderung durchgeführt hat.

TYP

SMALLINT

2

Y

0 = Keine Auswirkung
1 = Preis aktualisiert
2 = Lagerbestand aktualisiert
3 = Preis eingefügt
4 = Artikel aktivieren/deaktivieren
5 = Anzahlung geleistet
6 = Lieferschein erledigt
7 = Auftrag storniert
8 = TrackingLink eingetragen
9 = Auftrag abholbereit
14 = PowerPay Bezahlung

WERT

CHAR

50

Y

Der aktualisierte Wert.

WERT_NUM

FLOAT

8

Y

Der aktualisierte numerische Wert.

OE

FLOAT

8

Y

Die Nummer der organisatorischen Einheit.

SQL Statement

SQL-Server:

CREATE TABLE magento_update
(
id int identity(1, 1) not null,
exportiert smallint,
artikelnummer varchar(20) not null,
ad datetime,
au varchar(30),
md datetime,
mu varchar(30),
typ smallint,
wert varchar(50),
wert_num float,
oe float
)


Oracle:

CREATE TABLE magento_update
(
id int primary key not null,
exportiert smallint,
artikelnummer varchar2(20) not null,
ad date,
au varchar2(30),
md date,
mu varchar2(30),
typ smallint,
wert varchar2(50),
wert_num float,
oe float
);
CREATE PUBLIC SYNONYM magento_update FOR magento_update;
CREATE SEQUENCE magento_update_seq;
CREATE OR REPLACE TRIGGER trg_magento_update_seq
BEFORE INSERT ON magento_update
FOR EACH ROW
BEGIN
SELECT magento_update_seq.nextval INTO :new.id FROM dual;
END;

MAGENTO_SUCHBAUM

Diese Tabelle enthält die Zuordnung der Profilierungskriterien aus POLLEX zu den Kategorie-IDs aus Magento. Die Tabelle ist wie folgt aufgebaut:

Name

Typ

Größe

Nulls

Bemerkung

POLLEX_KRITERIUM

CHAR

30

N

Der Name des Kriteriums aus PROFKRIT.KRITERIUM.

MAGENTO_BAUM_ID

CHAR

100

Y

Die ID der Kategorie in Magento.

SQL Statement

SQL-Server:


CREATE TABLE magento_suchbaum
(
pollex_kriterium varchar(30) not null,
magento_baum_id varchar(100) not null
)
Oracle:
CREATE TABLE magento_suchbaum
(
pollex_kriterium varchar2(30) not null,
magento_baum_id varchar2(100) not null
);


MY$MAGENTO_STATUSUPDATES

Über die Tabelle MY$MAGENTO_STATUSUPDATES können die Status Codes Status Texte sowie das Kennzeichen ob eine Info an den Kunden gesendet werden soll auf Basis von OE uns Versandart individuell gesteuert werden. Gibt es für einen Type + OE (bzw. wenn OE = leer dann gilt der Eintrag für alle OE's) keinen Eintrag werden die Meldungen anhand der Einstellungen im Fenster an den Shop übermittelt.

Name

Typ

Größe

Nulls

Bemerkung

ID

FLOAT

8

N

Eindeutiger Index. Wird automatisch generiert.

TYP

SMALLINT

2

N

Übereinstimmung mit ID aus Magento-Update
OECHAR30Y"," getrennte Liste von Organisatorischen Einheiten für welche dieser Eintrag gilt. Ist die Spalte leer gilt der eintrag für alle OE's außer es gibt einen spezielleren Eintrag
NOTIFYSMALLINT2NGibt an wie das Kennzeichen Notify (Info an Kunden durch Shop) an Magent übermittelt wird.
SHIPPING_METHODCHAR50YGibt die Versandart an für die dieser Eintrag gilt. Ist keine Versandart angegeben gilt der Eintrag für alle Versandart außer es gibt einen speziellen Eintrag
KOMMENTARCHAR2000YGibt den Kommentar Text an welcher an den Magento Shop übermittelt wird.
STATUSCHAR128YGibt den Status Text an welcher an den Magento Shop übermittelt wird.
TYPE_PARENTCHAR30Y"," getrennte Liste von Typ Werten. Es muss mindestens einer dieser Typ Einträge für den Auftrag bereits ausgeführt worden sein damit der Eintrag ausgeführt wird.
SQL Statement

SQL-Server:

CREATE TABLE my$magento_statusupdates
(
id int identity(1, 1) not null,
typ smallint not null,
oe varchar(30),
notify smallint not null,
shipping_method varchar(50),

kommentar varchar(2000),

status varchar(128),

type_parent varchar(30)
)


Oracle:

CREATE TABLE my$magento_statusupdates
(
id int primary key not null,
typ smallint not null,
oe varchar2(30),
notify smallint not null,

 shipping_method varchar2(50),

kommentar varchar2(2000),

status varchar2(128),

type_parent varchar2(30) );
CREATE PUBLIC SYNONYM my$magento_statusupdates FOR my$magento_statusupdates;
CREATE SEQUENCE my$magento_statusupdates_seq;
CREATE OR REPLACE TRIGGER trg_my$magento_status_seq
BEFORE INSERT ON my$magento_statusupdates
FOR EACH ROW
BEGIN
SELECT my$magento_statusupdates_seq.nextval INTO :new.id FROM dual;
END;

LC.Interfaces


Es werden alle fünf Minuten die Daten der Tabelle MAGENTO_UPDATE selektiert und anschließend als exportiert gekennzeichnet. Dabei werden die selektierten Daten mittels SOAP WebService an den WebShop übertragen. Der Aufruf von LC.Interfaces muss mittels folgenden Parameters erfolgen:

MAGENTO_RUN=[true|false].

Zum Beispiel MAGENTO_RUN=true.


WebServices

Vom Magento-Shop werden WebServices für die Preis- und Lagerbestandsaktualisierung aufgerufen. Hierbei wird Version 2 der SOAP-Schnittstelle verwendet. Nachfolgend alle verwendeten WebService-Methoden.

login

Diese Methode gewährt Zugriff auf den WebService unter Angabe von Benutzername und Kennwort.

Rückgabewert: Die Sitzungs-ID, welche bei den anderen WebService-Methoden angegebenen werden muss.

catalogProductList

Diese Methode wird verwendet, um Festzustellen, ob ein bestimmter Artikel für die Website existiert, oder nicht.

Rückgabewert: Ein catalogProductEntity-Feld, welches die Artikel als Ergebnis der Filterung enthält.

catalogProductUpdate

Diese Methode wird zur Preisänderung, Artikelsteuerung (aktivieren oder deaktivieren) und zur Aktualisierung des Lagerbestands der Abholshops verwendet.

Rückgabewert: True, wenn der Aufruf erfolgreich war, ansonsten false.

catalogInventoryStockItemUpdate

Diese Methode wird zur Aktualisierung des Versandlagers verwendet.

Rückgabewert: 1, wenn der Lagerbestand des Versandlagers erfolgreich aktualisiert wurde, ansonsten eine andere Zahl.

salesOrderAddComment

Diese Methode wird verwendet, um den Status einer Bestellung auf bezahlt zu setzen.

Rückgabewert: 1, wenn der Status erfolgreich gesetzt wurde, ansonsten 0.

Konfiguration

In Abbildung 1 unten sind die verfügbaren Einstellungen abgebildet.

Abbildung 1: LC.Interfaces Einstellungen

Die Einstellungen sind in folgende Bereiche gegliedert:

  • Allgemein:
    • Export Pfad: Der Pfad, unter welchem die Exportierten CSV-Dateien gespeichert werden sollen.
    • Exportdatei überschreiben: Ist dieses Kontrollkästchen gesetzt, so wird ohne nachzufragen eine etwaige bestehende Datei beim Exportvorgang überschrieben.
    • CSV-Trennzeichen: Das Trennzeichen, welches für den Aufbau der CSV-Dateien verwendet wird.
    • Exportzeit: Wird durch den Parameter MAGENTO_RUN=true der tägliche Abgleich der Daten aktiviert, so gibt dieses Feld den Zeitpunkt des Exports an.
    • WebShop-Url: Die URL des WebShops inklusive http.
    • Kommentar (bezahlt): Der Kommentar, welcher dem Kunden bei Zahlungseingang gesendet wird.
    • Kommentar (versendet): Der Kommentar, welcher dem Kunden bei Versendung gesendet wird.
    • Kommentar (storniert): Der Kommentar, welcher dem Kunden bei Stornierung gesendet wird.
    • Kommentar (Trackinglink): Der Kommentar, welcher dem Kunden bei Versendung durch einen Paketdienst gesendet wird. Der Platzhalter TRACKINGLINK wird hierbei durch den entsprechenden Trackinglink ersetz.
    • E-Mail Adresse: Die E-Mail Adresse, an welche ein Fehlerbericht gesendet wird.
    • Kundenstamm täglicher Abgleich: Gibt an, ob der Kundenstamm analog zum Artikelstamm beim täglichen Abgleich exportiert wird.
    • Automatischer Auftragsimport: Gibt an, ob die Aufträge automatisch mit dem Live-Abgleich importiert werden.
  • Artikelexport:
    • Export-Codierung: Die CodePage der zu verwendenden Codierung für den CSV-Export. Wird keine angegeben, so wird UFT8 verwendet (z. B. ANSI: 1252).
    • Status durch Sonderpreise: Ist die Eigenschaft gesetzt, so wird der Status durch die Sonderpreise gesteuert, ansonsten durch die WebShop-Artikel Eigenschaft aus dem Artikelstamm.
    • Attribut-Set zwingend: Gibt an, ob ein Artikel ohne Attribut-Set oder mit dem Attribute-Set Default exportiert wird, oder nicht.
    • Visibility: Der Wert, welcher in der Spalte Visibility exportiert wird.
    • Status Enabled: Der Wert, welcher in die Spalte Status eingetragen wird, wenn der Artikel aktiv geschaltet werden soll.
    • Status Disabled: Der Wert, welcher in die Spalte Status eingetragen wird, wenn der Artikel inaktiv geschaltet werden soll.
    • UST-Code (reduziert): Gibt den UST-Code an, welcher einen reduzierten Steuersatz kennzeichnet.
    • Lagerspalte (StoreView): Der Name der Spalte im Artikelexport CSV für den gesamten Lagerbestand.
    • Where-Bedingung: Hiermit lässt sich die Artikelabfrage für den Export mittels SQL Anweisung einschränken. Spalten aus dem Artikelstamm müssen mit ‚a.' beginnen.
    • Select-Spalten: Hiermit lässt sich die Artikelabfrage für den Export mittels SQL Anweisung erweitern. Spalten aus dem Artikelstamm müssen mit ‚a.' beginnen.
    • Lagerspalten: Gibt die Spaltennamen für den CSV-Export des Artikelstammes für die angegeben Lagernummer an. Wird hier für ein Lager nichts angegeben, so wird der Spaltname wie folgt gebildet: stock_ORT. ORT ist hier der Eintrag Ort aus der Lagerdefinition.
  • Kundenexport:
    • Where-Bedingung: Hiermit lässt sich die Kundenabfrage für den Export mittels SQL Anweisung einschränken.
  • Websites:
    • Website: Der Name der Website, welcher auch dem Store-View des Magento-WebShops entspricht.
    • OE: Gibt die Nummer der organisatorischen Einheit der entsprechenden Website an.
    • Land: Gibt das Länderkürzel (ISO-Ländercode) der entsprechenden Website an.
    • Lagernummern: Die Lagernummern, welche zur Berechnung des Gesamtbestands der entsprechenden Website herangezogen werden.
  • Logbuch:
    • Aktivieren: Ist dieses Kontrollkästchen gesetzt, so werden etwaige Fehlermeldungen in einer Datei protokolliert.
    • Pfad: Der Pfad, unter welchem das Logbuch gespeichert werden soll.
    • Rücksetzintervall (Tage): Logbucheinträge, welche vom älter sind als die hier angegeben Anzahl an Tagen, werden aus dem Logbuch gelöscht. Wird kein Wert eingetragen, so werden keine Logbucheinträge gelöscht.
  • WebService:
    • Url: Die URL des Magento-WebServices. Wird kein Wert angegeben, so wird der intern eingestellte Wert des Magento-WebServices verwendet.
    • Benutzername: Der Benutzername für die Anmeldung an den Magento-WebService.
    • Passwort: Das Passwort für die Anmeldung an den Magento-WebService.
  • FTP-Verbindung:
    • Url: Die URL des FTP-Servers. Dort werden die erzeugten CSV-Dateien gespeichert.
    • Benutzername: Der Benutzername für die Anmeldung an den FTP-Server.
    • Passwort: Das Passwort für die Anmeldung an den FTP-Server.

XML-Datei

Der Aufbau der XML-Datei im Ordner Company sieht wie folgt aus:


<?xml version="1.0" standalone="yes"?>
<Settings>
<Magento>
<ExportPath>C:\inetpub\wwwroot\LC.NET\Company</ExportPath>
<ExportOverwrite>False</ExportOverwrite>
<ExportCSVSeparator>;</ExportCSVSeparator>
<LogbookActivate>True</LogbookActivate>
<LogbookPath>C:\inetpub\wwwroot\LC.NET\Company</LogbookPath>
<LogbookReset>7</LogbookReset>
<WebServiceUrl />
<WebServiceUsername>Username</WebServiceUsername>
<WebServicePassword>Password</WebServicePassword>
<DispatchStore>1</DispatchStore>
<FTPUrl />
<FTPUsername>Username</FTPUsername>
<FTPPassword>Password</FTPPassword>
<ExportTime>15.11.2010 03:00:00</ExportTime>
<LastExport />
<WhereClause />

<LongtextSQL />
<StockNumbers />
<WebShopUrl />
<SelectClause />
<CodePage />
<StateByPrice>false</StateByPrice>
<Visibility>Catalog, Search</Visibility>
<ValueEnabled>Enabled</ValueEnabled>
<ValueDisabled>Disabled</ValueDisabled>
<AttributeSetMandatory>false</AttributeSetMandatory>
<VatCodeReduced>1</VatCodeReduced>
<StockColumns />
<ExportCustomerData>False</ExportCustomerData>
<TrackingLink>TRACKINGLINK</TrackingLink>
</Magento>
</Settings>

Datenpflege

Für den korrekten Einsatz der Schnittstelle müssen einige Vorkehrungen getroffen werden. Vor allem im Bereich der Artikel- und Lagerpflege.

Artikelpflege

Folgende Daten müssen eingepflegt werden:

  • Profilierungskriterium #01&UPSELLING: Hier kann für einen Artikel ein oder mehrere, durch Komma getrennte ‚Upselling'-Artikel eingetragen werden. Der Name des Kriteriums muss mit #01 beginnen.
  • Sonderprofilierungskriterien für Kurztexte: Werte von Profilierungskriterien, welche mit #0X beginnen, wobei X einer Zahl von 0 bis 9 entspricht, werden vom WebShop für die Anzeige als Kurztexte erkannt.

Lagerpflege

Folgende Daten müssen eingepflegt werden:

  • Ort: Jedes Lager, welches für den WebShop verwendet wird (mit Ausnahme des Versandlagers) muss einen gültigen Eintrag in der Spalte ORT der Tabelle LAGER haben. Die Leerzeichen in den Lagerortnamen werden automatisch durch einen Unterstrich ersetzt.
  • Der Datenbank-Trigger, welcher in Kapitel 3.1.2 Tabelle LAGERBESTAND auf Seite beschrieben ist, enthält in der where-Bedingung die Lagernummern der Lager, welche berücksichtigt werden sollen.

Kundenpflege

Folgende Daten müssen eingepflegt werden:

  • E-Mail Adresse: Für jeden Kunden muss eine eindeutige E-Mailadresse eingetragen werden. Diese dient im WebShop als Anmeldename.

Tabelle UEBERSETZUNGEN

Diese Tabelle muss einige Werte beinhalten, welche für die Zuordnung beim Bestellungsimport wichtig sind. Der Aufbau der Tabelle ist wie folgt:

Name

Typ

Größe

Nulls

Bemerkung

CODE

INT

4

Y

Verwendung:
1 = Magento

VON

CHAR

60

Y

Wert, von dem die Zuordnung ausgeht.

AUF

CHAR

60

Y

Wert, der sich durch die Zuordnung ergibt.

Erforderliche Einträge

Folgende Einträge sind in der Tabelle UEBERSETZUNGEN zwingend erforderlich:

Von

Auf (Beispiel)

Beschreibung

Abholung

Abholung

Die Versandart für Abholung.

Anzahlung_Trigger

KK,SOFORT

Eine kommagetrennte Liste von Zahlungsbedingungen, welche die geleistete Anzahlung sofort auf den Gesamtbetrag Brutto setzt.

e4y_at

12

Die organisatorische Einheit der Website.

storepickup_villach

22

Die organisatorische Einheit des Abholshops.

tablerate_bestway

GLS

Die Versandart.

bankpayment

VORAUS

Die Zahlungsbedingung

countries

base;at;de;de

Das Land der jeweiligen Website im Format WEBSITE;LÄNDERKÜRZEL.

stores

Store1;1;store2;2

Die OE des jeweiligen Stores im Format STORE;OE.

Sonstiges

Folgende Daten müssen eingepflegt werden:

  • Die Tabelle MAGENTO_UPDATE und die Trigger TRG_MAGENTO_ITEM_UPDATE, TRG_MAGENTO_ITEM_NEW, TRG_MAGENTO_ITEM_DELETE, TRG_MAGENTO_STOCK und TRG_MAGENTO_ORDER_COMPLETED müssen in die Datenbank eingefügt werden.
  • Das Programm LC.Interfaces muss entsprechend Kapitel 4 Konfiguration auf Seite konfiguriert werden.
  • Im Ordner Company muss ein Ordner pdf angelegt werden und die Zugriffsrechte entsprechend gesetzt werden.
  • Der Wert in der Tabelle GRUNDLAGEN5 in der Spalte VERSAND_WEBAUFTRAG muss auf 1 gesetzt werden, da sonst die Versandkosten bei der Auftragserstellung doppelt erstellt werden.

Abarbeitungsschemata

Folgende Abarbeitungsschemata werden bei der Verarbeitung verwendet.

Preisänderung

Das nachfolgende Abarbeitungsschema zeigt den Ablauf anhand der Preisänderung. Dies gilt analog für die Lagerbestandsaktualisierung. Die Preisänderung wird kontinuierlich ausgeführt.

Abbildung 2: Ablauf Preisänderung

Anmerkung: Bei Artikel existiert? wird überprüft, ob der Artikel im Magento-WebShop existiert. Ist dies nicht der Fall, so wird er umgehend exportiert, wie in Kapitel 3 Live-Bestände auf Seite beschrieben.

Live-Abarbeitung

Durch die zwei Minuten Wartezeit nach der Abarbeitung wird dem Magento-WebShop ein Zeitfenster gewährt, in dem er die Indizierung starten kann.

Abbildung 3: Ablauf Live-Abarbeitung

Anhang

Bestellung im XML-Format


<?xml version="1.0" encoding="UTF-8" ?> 
<orders>
<order>
<order_line_number>1</order_line_number>
<orders_count>1</orders_count>
<export_id>71</export_id>
<current_timestamp>1311843032</current_timestamp>
<entity_id>83</entity_id>
<state>new</state>
<status>pending</status>
<protect_code>4a3689</protect_code>
<shipping_description>Versand mit GLS - Standardversand</shipping_description>
<store_id>1</store_id>
<customer_id>20396</customer_id>
<base_discount_amount>0.0000</base_discount_amount>
<base_grand_total>111.9916</base_grand_total>
<base_shipping_amount>4.9916</base_shipping_amount>
<base_shipping_tax_amount>1.0000</base_shipping_tax_amount>
<base_subtotal>78.3300</base_subtotal>
<base_tax_amount>18.6700</base_tax_amount>
<base_to_global_rate>1.0000</base_to_global_rate>
<base_to_order_rate>1.0000</base_to_order_rate>
<discount_amount>0.0000</discount_amount>
<grand_total>111.9916</grand_total>
<shipping_amount>4.9916</shipping_amount>
<shipping_tax_amount>1.0000</shipping_tax_amount>
<store_to_base_rate>1.0000</store_to_base_rate>
<store_to_order_rate>1.0000</store_to_order_rate>
<subtotal>78.3300</subtotal>
<tax_amount>18.6700</tax_amount>
<total_qty_ordered>1.0000</total_qty_ordered>
<customer_note_notify>1</customer_note_notify>
<billing_address_id>157</billing_address_id>
<customer_group_id>1</customer_group_id>
<gift_message_sender />
<gift_message_recipient />
<gift_message />
<quote_id>148</quote_id>
<shipping_address_id>158</shipping_address_id>
<base_shipping_discount_amount>0.0000</base_shipping_discount_amount>
<base_subtotal_incl_tax>94.0033</base_subtotal_incl_tax>
<shipping_discount_amount>0.0000</shipping_discount_amount>
<subtotal_incl_tax>94.0033</subtotal_incl_tax>
<weight>9.0000</weight>
<increment_id>100000083</increment_id>
<base_currency_code>EUR</base_currency_code>
<customer_email>cm@webteam.at</customer_email>
<customer_firstname>Christian</customer_firstname>
<customer_lastname>Mayer</customer_lastname>
<customer_prefix>Herr</customer_prefix>
<global_currency_code>EUR</global_currency_code>
<order_currency_code>EUR</order_currency_code>
<remote_ip>217.29.156.244</remote_ip>
<shipping_method>tablerate2_bestway</shipping_method>
<store_currency_code>EUR</store_currency_code>
<store_name>e4y_at Store AT Store View AT</store_name>
<created_at>2011-07-28 08:50:32</created_at>
<created_at_timestamp>1311843032</created_at_timestamp>
<updated_at>2011-07-28 08:50:32</updated_at>
<updated_at_timestamp>1311843032</updated_at_timestamp>
<total_item_count>1</total_item_count>
<hidden_tax_amount>0.0000</hidden_tax_amount>
<base_hidden_tax_amount>0.0000</base_hidden_tax_amount>
<shipping_hidden_tax_amount>0.0000</shipping_hidden_tax_amount>
<base_shipping_hidden_tax_amount>0.0000</base_shipping_hidden_tax_amount>
<shipping_incl_tax>5.9916</shipping_incl_tax>
<base_shipping_incl_tax>5.9916</base_shipping_incl_tax>
<giftcert_amount>0.0000</giftcert_amount>
<base_giftcert_amount>0.0000</base_giftcert_amount>
<cod_fee>10.0000</cod_fee>
<base_cod_fee>10.0000</base_cod_fee>
<cod_tax_amount>2.0000</cod_tax_amount>
<base_cod_tax_amount>2.0000</base_cod_tax_amount>
<customer>
<entity_id>20396</entity_id>
<entity_type_id>1</entity_type_id>
<website_id>1</website_id>
<email>m.mustermann@gmx.at</email>
<group_id>1</group_id>
<store_id>1</store_id>
<created_at>2011-06-1409:20:59</created_at>
<updated_at>2011-07-2808:50:32</updated_at>
<is_active>1</is_active>
<created_in>StoreViewAT</created_in>
<prefix>Herr</prefix>
<firstname>Max</firstname>
<lastname>Mustermann</lastname>
<password_hash>2551ea33cc803e6fcd5b443879488f4a:m5</password_hash>
<default_billing>20914</default_billing>
<default_shipping>20914</default_shipping>
<last_failed_login>1311842231</last_failed_login>
<pollex_customer_id>123456</pollex_customer_id>
</customer>
<customer_group>General</customer_group>
<billing>
<entity_id>157</entity_id>
<parent_id>83</parent_id>
<region_id>100</region_id>
<region_code>ST</region_code>
<customer_id>20396</customer_id>
<region>Steiermark</region>
<postcode>8010</postcode>
<lastname>Mayer</lastname>
<street>Strasse123</street>
<city>Graz</city>
<telephone>123455</telephone>
<country_id>AT</country_id>
<firstname>Christian</firstname>
<address_type>billing</address_type>
<prefix>Herr</prefix>
<street1>Strasse123</street1>
</billing>
<shipping>
<entity_id>158</entity_id>
<parent_id>83</parent_id>
<region_id>100</region_id>
<region_code>ST</region_code>
<customer_id>20396</customer_id>
<region>Steiermark</region>
<postcode>8010</postcode>
<lastname>Mayer</lastname>
<street>Strasse123</street>
<city>Graz</city>
<telephone>123455</telephone>
<country_id>AT</country_id>
<firstname>Christian</firstname>
<address_type>shipping</address_type>
<prefix>Herr</prefix>
<street1>Strasse123</street1>
</shipping>
<payment>
<entity_id>83</entity_id>
<parent_id>83</parent_id>
<base_shipping_amount>4.9916</base_shipping_amount>
<shipping_amount>4.9916</shipping_amount>
<base_amount_ordered>111.9900</base_amount_ordered>
<amount_ordered>111.9900</amount_ordered>
<method>cashondelivery</method>
</payment>
<items>
<item>
<order_product_number>1</order_product_number>
<item_id>113</item_id>
<order_id>83</order_id>
<quote_item_id>228</quote_item_id>
<store_id>1</store_id>
<created_at>2011-07-28 08:50:32</created_at>
<updated_at>2011-07-28 08:50:32</updated_at>
<product_id>254</product_id>
<product_type>simple</product_type>
<product_options>a:1:{s:15:"info_buyRequest";a:3:{s:4:"uenc";s:72:"aHR0cDovL2VsZWN0cm9uaWM0eW91LmF0L2JvZGVucGZsZWdlL3N0YXVic2F1Z2VyLmh0bWw,";s:7:"product";s:3:"254";s:3:"qty";i:1;}}</product_options>
<weight>9.0000</weight>
<sku>105740</sku>
<name>SIEMENS VS06G1666</name>
<qty_canceled>0.0000</qty_canceled>
<qty_invoiced>0.0000</qty_invoiced>
<qty_ordered>1.0000</qty_ordered>
<qty_refunded>0.0000</qty_refunded>
<qty_shipped>0.0000</qty_shipped>
<price>78.3333</price>
<base_price>78.3333</base_price>
<original_price>78.3333</original_price>
<base_original_price>78.3333</base_original_price>
<tax_percent>20.0000</tax_percent>
<tax_amount>15.6700</tax_amount>
<base_tax_amount>15.6700</base_tax_amount>
<tax_invoiced>0.0000</tax_invoiced>
<base_tax_invoiced>0.0000</base_tax_invoiced>
<discount_percent>0.0000</discount_percent>
<discount_amount>0.0000</discount_amount>
<base_discount_amount>0.0000</base_discount_amount>
<discount_invoiced>0.0000</discount_invoiced>
<base_discount_invoiced>0.0000</base_discount_invoiced>
<amount_refunded>0.0000</amount_refunded>
<base_amount_refunded>0.0000</base_amount_refunded>
<row_total>78.3300</row_total>
<base_row_total>78.3300</base_row_total>
<row_invoiced>0.0000</row_invoiced>
<base_row_invoiced>0.0000</base_row_invoiced>
<row_weight>9.0000</row_weight>
<gift_message_sender />
<gift_message_recipient />
<gift_message />
<weee_tax_applied>a:0:{}</weee_tax_applied>
<weee_tax_applied_amount>0.0000</weee_tax_applied_amount>
<weee_tax_applied_row_amount>0.0000</weee_tax_applied_row_amount>
<base_weee_tax_applied_amount>0.0000</base_weee_tax_applied_amount>
<base_weee_tax_applied_row_amount>0.0000</base_weee_tax_applied_row_amount>
<weee_tax_disposition>0.0000</weee_tax_disposition>
<weee_tax_row_disposition>0.0000</weee_tax_row_disposition>
<base_weee_tax_disposition>0.0000</base_weee_tax_disposition>
<base_weee_tax_row_disposition>0.0000</base_weee_tax_row_disposition>
<price_incl_tax>94.0033</price_incl_tax>
<base_price_incl_tax>94.0033</base_price_incl_tax>
<row_total_incl_tax>94.0033</row_total_incl_tax>
<base_row_total_incl_tax>94.0033</base_row_total_incl_tax>
</item>
</items>
<order_product_count>1</order_product_count>
<order_total_qty_ordered>1</order_total_qty_ordered>
</order>
</orders>

Magento 2

Um die Anbindung an einen Magento Shop mit der Version 2 oder höher herzustellen, sind bis dato (11.04.2017) einige Schritte notwendig, welche in den folgenden Kapiteln erläutert werden. Es kann nicht ausgeschlossen werden, dass die Änderungen mit Aktualisierungen des Magento-Shops hinfällig werden.

Wird ein Magento-Shop mit der Version 2.1.5 verwendet, sind auf jeden Fall alle Punkte auszuführen. Sollte bei späteren Versionen eine Korrektur der SOAP-Schnittstelle durchgeführt worden sein, genügen die beiden letzten Punkte 7.2.3 und 7.2.4.

Wird eine Magento-Version kleiner als 2.1.5 verwendet, kann es zu Problemen mit der Schnittstelle kommen. Diese Versionen wurden nicht getestet.

Magento Shop ändern

Zumindest in Version 2.1.5 ist die SOAP-Schnittstelle von Magento nicht WSDL 1.2 konform. Dadurch müssen in den folgenden PHP-Dateien des Shops selbst Änderungen vorgenommen werden.

Datei

AbstractSchemaGenerator.php

Verzeichnis

vendor/magento/module-webapi/Model

Grund

Eine Sicherheitsvorkehrung verhindert, dass die WSDL-Information von Visual Studio abgerufen werden kann. Somit kann der URL-Teil mit der Domäne des Namespaces für die Service-Anbindung nicht korrekt gesetzt werden, was von Magento aber verlangt wird.

Änderungen

Methode getListOfService:
Auskommentieren der if-Abfrage-Bedingung, aber nicht den Ausführungsteil des if-Blocks.

public function getListOfServices()

{

    $listOfAllowedServices = [];

    foreach ($this->serviceMetadata->getServicesConfig() as $serviceName => $service) {

        foreach ($service[ServiceMetadata::KEY_SERVICE_METHODS] as $method) {

            //if ($this->authorization->isAllowed($method[ServiceMetadata::KEY_ACL_RESOURCES])) {

                $listOfAllowedServices[] = $serviceName;

                break;

            //}

        }

    }

    return $listOfAllowedServices;

}


Methode getAllowedServicesMetadata:
Auskommentieren des unset-Befehls. 

protected function getAllowedServicesMetadata($requestedServices)

{

    $allowedServicesMetadata = [];

    foreach ($requestedServices as $serviceName) {

        $serviceMetadata = $this->getServiceMetadata($serviceName);

        foreach ($serviceMetadata[ServiceMetadata::KEY_SERVICE_METHODS] as $methodName => $methodData) {

            if (!$this->authorization->isAllowed($methodData[ServiceMetadata::KEY_ACL_RESOURCES])) {

                //unset($serviceMetadata[ServiceMetadata::KEY_SERVICE_METHODS][$methodName]);

            }

        }

        if (!empty($serviceMetadata[ServiceMetadata::KEY_SERVICE_METHODS])) {

            $this->removeRestrictedRoutes($serviceMetadata);

            $allowedServicesMetadata[$serviceName] = $serviceMetadata;

        }

    }

    return $allowedServicesMetadata;

}



Methode removeRestrictedRoutes:
Auskommentieren der beiden unset-Befehle.

protected function removeRestrictedRoutes(&$serviceMetadata)

{

    $allowedMethodNames = array_keys($serviceMetadata[ServiceMetadata::KEY_SERVICE_METHODS]);

    /** Remove routes which reference methods not visible to current user */

    if (isset($serviceMetadata[ServiceMetadata::KEY_ROUTES])) {

        foreach ($serviceMetadata[ServiceMetadata::KEY_ROUTES] as $path => &$routeGroup) {

            foreach ($routeGroup as $httpMethod => &$route) {

                if (!in_array($route[ServiceMetadata::KEY_ROUTE_METHOD], $allowedMethodNames)) {

                    //unset($routeGroup[$httpMethod]);

                }

            }

            if (empty($routeGroup)) {

                //unset($serviceMetadata[ServiceMetadata::KEY_ROUTES][$path]);

            }

        }

    }

}

Quelle

https://community.magento.com/t5/Programming-Questions/Magento-2-C-APIs-SOAP-problem/td-p/49546 - 11.04.2017


Datei

History.php

Verzeichnis

vendor/magento/module-sales/Model/Order/Status

Grund

Bei der Abfrage von Bestelldaten ist das Feld isCustomerNotified bei der Bestellhistorie ein Pflichtfeld und darf nicht null sein. Wird aber ein externes Zahlungssystem in den Shop eingebunden, kann es vorkommen, dass das entsprechende Feld auf null gesetzt wird. Aufgrund der WSDL-Definition wird aber dann ein Fehler beim Abruf der Bestellinformationen ausgelöst. Dadurch muss dies intern im Shop abgefangen werden.

Änderung

Methode setIsCustomerNotified:
Abfangen des null-Werts und auf 0 setzen.

public function setIsCustomerNotified($flag = null)

{

    if ($flag === null) {

        $flag = 0;

    }

    return $this->setData('is_customer_notified', $flag);

}


Methode getIsCustomerNotified:
Abfangen des null-Werts und 0 zurückgeben.

public function getIsCustomerNotified()

{

    $ret = $this->getData(OrderStatusHistoryInterface::IS_CUSTOMER_NOTIFIED);

    if($ret === null)

        return 0;

    else return $ret;

}

Quelle

https://github.com/magento/magento2/issues/3605 - 11.04.2017


Datei

Handler.php

Verzeichnis

vendor/magento/module-webapi/Controller/Soap/Request

Grund

Bei der Abfrage von Optionen zu einem Attribute wird folgender Fehler ausgeben: SOAP-ERROR: Encoding: object has no 'label' property. Dadurch kann aber nicht auf existierende Optionen geprüft werden und somit können auch keine neuen Optionen hinzugefügt werden.

Änderung

Methode _prepareResponseData:
Rückgabewert durch Konvertierung entsprechend modifizieren.

protected function _prepareResponseData($data, $serviceClassName, $serviceMethodName)

    {

        /** @var string $dataType */

        $dataType = $this->methodsMapProcessor->getMethodReturnType($serviceClassName, $serviceMethodName);

        $result = null;

        if (is_object($data)) {

            $result = $this->_dataObjectConverter

                ->convertKeysToCamelCase($this->_dataObjectProcessor->buildOutputDataArray($data, $dataType));

        } elseif (is_array($data)) {

            $dataType = substr($dataType, 0, -2);

            foreach ($data as $key => $value) {

                if ($value instanceof ExtensibleDataInterface || $value instanceof MetadataObjectInterface) {

                    $result[] = $this->_dataObjectConverter

                        ->convertKeysToCamelCase($this->_dataObjectProcessor->buildOutputDataArray($value, $dataType));

                } else {

                    $result[$key] = $this->_dataObjectConverter->convertKeysToCamelCase($this->_dataObjectProcessor->buildOutputDataArray($value, $dataType));

                }

            }

        } elseif (is_scalar($data) || $data === null) {

            $result = $data;

        } else {

            throw new \InvalidArgumentException("Service returned result in invalid format.");

        }

        return [self::RESULT_NODE_NAME => $result];

    }

Quelle

https://github.com/magento/magento2/issues/4630 - 26.06.2017
https://github.com/magento/magento2/issues/9846 - 26.06.2017

LC.Interfaces Namespaces für WSDL ändern

In Visual Studio müssen die Referenzen der SOAP-Dienste mit der aktuellen URL des Shops aktualisiert werden. Obwohl es nicht WSDL 1.2 konform ist, muss die der verwendete Namespace gleich der aufrufenden URL des Dienstes sein.

Magento Integration einrichten

Für die Verwendung der SOAP-Schnittstelle von Magento 2 benötigt man eine Autorisierung. Im Falle dieser Schnittstelle wird die Einrichtung einer Magento Integration verwendet. Folgende Schritte sind für die Konfiguration notwendig:

  1. Im Backend entsprechende Menü aufrufen: SYSTEM -> Extensions -> Integrations
  2. Eine neue Integration mit folgenden Daten hinzufügen:
    1. Name: POLLEX-LC Software GmbH
    2. Identität Link URL: pollex
    3. Kennwort: Das Kennwort des angemeldeten Benutzers.
  3. Den Wert aus dem Feld Zugriffstoken für den nächsten Schritt notieren.

LC.Interfaces Konfiguration anpassen

In der Konfigurationsdatei sind nachfolgende Einstellungen zu setzen. Sollten die Werte noch nicht vorhanden sein, müssen diese in das XML eingefügt werden.

  1. MagentoVersion: Hier den Wert der aktuellen Magento-Version eintragen (z.B. 2

Einstellung

Beispiel

Beschreibung

MagentoVersion

2.1

Die aktuelle Magento-Version.

AttributeSetIdDefault

1

Die Id des Standard-Attribut-Sets. Diese kann im Backend derzeit nur aus der Adresszeile des Browsers ausgelesen werden, wenn das entsprechende Attribut-Set selektiert ist.

Fehler in Deserialisierung

Im WSDL File sind Elemente als Pflichtfeld markiert, warden aber in der SOAP-Antwort nicht übertragen.

Lösung: WSDL File downloaden und entsprechend modifizieren

In Definitions den Namespace hinzufügen

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<xsd:element name="isCustomerNotified" minOccurs="0" maxOccurs="1" type="xsd:string">

Hier wurde auf "string" umgewandelt, damit auch Nullwerte korrekt eingelesen werden können

WSDL File Downloaden

Abruf der WSDL Liste direkt im Browser:

http://www.<servername>.de/soap/default?wsdl_list=1]] ></ac:plain-text-link-body></ac:link></p><p>Abruf einzelner WSDL-Dateien ben&ouml;tigen eine Authentifizierung. Request kann &uuml;ber Fiddler gebaut werden:</p><p><ac:image ac:height="221" ac:width="605"><ri:attachment ri:filename="worddav42c79967631847b326aa6c96a3d7c214.png" /></ac:image></p><p>Das Token kommt direkt aus dem Magento-Backend und hat dort den Titel &bdquo;Access Token&quot;</p><p><a href="https://devdocs.magento.com/guides/v2.0/get-started/authentication/gs-authentication-token.html">https://devdocs.magento.com/guides/v2.0/get-started/authentication/gs-authentication-token.html</a></p>

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.