Zum Hauptinhalt springen

Architektur

Der AgiqonConnector ist ein Shopware 6 Plugin, das den Shop als Katalog-Quelle für Procurement-Systeme zugänglich macht.


Unterstützte Protokolle​

ProtokollVersion
OCI4.0
OCI5.0
cXML1.2 (PunchOut)

Systemvoraussetzungen​

PHP^8.2
Shopware~6.7 (Plugin 3.7.x, aktuell 3.7.500)
Shopware~6.6 (Plugin 3.6.x, aktuell 3.6.300)

Ablauf​

1. Login​

Procurement-System
│
│ OCI: HTTP POST mit Login-Parametern
│ cXML: HTTP POST mit PunchOut Setup Request (XML)
▼
OciLoginController / CxmlAuthController
│ – Authentifizierung prüfen
│ – ConnectorSession aufbauen (system, hookUrl, additionalFields, …)
│ – ConnectorSession im Symfony Session-Store ablegen
│ – OciSessionLoginEvent / CxmlSessionLoginEvent feuern
▼
TransmissionSubscriber.onLogin()
│ – Neue ConnectorTransmissionEntity anlegen
│ (oder bestehende wiedereröffnen, wenn transmissionId vorhanden)
▼
Shopware-Storefront (Browser des Käufers)

2. Aktiver Einkauf​

Käufer navigiert durch den Shop
│
│ Bestimmte Routen (Checkout, Account) sind blockiert
│ → Redirect zur Warenkorbseite
│
▼
Warenkorbseite
│ OCI: OciConnectorResponseGenerator::buildForm()
│ cXML: CxmlConnectorResponseGenerator::buildPunchOutOrderMessage()
│
│ DataFieldRegistry löst für jede Warenkorbposition alle
│ konfigurierten Felder auf (Preis, Beschreibung, MATNR, …)
▼
Transfer-Formular (OCI) / PunchOutOrderMessage-Preview (cXML)

3. Transfer​

Käufer klickt "Transfer"
│
│ POST /agiqon/connector/session/logout?transferred=1
▼
ConnectorTransferEvent feuern
│ TransmissionSubscriber.onTransfer()
│ → Warenkorb-Payload in Transmission.cartPayload speichern
▼
ConnectorSessionLogoutEvent feuern
│ TransmissionSubscriber.onLogout()
│ → Status: Transferred
│ → TransmissionMode::Auto: Shopware-Bestellung erstellen
│ Session + Warenkorb löschen
▼
OCI: HTML-Formular wird an hookUrl des Procurement-Systems gesendet
cXML: PunchOutOrderMessage wird im Twig-Template zurückgegeben

Erweiterungspunkte​

PunktMechanismus
Eigene Felder anlegenCustom AbstractDataField + Service-Tag agiqon_connector.data_field
Eigene Feldtypen anlegenCustom Enum mit DataFieldTypeInterface + Custom LineItemContextResolver
OCI Response vor Rückgabe ändernListener auf OciResponseGenerationEvent
cXML Response vor Rückgabe ändernListener auf CxmlResponseGenerationEvent
Transfer-Logik erweiternListener auf ConnectorTransferEvent
Login/Logout-Logik erweiternListener auf ConnectorSessionLoginEvent / ConnectorSessionLogoutEvent
Custom LineItem-Typen für BestellungenListener auf ConnectorCartLineItemResolveEvent