Erweiterte Preise per Rest API

Hey @BastianHbner ,

ich bin zwar kein Experte, aber sowie sich das für mich anhört, sprichst du dann jedes mal das selbe Produkt an.

Kannst du mal dein Payload hier reinstellen, damit man sich das mal anschauen kann?

Lg Louis :slight_smile:

Hey @yolomir danke für die schnelle Antwort. Den selben Artikel kann es eigentlich nicht sein, da wir immer einen neuen Call erstellen mit dem nächsten Artikel. Wenn wir 4-5 direkt nacheinander hochladen hat keiner dieser Artikel die preisregeln. Wenn immer der selbe angesprochen werden würde, wäre ja zumindest bei einem die Preisregeln hinterlegt.

Hier mein Payload
{„name“:„Transducer Engine alt. P165-5281“,„manufacturerId“:„419ce0ce48724455aa1ea65f5529a0d4“,„productNumber“:„P265-5037-1“,„stock“:0,„categories“:[{„id“:„ad413a8952e040b7a5320dc6f3c6337e“}],„price“:[{„currencyId“:„b7d2554b0ce847cd82f3ac9bd1c0dfca“,„gross“:869.8902648778809,„net“:749.9054007567939,„linked“:false}],„prices“:[{„id“:„0051395fad87429a9416cb8731a91bf1“,„price“:[{„currencyId“:„b7d2554b0ce847cd82f3ac9bd1c0dfca“,„gross“:869.8902648778809,„net“:749.9054007567939,„linked“:false}],„quantityStart“:1},{„id“:„6151dbdafa0a44e6b5f7f64fd9c88783“,„price“:[{„currencyId“:„b7d2554b0ce847cd82f3ac9bd1c0dfca“,„gross“:599.9119367045064,„net“:517.1654626762986,„linked“:false}],„quantityStart“:1}],„taxId“:„8334a957e5684ce481a69b5e6f86b4b5“}

also du hast nur die ID der Regel hardgecoded ? :slight_smile:

Und dein Response passt aber? oder gibts da irgendwelche Fehlermeldungen?

Genau der rest wird dynamisch aus den Artikelstammdaten unserer Hauptprogramms ermittelt. Nein mein Response geht ganz normal durch. Wenn ein Artikel im Shop Test123 heißt ich den dann im Call Test1234 nenne und mehrere Artikel hochlade wird der name geändert die Preisregel aber nicht.

@BastianHbner
Irgendwie gibst du in deinem Payload für das prices-Objekt überhaupt keine ruleID mit…
Die fehlt bei dir… und die id sollte glaube ich eher „productId“ heißen und nicht nur „id“.

Dein JSON sieht formatiert so aus:

