REST-API um Nettobeträge der "specific order" auf Artikelebene erweitern?

Hallo zusammen,

wir haben folgendes Probelm. Immer wenn wir eine Bestellung über die API abrufen (REST API - Examples using the order resource) bekommen wir beim Konten „details“ ja immer in „price“ entweder Brutto- oder Nettopreise, jenachdem wie die Kundengruppe des jeweiligen Shops eingestellt ist.

Nun ist es so das wir sehr viele SubShop und Kundengruppen haben. Ich würde gerne in dem Abruf noch zusätzlich für jeden Artikel(in der Bestellung) den jeweiligen Nettopreis der jeweiligen Kundengruppe haben.

Ich habe mich an das Beispiel der Doku. orientiert. (Extend a REST API resource)

Hier meine Order.php:

Container()->get('dbal_connection');
      $sOrder = "SELECT * FROM `s_order` WHERE `id` LIKE '$id'";
      $resultOnline = $connection->query($sOrder)->fetch();
      $userID = $resultOnline['userID'];
      $sUser = "SELECT * FROM `s_user` WHERE `id` LIKE '$userID'";
      $resultsuser = $connection->query($sUser)->fetch();
      $userGroup = $resultsuser['customergroup'];
      /* Aufruf ganze Bestellung */
      $filters = [['property' => 'orders.id', 'expression' => '=', 'value' => $id]];
      $builder = $this->getRepository()->getOrdersQueryBuilder($filters);
      $sql = $builder->getQuery()->getOneOrNullResult($this->getResultMode());

      $articleNumber = $sql['details'][0]['articleNumber'];

      for($i = 0; $i < count($sql['details']); ++$i){
      $availData = $sql['details'][$i]['articleId'];
      }

        $result = parent::getOne($id);

        foreach($result['details'] as &$order) {
            foreach ($sql['details'] as $key){
            $newarticleNumber = $sql['details']['id'].$key['articleNumber'];
            }
            $order['articleNumberNew1'] = $newarticleNumber;
            $order['articleIdnew'] = $availData;
            $order['userGroup'] = $userGroup;
            $order['userID'] = $userID;


        }

        return $result;

    }
  }

Mein JSON sieht da im „details“ so aus:

"details": [
            {
                "id": 341511,
                "orderId": 283300,
                "articleId": 10218,
                "taxId": 1,
                "taxRate": 19,
                "statusId": 0,
                "number": "38860",
                "articleNumber": "693662",
                "price": 644.77,
                "quantity": 1,
                "articleName": "Apple iPhone 8, gold 64 GB",
                "shipped": 0,
                "shippedGroup": 0,
                "releaseDate": "-0001-11-30T00:00:00+0100",
                "mode": 0,
                "esdArticle": 0,
                "config": "",
                "ean": "0190198451699",
                "unit": "",
                "packUnit": "",
                "attribute": {
                    "id": 257134,
                    "orderDetailId": 341511,
                    "attribute1": "",
                    "attribute2": null,
                    "attribute3": null,
                    "attribute4": null,
                    "attribute5": null,
                    "attribute6": null,
                    "wcomDiscountPercent": null,
                    "wcomDiscountPercentVat": null,
                    "wcomDiscountAbsolut": null,
                    "wcomDiscountAbsolutNetto": null,
                    "wcomDiscountAbsolutVat": null,
                    "swagBonus": false,
                    "emzdeliverytime": "lieferbar in 1-3 Werktagen"
                },
                "articleNumberNew1": "692868",
                "articleIdnew": 9829,
                "userGroup": "HRD",
                "userID": "22130"
            },
            {
                "id": 341512,
                "orderId": 283300,
                "articleId": 9829,
                "taxId": 1,
                "taxRate": 19,
                "statusId": 0,
                "number": "38860",
                "articleNumber": "692868",
                "price": 2262.92,
                "quantity": 1,
                "articleName": "Apple MacBook Pro 15“, Touch Bar, silber (Modell 2017) 3,1 GHz Quad‑Core Intel Core i7 Prozessor, Turbo Boost bis zu 4,1 GHz 256 GB SSD Speicher Radeon Pro 555 mit 2 GB Speicher Deutsch",
                "shipped": 0,
                "shippedGroup": 0,
                "releaseDate": "-0001-11-30T00:00:00+0100",
                "mode": 0,
                "esdArticle": 0,
                "config": "",
                "ean": "",
                "unit": "",
                "packUnit": "",
                "attribute": {
                    "id": 257135,
                    "orderDetailId": 341512,
                    "attribute1": "",
                    "attribute2": null,
                    "attribute3": null,
                    "attribute4": null,
                    "attribute5": null,
                    "attribute6": null,
                    "wcomDiscountPercent": null,
                    "wcomDiscountPercentVat": null,
                    "wcomDiscountAbsolut": null,
                    "wcomDiscountAbsolutNetto": null,
                    "wcomDiscountAbsolutVat": null,
                    "swagBonus": false,
                    "emzdeliverytime": "lieferbar in ca. 2-3 Wochen"
                },
                "articleNumberNew1": "692868",
                "articleIdnew": 9829,
                "userGroup": "HRD",
                "userID": "22130"
            }
        ],

