ShopwareSearchOrders / ShopwareAddOrders: ungleiche Datenbankfelder

Hallo Forum,

Wir sind etwas frustriert.

Wir versuchen, Daten aus einem externen CRM via Synesty an Shopware zu übergeben.

Um zu verstehen, wie die Daten im Datastore abgelegt werden müssen, um wieder ausgelesen und importiert werden zu können, haben wir mit ShopwareSearchOrders (6.5), zwei Filtern und zwei DatastoreWritern eine Importfunktion gebastelt. Die erhaltenen Datentabellen haben wir verwendet, um einen vermeintlich kompatiblen Datastore für den Wiederupload herzustellen.

Beim Versuch, die Daten wieder zu exportieren, wird jedoch von Synesty reklamiert, dass die Daten nicht dem Shopware6Order / Shopware6OrderItem Datastore Schema entsprechen. Also haben wir begonnen, das Mapping soweit wie möglich anzupassen. Allerdings sind wir zum Beispiel beim Feld ‚Salutation‘ auf das Problem gestossen, dass wir nur die ID verfügbar haben, die Vorlage aber den Begriff (Frau, Herr, Firma) haben möchte.

Folgende Fehlermeldung:

Letzte Meldung: Error creating order xxx. There’s no entry in ‚Salutation‘ for value ‚‘. Possible values are: mr, not_specified, mrs, company

Offensichtlich sind die beiden Konnektoren „ShopwareSearchOrders“ und „ShopwareAddOrders“ nicht auf dem selben Stand, so dass heruntergeladene Daten nicht mehr hochgeladen werden können (was man eigentlich erwarten kann).

Gibt es da einen Workaround? Oder zwei „gleichwertige“ Plugin-Versionen? Generell wäre es gut, wenn die Konnektoren auch bearbeitet werden könnten. Ist so etwas möglich?

Viele Grüsse, Ivo Frieden

Hallo Herr Frieden,

entschuldigen Sie die verspätete Antwort, aufgrund von Urlaub und Erkrankung sind wir aktuell sehr spärlich besetzt.

Leider trifft das auch auf die Kollegen zu, welche sich mit Shopware gut auskennen.

Wir melden uns aber natürlich im Neujahr mit einer konkreten Antwort auf Ihre Frage.

Viele Grüße und einen guten Rutsch ins neue Jahr wünscht Ihnen,
der Synesty Support

Hallo @Hermet_AG,

Das ist korrekt. Für den ShopwareAddOrders Step müssen die Daten in zwei Datastores (Master/Child Datastore) mit dem vordefinierten Shopware6Order / Shopware6OrderItem Schema abgelegt werden.
Im vordefinierten Schema „Shopware6Order“ sind die allgemeinen Bestelldaten sowie Kunden und Adressdaten vorhanden. Bei einigen Feldern besteht die Möglichkeit die ID oder den Wert anzugeben, z.B. bei orderCustomerSalutation (orderCustomerSalutationId). Eines der beiden Felder muss allerdings gefüllt werden.

Die beiden Steps sind grundsätzlich unabhängig voneinander. Der „ShopwareAddOrders“ Step legt unter Umständen nicht nur die Bestellung an, sondern ggf. auch Kunde-/Adressen an. Unter anderem ist dafür auch der Datastore notwendig, um die IDs der angelegten Entitäten speichern zu können.
Die Feldnamen der vordefinierten Shopware6Order / Shopware6OrderItem Schema unterscheiden sich leider etwas von den Spaltennamen im output-Spreadsheet des ShopwareSearchOrders Steps. In vielen Fällen sollte das aber nur den 1. Buchstaben (Groß- / Kleinschreibung) betreffen.
Mit etwas (Mapping-)Aufwand sollte es mit den Daten des ShopwareSearchOrders Steps aber möglich sein eine neue Bestellung im gleichen Shopware System anzulegen.

Was meinst du genau mit „Konnektoren bearbeiten“ ? Die „vorgefertigten“ Steps kannst du nicht anpassen.
Die output - Daten der Steps kannst du mit diversen anderen Steps umformen (z.B. Mapper), um diese in das benötigte Format zu bringen.

Viele Grüße
Torsten

Hallo Thorsten, vielen Dank für die Antwort.

Wir haben nun das Mapping auf die Schemen „Shopware6Order“ und „Shopware6OrderItem“ angepasst, die Felder werden soweit auch befüllt.

Hier die Steps, die wir dafür implementiert haben

