Dedicated rotating log files per connector area under log/AgiqonConnector/:
api_<env>.log — License API HTTP calls
oci_<env>.log — OCI login and function controllers
cxml_<env>.log — cXML login controller
connector_<env>.log — general connector events
Each file rotates with up to 14 files at DEBUG level.
Typed exception classes for license API errors:
LicenseValidationException — thrown on 4xx responses (carries HTTP status code)
LicenseApiUnavailableException — thrown on network/connection failures
OciAuthenticationException — for failed OCI authentication flows
License check result caching to reduce live HTTP calls on every login:
Results cached for 10 minutes via Symfony cache.object
24-hour stale fallback: logins continue to work during temporary license API outages
Cache is invalidated on 401/403 responses so invalid licenses are never served from cache
Structured server-side logging to OCI login controller: every failure branch (wrong credentials, inactive system, missing fields, invalid URL, invalid license) is logged as WARNING; successful logins are logged as INFO; function dispatch errors as ERROR.
Structured server-side logging to cXML login controller: equivalent coverage for all failure and success paths.
Structured logging to OciDownloadJsonController: unhandled errors in the download JSON flow are now logged as ERROR.
errorType and hint fields in the test-connection API response to help administrators diagnose configuration issues:
missing_config — Client ID or Client Secret not set
network_error — license API unreachable
auth_error — credentials rejected by the license API
Structured server-side logging to CxmlAuthController: all failure paths (invalid/expired auth key, customer not found, system not found, malformed stored XML) are logged as WARNING; successful auth flows as INFO.
OciUndefinedFunctionController now logs unsupported OCI function names as WARNING.
All Symfony DI service configuration files migrated from XML to YAML (.xml → .yaml). Plugin developers extending the service container should use the .yaml format going forward.
Transmission detail page redesigned: improved layout and visual structure across all tabs.
Transferred transmissions now allow adding, editing and removing cart items as long as no order has been created yet.
Removed dead HTTP request method validation blocks in OciLoginController and CxmlLoginController that referenced an undefined class (HTTPRequestMethod) and lacked a return statement, causing a potential fatal PHP error at runtime. The OciLoginController now correctly validates the configured HTTP method of the customer's OCI system after authentication.
Replaced deprecated utf8_encode() with mb_convert_encoding() in CxmlDuplicateController (deprecated since PHP 8.2, removed in PHP 9).
CxmlLoginController and CxmlInspectController now catch SimpleXMLElement parse exceptions and return a proper error response instead of an unhandled 500.
CxmlInspectController Twig template path corrected from @Storefront/... to @AgiqonConnector/... (template was never found at runtime).
CxmlDuplicateController now correctly extends AbstractController instead of StorefrontController; storefront-scoped base class was incompatible with the API route scope.
OciProductService::addProductToCart() now returns the recalculated cart from CartService::add() instead of the original cart object, ensuring prices are always up to date after adding a line item.
OciCustomerService::deleteOldTempCustomers() no longer filters by languageId; temporary customers created in any language context are now cleaned up correctly.
CxmlLoginController URL decoding unified to html_entity_decode() to handle all HTML entities, not just &.
ConnectorTransmissionController::updateCart() and CxmlDuplicateController::duplicateSystem() now validate the incoming ID as a valid UUID before executing any DAL queries, preventing invalid input from reaching the database layer.
OciCustomerService and OciProductService single-result queries now set Criteria::setLimit(1) to avoid fetching unnecessary rows when only the first match is needed.
ConnectorResponseGenerator promoted to abstract class; shared resolveDataFieldValue() and getConfigKey() methods extracted from OciConnectorResponseGenerator and CxmlConnectorResponseGenerator to eliminate duplication.
OCI login controller credential-presence check extracted into an explicit $credentialsPresent variable for improved readability.
Complete architectural rewrite of the plugin (version 3.x series).
OCI and cXML protocol logic moved from storefront/checkout classes into a dedicated Connector domain layer.
Each OCI function (DETAIL, VALIDATE, SOURCING, BACKGROUND_SEARCH, DOWNLOADJSON, QUANTITYCHECK) now has its own dedicated controller.
Each cXML transfer type (Inspect, TransferCart, TransferDirect) now has its own dedicated controller.
Shipping method extension to mark shipping methods as OCI/cXML-compatible directly in the Shopware shipping method administration.
Unified administration module: OCI and cXML systems are now managed in a single consolidated plugin module with improved navigation and ACL support.
Role-based access control (ACL) for all connector administration views.
New DataField system: a typed, registry-based mapping layer for product, order, line item, shipping, context and system fields. Custom fields can be registered via the Symfony service container without manual configuration.
New transmission management in the administration: a list view and a detail view for all connector transmissions, including status tracking (open, order created, transferred, closed, cancelled).
Transmissions now have a dedicated number range for unique transmission numbers.
Transmission customers are recorded per transmission to track which customer was logged in.
Dashboard in the administration showing transmission statistics and key metrics.
Transmission mode can be configured per system: "manual" (transfer triggered by the user) or "auto" (transfer happens automatically on logout).
Cart payload and active rule IDs are saved on the transmission for reproducibility.
Payment method and shipping method can now be configured per OCI and cXML system. If no method is configured, the customer's last used methods are applied automatically.
New order settings card added to the cXML system detail view.