dominikkdominikk MemberComments: 2 Received thanks: 1 Member since: May 2020

Guten Tag,

Wie erstelle ich über die Shopware 6 Rest API eine erweiterte Preisregel für ein Produkt? Ich möchte für Händler die Preise importieren und dies wird ja in Shopware über die erweiterten Preise als eigene Regel gelöst.

Ich hätte mir hierzu auch schon eine Regel im Backend angelegt, per API angezeigt und das Json 1 zu 1 nachgebaut. Allerdings funktioniert es so über die "listingPrices" nicht.
Fehler: Internal Server Error [detail] => Price rules json field will be set by indexer

Mfg,
Dominik

Answers

  • hloettgenhloettgen MemberComments: 28 Received thanks: 8 Member since: March 2012

    Hallo, ich habe das so gelöst:

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

     

  • ebcomebcom MemberComments: 11 Received thanks: 2 Member since: August 2019

    Das hat bei mir leider nicht funktioniert, welchen Endpoint und welche Methode hast du hier verwendet.

    Ich habe den Endpoint product mit der Methode POST verwendet.

     

  • hloettgenhloettgen MemberComments: 28 Received thanks: 8 edited July 2020 Member since: March 2012

    Welche Fehlermeldung hast du denn erhalten ? Endpoint ist bei mir ebenfalls product... ruleId und currencyId muss natürlich an deinen Shop angepasst werden. 

    Ich poste in der Regel über die sync API, dann sind das nicht so viele Calls... das ist deutlich performanter... 

     

  • ebcomebcom MemberComments: 11 Received thanks: 2 Member since: August 2019

    Fehlermeldung: 

    [code] => 0
    [status] => 500
    [title] => Internal Server Error
    [detail] => Cannot unset string offsets
    [file] => /var/www/html/vendor/shopware/core/Framework/DataAbstractionLayer/FieldSerializer/PriceFieldSerializer.php
    [line] => 48

     

    Mein Post sieht folgendermaßen aus:

     

                [action] => upsert
                [entity] => product
                [payload] => Array
                    (
                        [0] => stdClass Object
                            (
                                [categories] => Array
                                    (
                                        [0] => stdClass Object
                                            (
                                                [id] => f2c4740c5f3c44d9b7c61d22ad391802
                                            )
                                    )
                                [productNumber] => Artikelnr
                                [id] => 74f098bb72c24f58aafaa651fe134e09
                                [description] => Testdescription
                                [keywords] => 
                                [name] => abcdefg
                                [stock] => 0
                                [taxId] => 39e11bdb0d1f4305b7a890fd4cf08579
                                [price] => Array
                                    (
                                        [0] => stdClass Object
                                            (
                                                [currencyId] => b7d2554b0ce847cd82f3ac9bd1c0dfca
                                                [gross] => xxx
                                                [net] => yyy
                                                [linked] => 1
                                                [listPrice] => stdClass Object
                                                    (
                                                        [currencyId] => b7d2554b0ce847cd82f3ac9bd1c0dfca
                                                        [gross] => aaa
                                                        [net] => bbb
                                                        [linked] => 1
                                                    )
                                            )
                                    )
                                [prices] => Array
                                    (
                                        [0] => stdClass Object
                                            (
                                                [quantityStart] => 1
                                                [ruleId] => 403bd142ac0b49fd9f6f60bbeeb6b126
                                                [price] => stdClass Object
                                                    (
                                                        [currencyId] => b7d2554b0ce847cd82f3ac9bd1c0dfca
                                                        [gross] => 609.75
                                                        [net] => 512.39
                                                        [linked] => 1
                                                    )
                                            )
                                    )
                            )
                    )
    
  • hloettgenhloettgen MemberComments: 28 Received thanks: 8 edited July 2020 Member since: March 2012

    Was ich so als Unterschied sehe ist, dass du die entity [price] nicht als array übergibst. 

    in meinem funktionierenden Beispiel ist das so: 

    Eckige Klammer definiert einen Array... geschweifte ein Objekt.  

    Bei dir fehlt nach price der Array-Beginn. 

    "price":[
                {
                   "currencyId":"b7d2554b0ce847cd82f3ac9bd1c0dfca",
                   "net":13.44,
                   "linked":true,
                   "gross":15.99
                }
             ],

     

     

     

    Thanked by 1ebcom
  • ebcomebcom MemberComments: 11 Received thanks: 2 Member since: August 2019

    Super hat geklappt, das war das Problem:

    [prices] => Array
    (
       [0] => stdClass Object
       (
          [quantityStart] => 1
          [ruleId] => 403bd142ac0b49fd9f6f60bbeeb6b126
          [price] => stdClass Object
          (
             [currencyId] => b7d2554b0ce847cd82f3ac9bd1c0dfca
             [gross] => 609.75
             [net] => 512.39
             [linked] => 1
          )
       )
    )

    Problem ist nun das dabei immer wieder ein Preis dazukommt, gibt es eine Möglichkeit alle vorhandenen vorher zu entfernen ohne jeden einzelnen Preis anzupacken, da das ganze über die sync-API läuft?

  • hloettgenhloettgen MemberComments: 28 Received thanks: 8 edited July 2020 Member since: March 2012
    Problem ist nun das dabei immer wieder ein Preis dazukommt, gibt es eine Möglichkeit alle vorhandenen vorher zu entfernen ohne jeden einzelnen Preis anzupacken, da das ganze über die sync-API läuft?

    Dazu habe ich leider auch noch keinen Weg gefunden und auch hier im Forum eine Anfrage an die Wissenden gestellt... aber leider noch keine Antwort erhalten. 

    https://forum.shopware.com/discussion/70342/staffelpreise-aktualisieren#latest

    Ich hole mir tatsächlich derzeit immer alle IDs der Preise und lösche die zunächst, bevor ich sie neu schreibe... in meinem Fall sogar noch etwas aufwändiger, weil es sich bei mir wirklich um Staffelpreise aus 6 Preisregeln handelt...  

  • ebcomebcom MemberComments: 11 Received thanks: 2 Member since: August 2019

    Machst du das auch über die sync-API? 

    Hast du da evtl. ein Beispiel für mich?

  • hloettgenhloettgen MemberComments: 28 Received thanks: 8 edited July 2020 Member since: March 2012

    Ja, habe ich :-)

    Das hier schicke ich als Payload über die sync API... allerdings hole ich mir vorher über einen gesamten Dump die Preis-IDs der betroffenen zu aktualisierenden Einträge und speichere mir die zur Verarbeitung in einem record. 

    Letztlich schicke ich in einem Block die deletes und dann anschliessend die inserts ... alles in einem Payload. 

    Hier mein Payload:

    {
       "delete-prices-10013363-1":{
          "entity":"product_price",
          "action":"delete",
          "payload":[
             {
                "productId":"f6d7a38eea064818bbba1b8dd0b7328d",
                "id":"5f8f5991f3ad4785a8aea276a08e0a2a"
             },
             {
                "productId":"f6d7a38eea064818bbba1b8dd0b7328d",
                "id":"e05a760ac0654823a53d41fa57207056"
             },
             {
                "productId":"f6d7a38eea064818bbba1b8dd0b7328d",
                "id":"e1515f82dab3445b88957adba9d0c5ba"
             }
          ]
       },
       "insert-prices-10013363-1":{
          "entity":"product_price",
          "action":"upsert",
          "payload":[
             {
                "productId":"f6d7a38eea064818bbba1b8dd0b7328d",
                "ruleId":"92c24dd21c13419c8275a65f48d19975",
                "price":[
                   {
                      "currencyId":"b7d2554b0ce847cd82f3ac9bd1c0dfca",
                      "net":1.79,
                      "linked":true,
                      "gross":2.1301
                   }
                ],
                "quantityStart":1,
                "quantityEnd":71
             },
             {
                "productId":"f6d7a38eea064818bbba1b8dd0b7328d",
                "ruleId":"92c24dd21c13419c8275a65f48d19975",
                "price":[
                   {
                      "currencyId":"b7d2554b0ce847cd82f3ac9bd1c0dfca",
                      "net":1.69,
                      "linked":true,
                      "gross":2.0111
                   }
                ],
                "quantityStart":72,
                "quantityEnd":215
             },
             {
                "productId":"f6d7a38eea064818bbba1b8dd0b7328d",
                "ruleId":"92c24dd21c13419c8275a65f48d19975",
                "price":[
                   {
                      "currencyId":"b7d2554b0ce847cd82f3ac9bd1c0dfca",
                      "net":1.49,
                      "linked":true,
                      "gross":1.7731
                   }
                ],
                "quantityStart":216,
                "quantityEnd":null
             }
          ]
       },
       "delete-prices-10013363-3":{
          "entity":"product_price",
          "action":"delete",
          "payload":[
             {
                "productId":"f6d7a38eea064818bbba1b8dd0b7328d",
                "id":"a5b72035697d40bb8e67da9370f66c6c"
             }
          ]
       },
       "insert-prices-10013363-3":{
          "entity":"product_price",
          "action":"upsert",
          "payload":[
             {
                "productId":"f6d7a38eea064818bbba1b8dd0b7328d",
                "ruleId":"b689215513f94d199e112248173557c5",
                "price":[
                   {
                      "currencyId":"b7d2554b0ce847cd82f3ac9bd1c0dfca",
                      "net":1.49,
                      "linked":true,
                      "gross":1.7731
                   }
                ],
                "quantityStart":1,
                "quantityEnd":null
             }
          ]
       },
    }

    Hier noch der Link zur offiziellen Doku, wo auch beschrieben steht, warum ich keys verwende... wie "insert-prices-10013363-3"

    https://docs.shopware.com/en/shopware-platform-dev-en/admin-api-guide/sync-api

    Grüße

    Holger 

    Thanked by 1ebcom
  • ebcomebcom MemberComments: 11 Received thanks: 2 Member since: August 2019

    Perfekt,

    wusste nicht dass man product_price auch als entity mit der Sync-API verwenden kann

  • balrambalram MemberComments: 40 Received thanks: 1 edited August 2020 Member since: July 2020

    @hloettgen

    Wenn ich das so mache wie du in dem /product POST Aufruf, dann kommt der fehler, dass price nicht leer sein darf

    was muss in price rein?

    Gruß

    balram

  • hloettgenhloettgen MemberComments: 28 Received thanks: 8 Member since: March 2012

    @balram

    Poste doch bitte mal deinen Payload... dann sehen wir bestimmt, wo das Problem sein kann... 

    "price" ist ja in jedem Fall ein array... 

    Grüße

    Holger 

  • balrambalram MemberComments: 40 Received thanks: 1 Member since: July 2020

    Hallo Holger,

    Es funktioniert jetzt. man muss den "price" array hinzufügen habe ihn vorher weggelassen, da ich ja schon "prices" hatte. man braucht den für "price" aber trotzdem.

    Gruß

    balram

Sign In or Register to comment.