Zum Hauptinhalt springen

OCI Response Generator

Der OciConnectorResponseGenerator erzeugt aus dem Warenkorb eine OciFormData-Struktur, die im Storefront-Template als HTML-Formular gerendert wird und beim Transfer an die Hook-URL des Procurement-Systems gesendet wird.


buildForm()

public function buildForm(
Cart $cart,
OciSystemEntity $system,
ConnectorSession $session,
SalesChannelContext $context
): OciFormData

Ablauf:

  1. Für jede Warenkorbposition → passenden LineItemContextResolver suchen
  2. Für jedes OCI-Feld mit Target LINE_ITEM: Wert über Fallback-Kette auflösen + Filter anwenden
  3. Optional: Versandposition anhängen (wenn attachShipping aktiv und Lieferungen vorhanden)
  4. OciResponseGenerationEvent feuern → OciFormData kann noch modifiziert werden

OciFormData-Struktur

OciFormData
├── hookUrl (string) – Rückgabe-URL des Procurement-Systems
└── lineItems[] (list)
└── OciLineItemData
└── fields[]
└── OciFieldData
├── name (string) – z.B. "NEW_ITEM-DESCRIPTION[1]"
├── value (string) – aufgelöster Wert
└── type (OciFieldType: standard|long)

Feldname-Konvention

OCI-Feldnamen werden nach folgendem Schema gebildet:

Standard-Felder:

NEW_ITEM-{FELDNAME_UPPERCASE}[{INDEX}]

Long-Text-Felder (OciFieldType::LONG):

NEW_ITEM-{FELDNAME_UPPERCASE}[{INDEX}]:132[]

Der Suffix :132[] ist der OCI 5.0 Long-Text-Marker für Felder, die den Standard-Zeichenlimit überschreiten.

Beispiele:

  • NEW_ITEM-DESCRIPTION[1] (Standard)
  • NEW_ITEM-MATNR[1] (Standard)
  • NEW_ITEM-LONGTEXT[1]:132[] (Long-Text)

Der Index ([1], [2], …) entspricht der Position des LineItems im Warenkorb.


Field-Targets

Jedes OCI-Feld hat einen konfigurierten Target:

TargetEnumBeschreibung
line_itemOciFieldTarget::LINE_ITEMFeld gehört zu einer Warenkorbposition
shipping_itemOciFieldTarget::SHIPPING_ITEMFeld für die Versandposition (nur wenn attachShipping aktiv)

Die Versandposition wird als eigenständige OCI-Position ans Ende der LineItems angefügt.


Wert-Filter

Nach der Fallback-Auflösung können optionale Filter auf den Wert angewendet werden:

FilterKonfigurationBeschreibung
Substringsubstr.start, substr.endSchneidet den String auf den definierten Bereich zu
Zahlenformatnumber_format, decimalsFormatiert den Wert als Dezimalzahl mit definierten Nachkommastellen (Punkt als Trennzeichen, kein Tausender-Trennzeichen)
Dividierendivine.valueDividiert den numerischen Wert durch den angegebenen Divisor

OciResponseGenerationEvent

Kurz vor der Rückgabe der OciFormData feuert der Generator:

EventEvent-NameWas kann geändert werden?
OciResponseGenerationEventagiqon_connector.oci.response.generationKomplette OciFormData (LineItems hinzufügen, ändern, entfernen)

Beispiel:

use AgiqonConnector\Connector\System\OCI\Event\OciResponseGenerationEvent;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;

#[AsEventListener(event: OciResponseGenerationEvent::EVENT_NAME)]
final class MyOciResponseListener
{
public function __invoke(OciResponseGenerationEvent $event): void
{
$formData = $event->getFormData();

// Eigene Logik: z.B. LineItems anpassen
// $event->setFormData($modifiedFormData);
}
}