"prices":[
      {
         "id":"0051395fad87429a9416cb8731a91bf1",
         "price":[
            {
               "currencyId":"b7d2554b0ce847cd82f3ac9bd1c0dfca",
               "gross":869.8902648778809,
               "net":749.9054007567939,
               "linked":false
            }
         ],
         "quantityStart":1
      },

Korrekt müsste das so aussehen:

"prices":[
      {
         "productId":"e8b593b74deb42499e847c8e094c162c",
         "ruleId":"047e07702f6a4c66a38e04adc21e4845",
         "price":[
            {
               "currencyId":"b7d2554b0ce847cd82f3ac9bd1c0dfca",
               "net":16.8,
               "linked":true,
               "gross":19.99
            }
         ],
         "quantityStart":1,
         "quantityEnd":12
      },

Ich hoffe ich konnte helfen.
Beste Grüße
Holger

@hloettgen das Problem ist, wenn ich die RuleID mit übergebe legt er mir für jede aktualisierung des Artikels immer wieder eine neue Zeile in den Preisregeln an. Das seltsame ist ja das mein Call für die aktualisierung eines einzelnen Artikels reibungslos funktioniert. Habe das gefühl das könnte ein Bug sein

@BastianHbner
Also… ich erkläre mal, wie ich das tue…
Ich habe zum Beispiel für unterschiedliche Kundengruppen Preisregeln in den Stammdaten definiert.
Die ids dieser Preisregeln (ruleId) sind ja dann fix und in den Stammdaten von Shopware hinterlegt.
Wenn ich jetzt einen Preis anlegen will, der sich auf eine der Preisregeln bezieht, dann gebe ich eben die ruleId mit beim Preis… nur so kommt ja die Verbindung überhaupt zustande, dass eine Kundengruppe auch den entsprechenden Preis zugewiesen bekommt.
Dadurch wird aber ja keine neue Preisregel erzeugt, sondern nur ein Preiseintrag mit Angabe dieser Preisregel… Einen Bug kann ich hier nicht erkennen.
Wenn du schreibst, dass der Preiseintrag richtig geschrieben wird, wenn du nur einen einzelnen Artikel speicherst, kann du uns dann mal den Code dazu mitgeben… da muss ja dann etwas anders sein als beim sync mit mehreren Artikeln.
Aber vielleicht meinst du auch etwas anderes:
Wenn ich einen Artikel mit Staffelpreisen 10 mal hochlade, dann habe ich „leider“ hinterher 10 identische Preiseinträge im Shop für den Artikel. Das ist ja gerade der Grund, weshalb ich, bevor ich zum Beispiel Staffelpreise hochlade, immer erst mal die Preise lösche… Shopware fügt die im Standard an…
Es sei denn, du kennst die id des Preiseintrags (nicht der Preisregel) und kannst die id beim upsert mitgeben… aber die müsstest du dann vorher auslesen.

@hloettgen genau wie du im letzten Satz beschreibst habe ich die ID des Preiseintrags hardgecoded. Kurz zum verständnis unsere Schnittstelle reagiert so: Wenn ich in unserem Masterprogramm einen Artikel aktualisiere wird löst unsere Schnittstelle aus und sendet einen HTTP Call an den Shop mit der aktualisierung. Ergebnis = Preisregel ist hinterlegt. Sobald wir aber 2 Artikel kurze Zeit hintereinander aktualisieren löst ebenfalls die Schnittstelle aus und lädt jede aktualisierung einzeln hoch, allerdings ohne hinterlegte Preisregeln. Wir haben das eben so gemacht: 1 Artikel aktualisiert - > mit Regeln importiert. 5 Artikel glechzeitig aktualisiert → Artikeländerung wie beschreibung, Menge usw im Shop aktualisiert nur ohne Preisregeln. Zudem haben wir das ganze grade nochmal mit der RuleID probiert. Auch hier einzeln klappt der Upload mit mehreren nicht mehr.

@BastianHbner
Ich glaube ich verstehe nicht wirklich, was Dein Problem ist.
Oder wir scheitern hier an Begrifflichkeiten.
Preisregeln legt man nicht beim Artikel an, sondern über die Rules…
Diese werden dann Artikelpreisen zugewiesen.
Wenn du schreibst, dass du den Eintrag des Preises hardgecoded hast, dann bedeutet das, dass du vor dem Hochladen selbst eine GUID für den Preiseintrag erzeugst und diese GUID auch bei dir lokal speicherst, um den Preiseintrag dann mit dieser GUID wieder zu aktualisieren, richtig ?
Und es ist ja sicherlich klar, dass jeder einzelne Preiseintrag eine eigene GUID braucht… auch wenn es mehrere Preise beim Artikel gibt, hat jeder Eintrag eine eigene ID.
Es wäre wirklich - zumindest für mich - hilfreich, wenn Du mal etwas code postest, bei dem wir dann den Unterschied sehen können, was du beim Einzelartikel postest und was, wenn mehrere Artikel hochgeladen werden. Letztlich würde da für mich überhaupt kein Unterschied bestehen.

Ich habe dir mal 2 Screenshots angehangen um zu zeigen was ich meine.
Ich benutze für beide uploads exakt den selben code. Und genau das ist ja das seltsame. Es wird der gleiche HTTP-Call an den Shop gesendet. Es gibt keinen Unterschied außer, dass wir mehrmals den gleichen HTTP-Call an den Shop senden.

„price“:
[
{
„currencyId“:„b7d2554b0ce847cd82f3ac9bd1c0dfca“,
„gross“:869.8902648778809,
„net“:749.9054007567939,
„linked“:false
}],
„prices“:[
{
„id“:„0051395fad87429a9416cb8731a91bf1“,
„price“:[
{
„currencyId“:„b7d2554b0ce847cd82f3ac9bd1c0dfca“,
„gross“:869.8902648778809,
„net“:749.9054007567939,
„linked“:false
}],
„quantityStart“:1
},
{
„id“:„6151dbdafa0a44e6b5f7f64fd9c88783“,
„price“:[
{„currencyId“:„b7d2554b0ce847cd82f3ac9bd1c0dfca“,
„gross“:599.9119367045064,
„net“:517.1654626762986,
„linked“:false
}],„quantityStart“:1}
]


@BastianHbner
Auf die Gefahr hin, dass ich nerve… aber in deinem Code gibst du nirgendwo eine ruleID mit… wie soll denn ein Eintrag beim Artikel mit einer Preisregel erzeugt werden, wenn du die Regel-ID nicht mitschickst ? Verstehe ich alles nicht… :frowning:

Alles gut keine Sorge bin schon froh dass hier jemand freiwillig helfen möchte :smiley:. Also dadurch, dass ich die ID des Preisregeleintrags übergebe wird dieser hinter dem Artikel gespeichert. Die Preisregel an sich mit Ihrer RuleID ist ja im Shop schon angelegt. Die muss ich ja bei der Artikelanlage nicht mehr anlegen. So hab ich das zumindest verstanden und so funktioniert es ja auch. Zumindest solange wir nur einen Artikel mit Zeit zwischen dem nächsten Hochladen :smiley:

@BastianHbner Bei der Artikelanlage brauchst du die ruleID nicht mitgeben. Da gibt es auch kein Feld für in shopware. Aber bei jedem Anlegen eines erweiterten Preises für einen Artikel musst du die schon mitgeben.

@hloettgen ich möchte aber ja beim Artikel anlegen zeitgleich im selben Call auch den erweiterten Preis mit hinterlegen.

@BastianHbner Das kannst du ja auch tun… das mache ich auch, wenn ich einen Artikel neu hochlade zum Beispiel. Aber du musst dann trotzdem innerhalb des Konstrukts die ruleID mitgeben. Das ist laut Doku ein Pflichtfeld, wenn du erweiterte Preise speichern willst.

@hloettgen aber wie du schon sagst muss man dann vorher immer die alten Preise löschen oder? Kann doch nicht sein, dass das der Standard sein soll

@BastianHbner Entweder löschst du die Preise oder liest vorher die Preis-ID aus und gibst die auch mit. Dann kannst du ja aktualisieren… In meinem Fall geht das nicht, weil ich ja nicht weiß, ob sich in der Warenwirtschaft auch die Staffelung geändert hat etc. Da mir das Prüfen dieser Daten zu aufwändig ist, lese ich vorher die Preis-IDs aus, lösche den Preis und schreibe dann neu.

Hallo,
das ist mein erster Beitrag in diesem Forum, und auch wenn dieser thread schon etwas älter ist, kommt dieses Thema meinem Problem am nächsten…
Also: ich versuche nun auch schon des Längeren Preise und Bestände via api zu aktualisieren; nur stoße ich immer wieder auch auf die hier genannten Probleme und die Lösungen wollen auch nicht so recht funktionieren!
Zu den technischen Details:

  • verwendet wird ShopWare 6.4.3
  • ca. 20k Artikel sind täglich mehrmals zu aktualisieren
  • abgewickelt wird es mittels json

Wie hier auch schon mal beschrieben, funktioniert es beim Einzel-Update wunderbar, nur beim Bulk gibt es Probleme.
Das payload sieht folgendermaßen aus:


# payload
{'quantity': < int >,
 'price': [{'currencyId': < str >,
            'net': < float >,
            'gross': < float >,
            'linked': < bool >}]
}

Möchte ich einen Artikel nun einzeln updaten, sieht der request so aus:


#request
PATCH '< api-url >/product/< product_id >', '< payload >'

… Alles bestens!
Für ein Bulk-Update sieht das payload so aus und verwende ich folgenden request:


#payload
{'update': {'entity': 'product',
            'action': 'upsert',
            'payload': < payload (s.o.) >}
}

#request
POST '< api-url >/_action/sync', '< payload >',
                                 '< headers+={'single-operations': '1',
                                              'indexing-behavior': 'use-queue-indexing'} >

Und dann kommen die Beschwerden über ein leergelassenes Namensfeld…?!


# response (auszugsweise)
{'errors': [{'code': 'c1051bb4-d103-4f74-8988-acbcafc7fdc3',
             'status': '400',
             'detail': 'Dieser Wert sollte nicht leer sein.',
             'meta': {'parameters': {'{{ value }}': 'null'}},
             'source': {'pointer': '/update/0/translations/2fbb5fe2e29a4d70aa5854ce7ce3e20b/name'}},
            {...}]
}

Ich werde da nicht schlau draus; zumal ich überhaupt keinen Namen ändern will.

p.s.: richtig schlimm wird es, wenn ich erweiterte Preise ändern/aktualisieren möchte… siehe: wozu Preisregeln vorher löschen, wenn ich sie denn aktualisieren will?

Grüße schon mal ~

Wenn Du über „sync“ gehst, dann musst Du im Payload auch die id des Produktes packen: Außerdem am besten auch für jedes prices-Objekt eine ID spezifizieren, damit Du diese Objekt dann updaten kannst. Ansonsten legt Shopware in beiden Fällen einen neuen Datensatz an (daher auch die Fehlermeldung aus Deinem sync-Request.

Ja, danke für die schnelle Antwort; da ist mir ein kleiner Fehler unterlaufen…
Beim Bulk sieht das request-payload natürlich auch etwas anders aus:


{'update': {'entity': 'product',
            'action': 'upsert',
            'payload': [{'id': < product_id >,
                         'quantity': < quantity >,
                         'price': [{...}],
                        {...}, ...]
            }
}

Etwas hat sich aber dennoch ergeben: wenn icht nicht alles auf ein mal update, sondern den bulk zu je 100 Artikel durchführe, klappts! Es gibt da scheinbar auch ein Limit, wie beim Abrufen der Artikeldetails (Limit=500).
Also damit kann ich erstmal leben :wink:
Perspektivisch wird es aber noch mal mit den spezifischen Preisen spannend; aber dazu später…

Danke und Grüße