Was jedoch nicht geht, ist die Master / Child Verknüpfung, beim „AuftragsdatenDatastoreWriter“ (Shopware6Order) haben wir unter „Erweiterte Einstellungen“ nichts ausgefüllt, beim „AuftragsdatenDatastoreWriter“ (Shopware6OrderItem) haben wir unter den erweiterten Einstellungen im Feld „masterIdentifierColumn“ verschiedene Felder ausprobiert, ohne jedoch eine Verbindung zum Master-Datensatz herstellen zu können. Im vorherigen Datastore (gebastelt aus dem „ShopwareSearchOrders“ Step) hat das über die ID wunderbar funktioniert.

Was machen wir falsch?

Das Feld „identifier“ eignet sich für diese Verknüpfung nicht, da beim Schema „Shopware6OrderItem“ der „Shopware6Order-Identifier“ mit dem Wert „ItemIdentifier“ ergänzt wird.

Shopware6Order-Identifier
018cb1d5b3ff70b5975d1bc46d3011e2

Shopware6OrderItem-Identifier
018cb1d5b3ff70b5975d1bc46d3011e2-018cb1d5b3fd7071a3b747285f54ef33

Und noch eine Verständnisfrage: beim Tooltip zur „MasterIdentifierColumn“ steht „Optional: Spaltenname im Quell-Spreadsheet, in welcher der ‚identifier‘ des Master-Datensatzes steht.“ Welches ist hier das Quell-Spreadsheet? Das Sheet aus Step 1 oder das dem Step vorhergehende Sheet?

Besten Dank für eure Hilfe.

Hallo Ivo,

Damit die Child-Datensätze mit den richtigen Master-Datensätzen „verknüpft“ werden, muss der Master Identifier beim Import der Child-Datensätze angegeben werden. Der master_identifier muss dem „identifier“ des Datensatzes (z.B Auftrags ID) aus dem Master-Datastore enthalten.


(siehe Doku „Hierarchischer Import Master-Child“)

Es gibt zwei mögliche Wege den master_identifier anzugeben:

  1. In der Konfiguration („Mapping“) des DatastoreWriter Steps kann eine Spalte mit dem Titel master_identifier hinzugefügt werden. In dieser Spalte muss dann in jeder Zeile der entsprechende Wert vorhanden sein, damit die Datensätze verknüpft werden.

  1. Wenn im Mapping keine „master_identifier“ Spalte angegeben ist, kannst du auch in den erweiterten Optionen(„masterIdentifierColumn“) des DatastoreWriter Steps eine andere Spalte auswählen/angeben. Wichtig: Es muss der „gemappte“ Titel der Spalte angegeben werden. Die Spalte muss also im Mapping des DatastoreWriters vorhanden sein.

Am einfachsten kannst du den master_identifier über die weiter oben erwähnte Variante 1 angeben:

  • "master_identifier Spalte im Mapping hinzufügen
  • als Quelle „Id“ auswählen. Die „Id“ Spalte sollte auch bei den Bestellposition die ID des Auftrags enthalten.

Die erweiterte Option „masterIdentifierColumn“ kannst du dann auch im DatastoreWriter für die Auftragspositionen leer lassen.

Es bezieht sich auf das verknüpfte input Spreadsheet.
Wenn ein Mapping hinterlegt ist, muss der Spaltenname aus dem Mapping angegeben werden.
Wenn kein Mapping hinterlegt ist, muss der Titel aus dem input Spreadsheet verwendet werden.

VG Torsten

Hallo Torsten,

Vielen Dank für das ausführliche Tutorial, die Master / Child Verknüpfung hat irgendwie geklappt, aber auch nicht so einfach wie beschrieben.

Nach der hartkodierten Bereinigung von weiteren Warnungen (zu jeder SalutationID auch noch eine Salutation) und eine Country2Id ist der Flow ohne Fehlermeldung durchgelaufen.

Eigentlich müsste die Bestellung doch jetzt in Shopware unter Bestellungen erscheinen?

Muss man entweder in Synesty oder in Shopware etwas zusätzliches machen?

Einen Cronjob oder einen Finisher durchlaufen lassen oder so etwas?

Vielen Dank für die wertvolle Hilfe.

Hallo Ivo,

Die Bestellung wird über die API angelegt und sollte auch direkt sichtbar sein. Kannst du bitte mal Master-Datastore schauen, ob in der Spalte orderId eine uuid hinterlegt und der Datensatz auf den Processing Status „PROCESS_SUCCESS“ gesetzt wurde?

