# Wie weise ich eine Shipping Methode Programm gesteuert zu

**URL:** <https://forum.shopware.com/t/wie-weise-ich-eine-shipping-methode-programm-gesteuert-zu/103182>\
**Category:** Shopware 6 (German)\
**Created:** [1. März 2024 um 23:16 UTC](https://forum.shopware.com/t/wie-weise-ich-eine-shipping-methode-programm-gesteuert-zu/103182 "2024-03-01T23:16:09Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![kipp.thomas](https://avatars.discourse-cdn.com/v4/letter/k/e9bcb4/32.png) [@kipp.thomas](https://forum.shopware.com/u/kipp.thomas)\
**Post date:** [1. März 2024 um 23:16 UTC](https://forum.shopware.com/t/wie-weise-ich-eine-shipping-methode-programm-gesteuert-zu/103182/1 "2024-03-01T23:16:09Z")

</div>

Hallo, versuche mit folgendem Code die Versandmethode zuzuweisen, scheitere aber. Es gibt keine Exception und kein Error, es tut sich nur nix. Was mache ich falsch?

```auto
<?php declare(strict_types=1);

namespace WtShippingCalc\Core\Checkout\Cart;

use JetBrains\PhpStorm\NoReturn;
use Shopware\Core\Checkout\Cart\Cart;
use Shopware\Core\Checkout\Cart\CartBehavior;
use Shopware\Core\Checkout\Cart\CartProcessorInterface;
use Shopware\Core\Checkout\Cart\LineItem\CartDataCollection;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use ShippingCalc\Service\ContactDatabaseShipping;
use Shopware\Core\Framework\Context;
use Shopware\Core\System\SalesChannel\SalesChannel\SalesChannelContextSwitcher;
use Shopware\Core\Framework\Validation\DataBag\DataBag;

class ShippingProcessor implements CartProcessorInterface
{
    private SalesChannelContextSwitcher $contextSwitcher;
    private SystemConfigService $systemConfigService;
    private ContactDatabaseShipping $database;

    public function __construct(SalesChannelContextSwitcher $contextSwitcher, SystemConfigService $systemConfigService, ContactDatabaseShipping $database)
    {
        $this->contextSwitcher = $contextSwitcher;
        $this->systemConfigService = $systemConfigService;
        $this->database = $database;
    }
    #[NoReturn] public function process(CartDataCollection $data, Cart $original, Cart $toCalculate, SalesChannelContext $context, CartBehavior $behavior): void
    {
        /* !! ACHTUNG !! ACHTUNG !! !! ACHTUNG !! ACHTUNG !! !! ACHTUNG !! ACHTUNG !! !! ACHTUNG !! ACHTUNG !! !! ACHTUNG !! ACHTUNG !!
            Nicht vergessen: $_SESSION['itemsDuble'] nach dem Checkout/Bezahlvorgang ODER(!) dem Abbruch in den entsprechenden Subscriber
            unbedingt löschen!!
        */
        $LaengeVorgabe = $this->systemConfigService->get('WtShippingCalc.config.laenge', null);
        $HoeheVorgabe = $this->systemConfigService->get('WtShippingCalc.config.hoehe', null);
        $BreiteVorgabe = $this->systemConfigService->get('WtShippingCalc.config.breite', null);
        $spezOneVorgabe = $LaengeVorgabe * $BreiteVorgabe * $HoeheVorgabe;
        $spezTwoVorgabe = $this->systemConfigService->get('WtShippingCalc.config.gewicht', null);
        if (session_status() === PHP_SESSION_NONE)
            session_start();
        //um der nachträglichen Hinzufügung von Artikeln in den Warenkorb gerecht zu werden, wird mit 2 SESSION-Arrays gearbeitet
        if (!empty($_SESSION['itemsDuble'])) {
            $orderGewicht = $_SESSION['items'][0] + $_SESSION['itemsDuble'][0];
            $orderLaenge = $_SESSION['items'][1] + $_SESSION['itemsDuble'][1];
            $orderBreite = $_SESSION['items'][2] + $_SESSION['itemsDuble'][2];
            $orderHoehe = $_SESSION['items'][3] + $_SESSION['itemsDuble'][3];
            $_SESSION['itemsDuble'][0] = $orderGewicht;
            $_SESSION['itemsDuble'][1] = $orderLaenge;
            $_SESSION['itemsDuble'][2] = $orderBreite;
            $_SESSION['itemsDuble'][3] = $orderHoehe;
        } else {
            $_SESSION['itemsDuble'] = $_SESSION['items'];
        }
        $spezOneOrder = $_SESSION['itemsDuble'][1] * $_SESSION['itemsDuble'][2] * $_SESSION['itemsDuble'][3];
        $spezTwoOrder = $_SESSION['itemsDuble'][0];
        //hole alle Shippingobjekte und packe sie in ein Array
        $shippingMethods = $this->database->readTableShipping(Context::createDefaultContext());
        foreach ($shippingMethods as $key => $value) {
            $arShippingId[] = $key;
            $arShippingObj[] = $value;
        }
        /* in arShippingObj sind alle relevanten Shipping-Objekte. Je nach Abgleich soll das erste oder zweite Objekt verwendet
            werden! Trifft kein Kriterium zu, wird, sofern vorhanden, das dritte Objekt(Versandmethode) verwendet.
        */
        if (isset($arShippingId) && isset($arShippingObj) && count($arShippingId) == 2) {
           $obj = $this->DecideShippingFromTwo($spezOneOrder, $spezOneVorgabe, $spezTwoOrder, $spezTwoVorgabe, $arShippingObj, $context);
        } elseif (isset($arShippingId) && isset($arShippingObj) && count($arShippingId) > 2) {
            $obj = $this->DecideShippingFromMoreThanTwo($spezOneOrder, $spezOneVorgabe, $spezTwoOrder, $spezTwoVorgabe, $arShippingObj, $context, $original, $toCalculate);
        }
        $data->set($obj->getId(), $obj);
        $this->assignShippingObject($obj, $context);
    }

    #[NoReturn] private function DecideShippingFromTwo(float $spezOne, int $spezVorgabeOne, float $spezTwo, int $SpezVorgabeTwo, array $arShippingObj, SalesChannelContext $context): void
    {
        /* spezOne mit spezVorgabeOne abgleichen; spezTwo mit spezVorgabeTwo abgleichen, um zu eruieren, welche
            Versandmethode ausgewählt werden soll
        */
        foreach ($arShippingObj as $item) {
            if (str_contains(strtolower($item->getName()), 'volume')) {
                $shipingVolumeObj = $item;
            } else {
                $shipingObjStandard = $item;
            }
        }
        //jetzt sind die ShippingObjekte aus dem Array gezogen und zugewiesen. Verwende Sie je nach Auswertung der Übergabeparameter
        if (isset($shipingVolumeObj) && $spezOne >= $spezVorgabeOne) {
            $shippingObject = $shipingVolumeObj;
        } else {
            $shippingObject = $shipingObjStandard;
        }
 if (isset($shippingObject)) {
            $deliveries = $original->getDeliveries();
            $deliveries->first()->setShippingMethod($shippingObject);
            $toCalculate->setDeliveries($deliveries);
            $original->setDeliveries($deliveries);
        }
        return $shippingObject;

    #[NoReturn] private function DecideShippingFromMoreThanTwo(float $spezOne, int $spezVorgabeOne, float $spezTwo, int $spezVorgabeTwo, array $arShippingObj, SalesChannelContext $context, Cart $original, Cart $toCalculate): object
    {
        /* spezOne mit spezVorgabeOne abgleichen; spezTwo mit spezVorgabeTwo abgleichen, um zu eriuieren, welche
            Versandmethode ausgewählt werden soll
        */
        foreach ($arShippingObj as $item) {
            if (str_contains(strtolower($item->getName()), 'weight')) {
                $shipingWeightObj = $item;
            } elseif (str_contains(strtolower($item->getName()), 'volume')) {
                $shipingVolumeObj = $item;
            } else {
                $shipingObjStandard = $item;
            }
        }
        //jetzt sind die ShippingObjekte aus dem Array gezogen und zugewiesen. Verwende Sie je nach Auswertung der Übergabeparameter
        if (isset($shipingVolumeObj) && $spezOne >= $spezVorgabeOne) {
            $shippingObject = $shipingVolumeObj;
        } elseif (isset($shipingWeightObj) && $spezTwo > $spezVorgabeTwo) {
            $shippingObject = $shipingWeightObj;
        } elseif (isset($shipingObjStandard)) {
            $shippingObject = $shipingObjStandard;
        }
        if (isset($shippingObject)) {
            $deliveries = $original->getDeliveries();
            $deliveries->first()->setShippingMethod($shippingObject);
            $toCalculate->setDeliveries($deliveries);
            $original->setDeliveries($deliveries);
        }
        return $shippingObject;
    }

    //jetzt wurde das Versandobjekt bestimmt. Verbleibt noch die Zuweisung an den SalesChannel.
    #[NoReturn] private function assignShippingObject(object $shippingObject, SalesChannelContext $context): void
    {
        $folder = getcwd();
        $file = 'output.txt';
        $output = $folder . DIRECTORY_SEPARATOR . $file;
        $name = $shippingObject->getName();
        file_put_contents($output, "$name shipping has been used sending product", FILE_APPEND);
        file_put_contents($output, PHP_EOL, FILE_APPEND);
        $shippingId = $shippingObject->getId();
        $contextToken = $context->getToken();
        $dataBag = new DataBag([
            'id' => $shippingId,
        ]);
        $this->contextSwitcher->update($dataBag, $context);
        $salesChannels = $this->database->readTableSalesChannel(Context::createDefaultContext());
        // Prepare the data for updating sales channels
        foreach ($salesChannels as $salesChannel) {
            $shippingMethods = $salesChannel->getShippingMethods();
            $shippingMethodIds = [];
            foreach ($shippingMethods as $shippingMethod) {
                $shippingMethodIds[] = ['id' => $shippingObject->getId()];
            }

        }
        $salesChannelData[] = [
            'id' => $salesChannel->getId(),
            'shippingMethods' => $shippingMethodIds,
        ];
        $this->database->updateSalesChannel(Context::createDefaultContext(), $salesChannelData);
    }
}

```