Ich hänge gerade an der foreach Schleife. Der obere Wert wird vom unteren ersetzt. Ich brauche an der Stelle die „articleNumber“. Damit würde ich „SELECT * FROM s_articles_details WHERE ordernumber LIKE ‚693662‘“ machen und mir die ID holen. Danach mit SELECT * FROM s_articles_prices WHERE pricegroup LIKE ‚HRD‘ AND articledetailsID = 22224 und Bingo ich sollte das Array bekommen an der Stelle ‚price‘ der Netto steht. (Mein Gott…warum macht Shopware das so kompliziert!!!)

Kann man das nachvollziehen? Oder ist das der falsche Ansatz? Vll. gibts einen viel einfacheren Weg?

Viele Grüße!

und Danke!

Hallo,

es reicht, wenn du den vorhandenen Doctrine QueryBuilder anreicherst mit einem weiteren join, also genauer gesagt diese Zeile hier:

$builder = $this->getRepository()->getOrdersQueryBuilder($filters);

Die Joins würden dann so in etwa aussehen:

$builder->leftJoin('Shopware\Models\Article\Detail', 'articleDetails', \Doctrine\ORM\Query\Expr\Join::WITH, 'articleDetails.number = details.articleNumber')
        ->leftJoin('Shopware\Models\Article\Price', 'prices', \Doctrine\ORM\Query\Expr\Join::WITH, 'articleDetails.id = prices.articleDetailsId')
        ->addWhere('prices.customerGroupKey = \'HADNEL\'');

Davon ausgegangen, dass dein s_order_details alias “details” lautet.

 

PS: Außerdem brauchst du kein LIKE, wenn du keine Wildcards verwendest, dann kannst Du auch gleich auf Gleichheit prüfen, ist das selbe.

 

 

MFG

 

derwunner

Moin!

Danke für die schnelle Hilfe!

habe es jetzt so umgeschrieben um zu testen…leider bekomme ich ein leeres JSON bzw. NULL zurück?..

class Order extends \Shopware\Components\Api\Resource\Order
{
    /**
     * @inheritdoc
     */
    public function getOne($id)
    {
      $connection = Shopware()->Container()->get('dbal_connection');
      $sOrder = "SELECT * FROM `s_order` WHERE `id` LIKE '$id'";
      $resultOnline = $connection->query($sOrder)->fetch();
      $userID = $resultOnline['userID'];
      $sUser = "SELECT * FROM `s_user` WHERE `id` LIKE '$userID'";
      $resultsuser = $connection->query($sUser)->fetch();
      $userGroup = $resultsuser['customergroup'];
      /* Aufruf ganze Bestellung */
      $filters = [['property' => 'orders.id', 'expression' => '=', 'value' => $id]];
      $builder = $this->getRepository()->getOrdersQueryBuilder($filters);
      $builder->leftJoin('Shopware\Models\Article\Detail', 'articleDetails', \Doctrine\ORM\Query\Expr\Join::WITH, 'articleDetails.number = details.articleNumber')
        ->leftJoin('Shopware\Models\Article\Price', 'prices', \Doctrine\ORM\Query\Expr\Join::WITH, 'articleDetails.id = prices.articleDetailsId')
        ->andWhere('prices.customerGroupKey = \'HADNEL\'');
       $sql = $builder->getQuery()->getOneOrNullResult($this->getResultMode());

      $articleNumber = $sql['details'][0]['articleNumber'];

      for($i = 0; $i < count($sql['details']); ++$i){
      $availData = $sql['details'][$i]['articleId'];
      }

      $result = parent::getOne($id);

        foreach($result['details'] as &$order) {
            foreach ($sql['details'] as $key){
            $newarticleNumber = $sql['details']['id'].$key['articleNumber'];
            }
            $order['articleNumberNew1'] = $newarticleNumber;
            $order['articleIdnew'] = $availData;
            $order['userGroup'] = $userGroup;
            $order['userID'] = $userID;
            $order['TestNeu'] = $builder;
            $order['TestNeu2'] = $sql;


        }

         return $result;

    }
  }