VG Torsten

Hallo Torsten,

Wir müssen nochmals auf Dich zurück kommen betreffend diesem Problem (die Child-Verknüpfung hat mittlerweile geklappt).

Eine uuid für die Spalte orderId gibt es nicht, wir speisen die akzeptierten Angebote aus einem anderen System via Synesty in Shopware ein.

Der Master Step gibt einen PROCESSED_ERROR aus (die Pflichtfelder sind alle befüllt):

Der Child Step gibt UNPROCESSED aus (die Pflichtfelder sind alle befüllt):

Muss der Status im DatastoreWriter > updateProcessingStatus manuell angepasst werden oder ändert sich der Status, sobald gewisse Kriterien erfüllt sind?

Wenn zweiteres der Fall ist: wie kann man die Fehler debuggen?

Im Folge-Step, der Suche, werden die vorhandenen Daten korrekt ausgegeben, und zwar mit folgenden Einstellungen:

Datastore | DatastoreWriter Master (1)
Folder | order
Processing Status | Kein Wert gewählt
Children ausgeben? | Children ausgeben
Parents/Varianten Filter | Parents und Varianten (erst Partent dann zugehörige Varianten)

Was machen wir falsch?

Viele Grüsse, Ivo

Hallo Ivo,

Genau, die orderId Spalte musst du nicht füllen. Die orderId Spalte wird vom ShopwareAddOrders Step gefüllt, sobald die Bestellung erfolgreich in Shopware angelegt wurde. Da der Verarbeitungsstatus „PROCESSED_ERROR“ ist, wurde die Bestellung vermutlich nicht angelegt.
Der ShopwareAddOrders Step setzt diesen Status am Master-Datensatz, wenn ein Fehler beim Import der Bestellung aufgetreten ist. Wenn eine Bestellung erfolgreich angelegt wurde, wird der Status am Master-Datensatz auf „PROCESS_SUCCESS“ gesetzt.
Der Verarbeitungsstatus an den Childs spielt für den ShopwareAddOrders Step keine Rolle.

Kurz zusammengefasst: Der ShopwareAddOrders Step versucht alle Master-Datensätze mit Verarbeitungsstatus „UNPROCESSED“ aus dem gewählten Datastore zu Shopware zu importieren. Wenn der import erfolgreich ist, wird die orderId Spalte und der Verarbeitungsstatus auf „PROCESS_SUCCESS“ gesetzt. Bei Fehlern wird der Datensatz auf „PROCESSED_ERROR“ gesetzt.

Wenn der Datensatz (die Bestellung) mit PROCESSED_ERROR erneut importiert werden soll, dann kannst du den Verarbeitungsstaus manuell im Datastore oder im Flow per DatastoreWriter („updateProcessingStatus“) auf „UNPROCESSED“ setzen.

Die Vorschau des ShopwareAddOrders Steps sollte immer die „UNPROCESSED“ Datensätze anzeigen, die bei der richtigen Flow-Ausführung zu Shopware importiert werden. Damit kannst du vor der Ausführung schon mal test, ob deine Bestellung dabei ist.

VG Torsten

Hallo Torsten,

Erneut vielen Dank für Deine wichtige Antwort, so nähern wir uns Schritt für Schritt dem Erfolg.

Heute habe ich ziemlich viel Felder hartgecoded, um einen Output zu erzwingen. Dank Deinem gestrigen Input ist mir auch aufgegangen, dass der „ShopwareAddOrders“ die Vorschau nur anzeigt, wenn der Status UNPROCESSED ist.

Item. Der „SearchDatastore“ Step zeigt die Daten des Master und Child Datastore’s an, die Daten sind vollständig vorhanden.

Bei der Vorschau des „ShopwareAddOrders“ Steps kommen aber nur die Daten aus dem Master Datastore, die Produktdaten aus dem Child Datastore fehlen.

Woran kann das noch liegen?

Beste Grüsse, Ivo Frieden

Hallo Torsten, noch etwas:

Wenn wir den gesamten Flow durchlaufen lassen, kommt meist zuerst eine Fehlermeldung:

‚Letzte Meldung: Error creating order 1649769337. There’s no entry in ‚currency2Id‘ for value ‚‘. Possible values are: eur, chf‘

Das Feld „'currency2Id“ sowie das Feld " Country2Id" sind in unseren Daten aber vorhanden:

