Architektur
Der AgiqonConnector ist ein Shopware 6 Plugin, das den Shop als Katalog-Quelle für Procurement-Systeme zugänglich macht.
Unterstützte Protokolle
| Protokoll | Version |
|---|---|
| OCI | 4.0 |
| OCI | 5.0 |
| cXML | 1.2 (PunchOut) |
Systemvoraussetzungen
| PHP | ^8.2 |
| Shopware | ~6.7.0 (Plugin 3.7.x) |
| Shopware | ~6.6.0 (Plugin 3.6.x) |
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
| Punkt | Mechanismus |
|---|---|
| Eigene Felder anlegen | Custom AbstractDataField + Service-Tag agiqon_connector.data_field |
| Eigene Feldtypen anlegen | Custom Enum mit DataFieldTypeInterface + Custom LineItemContextResolver |
| OCI Response vor Rückgabe ändern | Listener auf OciResponseGenerationEvent |
| cXML Response vor Rückgabe ändern | Listener auf CxmlResponseGenerationEvent |
| Transfer-Logik erweitern | Listener auf ConnectorTransferEvent |
| Login/Logout-Logik erweitern | Listener auf ConnectorSessionLoginEvent / ConnectorSessionLogoutEvent |
| Custom LineItem-Typen für Bestellungen | Listener auf ConnectorCartLineItemResolveEvent |