cXML: Die Header-Blöcke <Shipping> und <Tax> sind über Feldbäume konfigurierbar und erhalten jeweils einen eigenen Tab im Admin — siehe cXML – Versand & Steuer.
Neue Datenfelder shippingCostsNetPrice, shippingCostsTaxAmount, shippingMethodTranslatedName und cartTaxAmount. Die Versand-Datenfelder stehen jetzt auch für cXML zur Verfügung — siehe Alle Datenfelder.
Neuer Feldfilter „Nachkommastellen des Systems", der einen Wert mit den am System hinterlegten Nachkommastellen formatiert (nur cXML) — siehe cXML – Felder konfigurieren.
Produkt-Custom-Field „UNSPSC-Nummer" (agiqon_connector_unspsc) für den UNSPSC-Warengruppenschlüssel, angelegt bei Installation und Update, verfügbar als Datenfeld productUnspsc — siehe Produkt-Erweiterungen.
Die cXML-Standardsysteme befüllen <Classification domain="UNSPSC"> und <UnitOfMeasure>; damit ist das erzeugte ItemDetail gültig gegenüber der cXML-1.2-DTD.
OCI: Die Steuerparameter ~target, ~OkCode und ~caller werden unverändert an das Beschaffungssystem zurückgegeben — siehe OCI – Login.
OCI: Beim Speichern eines Systems wird gewarnt, wenn ein anderes aktives System dieselben Variablennamen für Benutzername, Passwort und Hook-URL verwendet.
Breaking: Die Versandart-Erweiterung heißt nicht mehr nach OCI: agiqon_oci_shipping_method wird zu agiqon_connector_shipping_method, ociShippingMethod zu connectorShippingMethod — siehe Versandarten.
Die Option „Gast-Sitzung" heißt jetzt „Separate Warenkorb-Session" — geändert hat sich nur der Text, das Verhalten bleibt unverändert.
cXML: <Shipping><Description> nutzt den übersetzten Namen der Versandart bzw. den Namen aus der Versandart-Erweiterung und trägt — wie der Tax-Block — das von der cXML-1.2-DTD geforderte Attribut xml:lang.
cXML: Das SharedSecret wird aus dem ersten Sender-Credential gelesen, unabhängig von dessen Domain. Das Secret selbst wird weiterhin geprüft — siehe cXML – Authentifizierung.
cXML: Der Dialog der Feldkonfiguration folgt dem Layout der OCI-Feldkonfiguration.
OCI: Ein leerer Login-Parameter gilt als nicht übergeben; ein leeres TOKEN verhindert damit nicht mehr die Anmeldung über Benutzername und Passwort.
shippingNumber und shippingInternArticleNumber lieferten immer einen leeren Wert, in cXML wie in OCI; shippingInternArticleNumber lieferte zudem die Versandnummer statt der internen Artikelnummer.
shippingName wurde in cXML doppelt escaped.
cXML: Die Feldfilter Teilzeichenfolge, Zahlenformat und Teilen durch werden wieder angewendet.
currencyIsoCode liefert die aktive Kontext-Währung statt der Standardwährung des Verkaufskanals.
Beim Duplizieren eines cXML-Systems gehen die Datenfeld-Zuordnungen der Felder nicht mehr verloren.
Das Speichern bzw. Schließen der cXML-Feldkonfiguration macht die Administration nicht mehr unbedienbar.
OCI-Login: Es werden nur noch aktive Systeme berücksichtigt, und die Kundenzuordnung entscheidet, zu welchem davon die Anfrage gehört — siehe OCI – Kunden & Einheiten.
OCI: Das Token-Custom-Field lässt sich im Admin wieder speichern.
OCI: Ein deaktiviertes Kundenkonto kann sich nicht mehr per Token anmelden.
Das Punchout-Rückgabeformular postet in das über ~target angeforderte Fenster, ersatzweise in _top.
Admin: Die deutschen Beschriftungen der Datenfeld-Typen „Zusatzfeld" und „Payload-Feld" werden wieder übersetzt.
Breaking Change: Die Entity-Erweiterung der Versandart wurde umbenannt. Integrationen, die addAssociation('ociShippingMethod'), extensions.ociShippingMethod oder die Tabelle agiqon_oci_shipping_method nutzen, müssen auf connectorShippingMethod bzw. agiqon_connector_shipping_method umgestellt werden. Eine Migration benennt die Tabelle um, die gepflegten Werte bleiben erhalten.
Versand und Steuer werden jetzt aus Feldbäumen erzeugt. Die Migration legt sie für jedes bestehende cXML-System an, die Ausgabe bleibt damit gleich; anpassen lassen sie sich unter Versand / Steuer.
Feldfilter wirken wieder. Für cXML-Felder konfigurierte Filter für Teilzeichenfolge, Zahlenformat oder Teilen durch blieben bislang wirkungslos und verändern ab dieser Version das erzeugte XML. Prüfen Sie die Feldkonfiguration Ihrer cXML-Systeme, bevor Sie produktive Anbindungen aktualisieren.
<Shipping><Description> kann sich ändern, wenn eine Übersetzung oder ein Name in der Versandart-Erweiterung gepflegt ist. <Shipping><Money> liefert weiterhin den Bruttobetrag — für einen Nettowert stellen Sie das Feld auf shippingCostsNetPrice um.
In Mehrwährungs-Shops folgt currencyIsoCode jetzt der aktiven Währung.
OCI-Logins setzen jetzt voraus, dass der Kunde einem der von der Anfrage adressierten Systeme zugeordnet ist. Ist ein Kunde einem System zugeordnet, dessen Variablennamen das Beschaffungssystem nicht sendet, wird dieser Login ab dieser Version abgelehnt. Der Log-Eintrag nennt die in Frage kommenden Systeme und das System des Kunden — prüfen Sie die Kundenzuordnung unter Kunden, bevor Sie produktive Anbindungen aktualisieren.
Ein deaktiviertes Kundenkonto kann sich nicht mehr per Token anmelden. Konten, die in Shopware deaktiviert wurden und sich bislang per Token eingeloggt haben, verlieren den Zugang.
Das Token-Custom-Field muss bei jedem OCI-System, das den Token-Login nutzt, einmal eingetragen werden — der Wert ließ sich bisher nicht speichern.
~target, ~OkCode und ~caller werden jetzt automatisch zurückgegeben. Wer einen davon von Hand über transmissionAdditionalDataField abgebildet hat, schickt ihn ab dieser Version doppelt — dieses Feld aus der Feldkonfiguration entfernen.
Das cXML-Punchout-Level-2-Formular auf der Produktdetailseite postet jetzt in das oberste Fenster; es trug bisher gar kein Target.
Neue Option Verhalten des Schließen-Buttons: Beim Schließen der Session kann pro System zur Hook-URL des Beschaffungssystems weitergeleitet werden. Siehe OCI – Login bzw. cXML – System anlegen.
Der Filter-Fix greift nur bei Neuinstallationen. Bei bereits installiertem Standard-OCI-System die Felder vendormat, matgroup und quantity einmal im Admin neu speichern — siehe Plugin aktualisieren.
CxmlSystemApiService::duplicate() schlägt nicht mehr mit dem DAL-Validierungsfehler „This value should not be blank" fehl, wenn ein cXML-Feld einen leeren name-Wert hat (z. B. durch Altdaten); es wird automatisch ein stabiler Fallback-Name vergeben und eine Warnung geloggt, damit das betroffene Feld in der Admin-UI umbenannt werden kann.
Eine neue Migration benennt veraltete Feld-Referenzen (productUnitOciExtension, productCxmlUnitExtension) automatisch auf das neue Datenfeld productSystemUnit um, sodass Feld-Zuordnungen, die vor Einführung des neuen Einheiten-Datenfelds erstellt wurden, weiterhin funktionieren.
DataField transmissionAdditionalDataField für Feld-Mappings, liest Werte aus dem Zusatzfelder-Payload einer Übertragung über einen konfigurierbaren Zusatz-Key.
DataField lineItemPayloadField für Feld-Mappings, liest Werte aus dem Payload einer Warenkorbposition über einen konfigurierbaren Zusatz-Key.
Dedizierte rotierende Log-Dateien pro Connector-Bereich unter log/AgiqonConnector/:
api_<env>.log — HTTP-Aufrufe der License-API
oci_<env>.log — OCI-Login und Funktions-Controller
cxml_<env>.log — cXML-Login-Controller
connector_<env>.log — allgemeine Connector-Ereignisse
Jede Datei rotiert mit bis zu 14 Dateien auf DEBUG-Level.
Typisierte Exception-Klassen für License-API-Fehler:
LicenseValidationException — bei 4xx-Antworten (enthält HTTP-Statuscode)
LicenseApiUnavailableException — bei Netzwerk- oder Verbindungsfehlern
OciAuthenticationException — bei fehlgeschlagener OCI-Authentifizierung
Ergebnis-Caching für Lizenz-Prüfungen, um bei jedem Login einen Live-HTTP-Aufruf zu vermeiden:
Ergebnisse werden für 10 Minuten über den Symfony cache.object gecacht
24-Stunden-Stale-Fallback: Logins funktionieren weiterhin bei temporären Ausfällen der License-API
Cache wird bei 401/403-Antworten invalidiert, sodass ungültige Lizenzen nicht aus dem Cache ausgeliefert werden
Strukturiertes serverseitiges Logging im OCI-Login-Controller: Jeder Fehlerzweig (falsche Zugangsdaten, inaktives System, fehlende Felder, ungültige URL, ungültige Lizenz) wird als WARNING geloggt; erfolgreiche Logins als INFO; Fehler beim Funktions-Dispatch als ERROR.
Strukturiertes serverseitiges Logging im cXML-Login-Controller: gleichwertige Abdeckung aller Fehler- und Erfolgspfade.
Strukturiertes Logging im OciDownloadJsonController: Nicht behandelte Fehler im Download-JSON-Ablauf werden jetzt als ERROR geloggt.
Felder errorType und hint in der Test-Verbindung-API-Antwort zur einfacheren Diagnose von Konfigurationsproblemen durch Administratoren:
missing_config — Client-ID oder Client-Secret nicht gesetzt
network_error — License-API nicht erreichbar
auth_error — Zugangsdaten von der License-API abgelehnt
Strukturiertes serverseitiges Logging im CxmlAuthController: Alle Fehlerpfade (ungültiger/abgelaufener Auth-Key, Kunde nicht gefunden, System nicht gefunden, fehlerhaftes gespeichertes XML) werden als WARNING geloggt; erfolgreiche Auth-Flows als INFO.
OciUndefinedFunctionController loggt nicht unterstützte OCI-Funktionsnamen jetzt als WARNING.
Alle Symfony-DI-Servicekonfigurationsdateien von XML auf YAML migriert (.xml → .yaml). Plugin-Entwickler, die den Service-Container erweitern, sollten künftig das .yaml-Format verwenden.
Detailseite einer Übertragung wurde vom Design überarbeitet: verbessertes Layout und visuelle Struktur über alle Tabs hinweg.
Bei übertragenen Übertragungen können Warenkorbpositionen hinzugefügt, geändert und gelöscht werden, solange noch keine Bestellung angelegt wurde.
Tote HTTP-Request-Method-Validierungsblöcke in OciLoginController und CxmlLoginController entfernt, die auf eine undefinierte Klasse (HTTPRequestMethod) verwiesen und kein return-Statement enthielten, was bei Laufzeit zu einem fatalen PHP-Fehler geführt hätte. Der OciLoginController prüft die konfigurierte HTTP-Methode des Kunden-OCI-Systems nach der Authentifizierung jetzt korrekt.
Veraltete Funktion utf8_encode() durch mb_convert_encoding() in CxmlDuplicateController ersetzt (seit PHP 8.2 deprecated, in PHP 9 entfernt).
CxmlLoginController und CxmlInspectController fangen SimpleXMLElement-Parse-Exceptions jetzt ab und geben eine saubere Fehlerantwort zurück, anstatt einen unkontrollierten 500-Fehler auszulösen.
Twig-Template-Pfad in CxmlInspectController von @Storefront/... auf @AgiqonConnector/... korrigiert (Template wurde zur Laufzeit nicht gefunden).
CxmlDuplicateController erweitert nun korrekt AbstractController statt StorefrontController; die Storefront-Basisklasse war mit dem API-Route-Scope inkompatibel.
OciProductService::addProductToCart() gibt jetzt den neu berechneten Warenkorb von CartService::add() zurück, damit Preise nach dem Hinzufügen eines Artikels stets aktuell sind.
OciCustomerService::deleteOldTempCustomers() filtert nicht mehr nach languageId; temporäre Kunden aus allen Sprachkontexten werden jetzt korrekt bereinigt.
URL-Dekodierung in CxmlLoginController auf html_entity_decode() vereinheitlicht, um alle HTML-Entities (nicht nur &) zu behandeln.
ConnectorTransmissionController::updateCart() und CxmlDuplicateController::duplicateSystem() validieren die übergebene ID jetzt als gültige UUID, bevor DAL-Queries ausgeführt werden, um ungültige Eingaben von der Datenbankschicht fernzuhalten.
OciCustomerService und OciProductService setzen bei Einzeltreffer-Queries nun Criteria::setLimit(1), um unnötige Datenbankzeilen zu vermeiden.
ConnectorResponseGenerator zur abstrakten Klasse erhoben; die gemeinsamen Methoden resolveDataFieldValue() und getConfigKey() wurden aus OciConnectorResponseGenerator und CxmlConnectorResponseGenerator extrahiert, um Duplikate zu vermeiden.
Credential-Prüfung im OCI-Login-Controller in eine explizite Variable $credentialsPresent ausgelagert, um die Lesbarkeit zu verbessern.
Vollständige architektonische Neuentwicklung des Plugins (Version 3.x-Reihe).
OCI- und cXML-Protokolllogik aus Storefront-/Checkout-Klassen in eine dedizierte Connector-Domänenschicht verlagert.
Jede OCI-Funktion (DETAIL, VALIDATE, SOURCING, BACKGROUND_SEARCH, DOWNLOADJSON, QUANTITYCHECK) besitzt nun einen eigenen Controller.
Jeder cXML-Übertragungstyp (Inspect, TransferCart, TransferDirect) besitzt nun einen eigenen Controller.
Versandmethoden-Erweiterung, um Versandmethoden direkt in der Shopware-Versandmethoden-Administration als OCI/cXML-kompatibel zu markieren.
Einheitliches Administrationsmodul: OCI- und cXML-Systeme werden jetzt in einem einzigen konsolidierten Plugin-Modul mit verbesserter Navigation und ACL-Unterstützung verwaltet.
Rollenbasierte Zugriffskontrolle (ACL) für alle Connector-Administrationsansichten.
Neues DataField-System: ein typisiertes, registry-basiertes Mapping-Layer für Produkt-, Bestell-, Positionsdaten, Versand-, Kontext- und Systemfelder. Eigene Felder können ohne manuelle Konfiguration über den Symfony-Service-Container registriert werden.
Neues Übertragungsmanagement in der Administration: eine Listenansicht und eine Detailansicht für alle Connector-Übertragungen, inklusive Statusverfolgung (offen, Bestellung erstellt, übertragen, geschlossen, storniert).
Übertragungen erhalten nun einen eigenen Nummernkreis für eindeutige Übertragungsnummern.
Übertragungskunden werden pro Übertragung erfasst, um nachzuverfolgen, welcher Kunde angemeldet war.
Dashboard in der Administration mit Übertragungsstatistiken und wichtigen Kennzahlen.
Der Übertragungsmodus kann pro System konfiguriert werden: „manuell" (Übertragung wird vom Benutzer ausgelöst) oder „automatisch" (Übertragung erfolgt automatisch beim Abmelden).
Warenkorb-Payload und aktive Regelkennungen werden zur Nachvollziehbarkeit an der Übertragung gespeichert.
Zahlungsmethode und Versandmethode können jetzt pro OCI- und cXML-System konfiguriert werden. Ist keine Methode konfiguriert, werden die zuletzt verwendeten Methoden des Kunden automatisch angewendet.
Neue Bestell-Einstellungskarte in der cXML-Systemdetailansicht hinzugefügt.
Die Sitzung ist jetzt ein unveränderliches Wertobjekt (ConnectorSession), das von OCI und cXML gemeinsam genutzt wird und die veränderliche OciSession-Entität ersetzt.