mein JSON:

"details": [
            {
                "id": 341507,
                "orderId": 283298,
                "articleId": 10219,
                "taxId": 1,
                "taxRate": 19,
                "statusId": 0,
                "number": "38859",
                "articleNumber": "693658",
                "price": 799.002,
                "quantity": 1,
                "articleName": "Apple iPhone 8, silber 64 GB",
                "shipped": 0,
                "shippedGroup": 0,
                "releaseDate": "-0001-11-30T00:00:00+0100",
                "mode": 0,
                "esdArticle": 0,
                "config": "",
                "ean": "0190198451330",
                "unit": "",
                "packUnit": "",
                "attribute": {
                    "id": 257130,
                    "orderDetailId": 341507,
                    "attribute1": "",
                    "attribute2": null,
                    "attribute3": null,
                    "attribute4": null,
                    "attribute5": null,
                    "attribute6": null,
                    "wcomDiscountPercent": null,
                    "wcomDiscountPercentVat": null,
                    "wcomDiscountAbsolut": null,
                    "wcomDiscountAbsolutNetto": null,
                    "wcomDiscountAbsolutVat": null,
                    "swagBonus": false,
                    "emzdeliverytime": "lieferbar in 1-3 Werktagen"
                },
                "articleNumberNew1": null,
                "articleIdnew": null,
                "userGroup": "EK",
                "userID": "21161",
                "TestNeu": {},
                "TestNeu2": null
            },
            {
                "id": 341508,
                "orderId": 283298,
                "articleId": 9829,
                "taxId": 1,
                "taxRate": 19,
                "statusId": 0,
                "number": "38859",
                "articleNumber": "692904",
                "price": 4959.004,
                "quantity": 1,
                "articleName": "Apple MacBook Pro 15“, Touch Bar, silber (Modell 2017) 3,1 GHz Quad‑Core Intel Core i7 Prozessor, Turbo Boost bis zu 4,1 GHz 2 TB SSD Speicher Radeon Pro 560 mit 4 GB Speicher Deutsch",
                "shipped": 0,
                "shippedGroup": 0,
                "releaseDate": "-0001-11-30T00:00:00+0100",
                "mode": 0,
                "esdArticle": 0,
                "config": "",
                "ean": "",
                "unit": "",
                "packUnit": "",
                "attribute": {
                    "id": 257131,
                    "orderDetailId": 341508,
                    "attribute1": "",
                    "attribute2": null,
                    "attribute3": null,
                    "attribute4": null,
                    "attribute5": null,
                    "attribute6": null,
                    "wcomDiscountPercent": null,
                    "wcomDiscountPercentVat": null,
                    "wcomDiscountAbsolut": null,
                    "wcomDiscountAbsolutNetto": null,
                    "wcomDiscountAbsolutVat": null,
                    "swagBonus": false,
                    "emzdeliverytime": "lieferbar in ca. 2-3 Wochen"
                },
                "articleNumberNew1": null,
                "articleIdnew": null,
                "userGroup": "EK",
                "userID": "21161",
                "TestNeu": {},
                "TestNeu2": null
            }
        ],

Habe da wohl ein Denkfehler?? Kannst mir da weiter helfen?

Gruß und danke!

ich glaube ich denke viel zu kompliziert…? Eigentlich will ich nur den Nettopreis des jeweiligen Artikels haben… :-/