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.