Shopware 6: Netto–/Bruttopreise basierend auf Business-/Private-Auswahl anzeigen

Inhalt
Ich habe eine CustomSalesChannelContextFactory implementiert, um basierend auf der Auswahl „business“ oder „private“ im Cookie den Preis netto bzw. brutto anzuzeigen:

public function create(string $token, string $salesChannelId, array $options = []): SalesChannelContext
{
    $request = $this->requestStack->getCurrentRequest();
    if (!$request) {
        return $this->decorated->create($token, $salesChannelId, $options);
    }

    $customerType = $request->cookies->get('customer-type')
        ?? $request->headers->get('customer-type');

    if (!in_array($customerType, ['business', 'private'], true)) {
        return $this->decorated->create($token, $salesChannelId, $options);
    }

    $options['customerGroupId'] = $customerType === 'business'
        ? '0193b9f622ac7073a66584f14f56cc25'
        : 'cfbd5018d38d41d8adca10d94fc8bdd6';

    $newToken = bin2hex(random_bytes(16));
    $this->contextPersister->save(
        $newToken,
        ['customerGroupId' => $options['customerGroupId']],
        $salesChannelId
    );

    return $this->decorated->create($newToken, $salesChannelId, $options);
}

Erwartung: Im Frontend ändert sich die customerGroupId entsprechend der Auswahl und die Preise werden netto bzw. brutto korrekt aktualisiert.
Tatsächlich: Die customerGroupId ändert sich weder in den Logs noch im Storefront.
Gesuchte Hilfe:
Wie kann ich in dieser Factory die customerGroupId aus dem Cookie endgültig überschreiben, sodass in allen Storefront-Anfragen die korrekten Preise angezeigt werden?

Hallo @o.kocakaplan ,

mir erschließt sich die Idee ehrlich gesagt überhaupt nicht. Was möchtest du damit bezwecken?

Falls du einen speziellen Use-Case hast, gerne mal beschreiben, aber meiner Meinung nach musst du dafür nichts programmieren, da es der Shopware Standard abbildet und diese Einstellung grundsätzlich keine 5 Minuten dauert.

Du kannst Brutto/Netto standardmäßig anhand der Kundengruppen anzeigen lassen:

Privat oder Business-Auswahl sind ja im Grunde „zwei Kundengruppen“.

Viele Grüße
Marco Schäfer

  • Webentwicklung Schäfer

Akteur

  • Besucher (anonymer Benutzer)

Vorbedingungen

  • Dieses Szenario gilt für anonyme Benutzer.
  • Beim ersten Zugriff ist die Gruppe „Privat“ aktiv und die Preise werden als Bruttopreise angezeigt.
  • Für „Privat“ und „Geschäftlich“ sind im Hintergrund zwei verschiedene Kundengruppen definiert.

Auslöser

  • Öffnet der Besucher die Seite, sieht er automatisch sowohl die Preisangaben als auch die Auswahlmöglichkeit „Privat / Geschäftlich“.

Hauptszenario

  • Seite laden & Auswahl anzeigen
    • Der Besucher ruft die Seite auf.
    • Auf dem Bildschirm erscheint automatisch der Toggle bzw. Button „Privat / Geschäftlich“.
  • Die Preise werden standardmäßig als Bruttopreise (Privat) dargestellt.
  • Benutzer wählt „Geschäftlich“
    • Der Besucher stellt den Toggle auf „Geschäftlich“.
  • Kontext erneuern & Preise aktualisieren
    • Das System erkennt die neue Kundengruppe „Geschäftlich“ und lädt den Kontext neu.
    • Ohne Neuladen der Seite werden sofort Nettopreise angezeigt.
  • Benutzer wechselt zurück zu „Privat“
    • Der Toggle wird wieder auf „Privat“ gestellt.
    • Der Kontext wird erneut aktualisiert und die Preise erscheinen sofort wieder als Bruttopreise.

Dafür gibt es im Store Plugins - also das man B2C und B2B gleichermaßen betreiben kann.

Dafür kannst du im einfachen Fall ein relativ einfaches Plugin schreiben, mit dem du per URL-Parameter zwischen Netto/Brutto umschalten kannst (z.B. ?switchTo=net / ?switchTo=gross).

Dafür musst du auf das Event SalesChannelContextCreatedEvent::class subscriben, darin den URL-Parameter abfragen, ggf in einer Session speichern und dann folgendes aufrufen:

$salesChannelContext->setTaxState($switchTo);

Zusätzlich solltest du dann den Cache-Key mit dem Event HttpCacheKeyEvent::class um diese Information erweitern