Hallo Ivo,

Das sieht soweit korrekt aus. Der ShopwareAddOrders zeigt in der Vorschau nur den Master-Datensatz an.
Ich gehe davon aus das du im SearchDatastore Step die Option „Children ausgeben“ aktiviert hast. Dann werden die Child-Datensätze auch im Ergebnis ausgegeben.

Die Fehlermeldung ist noch etwas missverständlich. Die müssen wir nochmal überarbeiten.
„currency2Id“ ist eigentlich ein intern von uns verwendeter Name für das Mapping vom Wert der Spalte „currency“ zu „currencyId“. Du musst dafür keine extra Spalte im Schema hinzufügen.
Du kannst entweder den Namen der Währung (z.b.„chf“) in der „currency“ Spalte angeben oder direkt die id der Währung in der „currencyId“ Spalte.

Das gleiche gilt für „Country2Id“. Dies ist auch ein interner Name und wird für die Länder der Adressen verwendet. In den Spalten shippingAddressCountryId und shippingAddressCountryISOAlpha2 bzw. billingAddressCountryId und billingAddressCountryISOAlpha2 reicht es aus, jeweils eine der beiden Spalten zu setzen.


VG Torsten

Hallo Torsten, es geht immer weiter vorwärts :wink:

Nun kommt noch eine vielleicht / hoffentlich letzte Fehlermeldung:

Error creating order 1649769337. (Root Causes: ParameterMissingException: Parameter missing error. Please check all input field and check if your shopware version is supported. Error:Value is not a valid UUID: (Code=FRAMEWORK__INVALID_UUID ,Source=unknown ,Status= 400) POST https://www.unseredomain.ch/api/order?_response=basic HTTP/1.1)

BTW: Wir haben SW Version 6.5.7.3 im Einsatz.

Vielen Dank für Deine Hilfe und beste Grüsse, Ivo Frieden

Hallo Ivo,

Diese Fehlermeldung kommt jetzt direkt von der Shopware API beim import der Bestellung und tritt immer dann auf, wenn eine falsche/invalide UUID angegeben wurde. Leider ist anhand der SW API Fehlermeldung nicht ersichtlich, welche UUID falsch ist. Da kommen leider einige IDs in Frage. Kannst du bitte nochmal alle gesetzten „ID“ - Spalten im Datastore prüfen, ob du da eventuell ein falsche oder nicht vorhandene UUID gesetzt hast.

VG Torsten

Hallo Torsten,

Langsam wird der abendliche Post zur Gewohnheit :wink:

Ich habe nach Deiner gestrigen Antwort - danke dafür - die ID-Spalten rausgesucht und soweit wie möglich mit Werten befüllt.

Nun kommt wieder eine andere Fehlermeldung, welche sehr kryptisch ist:

Letzte Meldung: Error creating order 1649769337. (Root Causes: ParameterMissingException: Parameter missing error. Please check all input field and check if your shopware version is supported. Error:{„errors“:[{„code“:„c1051bb4-d103-4f74-8988-acbcafc7fdc3“,„status“:„400“,„detail“:„Dieser Wert sollte nicht leer sein.“,„template“:„This value should not be blank.“,„meta“:{„parameters“:{„{{ value }}“:„null“}},„source“:{„pointer“:„/0/stateId“}}]} POST https://www.unseredomain.ch/api/order?_response=basic HTTP/1.1)

Es gibt in den Datenbank-Schemen weder ein Feld „template“ noch ein Feld „meta“, daher werden wir aus der Fehlermeldung nicht schlau. Du vielleicht?

Vielen Dank und freundliche Grüsse, Ivo Frieden

Hallo Ivo,

die Fehlermeldung auch nicht toll aber besser als die von gestern :smiley: Sie bezieht sich auf den Auftragsstatus (stateId), der anscheinend leer ist.

Da du geschrieben hast, dass du alle Id-Felder gefüllt hast, habe ich das auch nochmal getestet und leider noch ein Problem mit dem Feld gefunden. Das Feld stateId wird aktuell noch nicht übernommen. Wir werden das Problem mit der stateId - Feld schnellstmöglich beheben. Zum Testen kannst du den Auftragsstatus der Bestellung auch über das Feld state setzen. Hier muss der technische Name des Status gesetzt werden, z.B. open.

VG Torsten

Hallo Torsten, nun hat der Import funktioniert, ganz herzlichen Dank für Deinen Support!

1 „Gefällt mir“