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?
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.
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.
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?
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.
Es gibt zwei mögliche Wege den master_identifier anzugeben:
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.
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.
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.
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?
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?
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)
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.
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.
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.
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
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.
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?
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.