Atraxion Middleware
A Symfony 8.0 (PHP 8.4+) middleware application that sits between Odoo (ERP) and a webshop, providing intelligent data synchronization with smart change detection.
Problem Statement
Odoo's API sends complete records on every update, making it impossible for the webshop to know what changed. This middleware solves four critical problems:
| Problem | Solution |
|---|---|
| Full data on updates | Odoo sends complete records; middleware computes field-level diffs and exposes only changedFields |
| Partner hierarchy | Preserves Odoo's hierarchy (Main > Billing > Delivery > Contacts) with self-referencing relationships |
| Stock performance | Efficient storage and querying for 2800+ products using bulk upserts |
| Price update explosion | Extracts prices into a separate table; only flags items where the price actually changed (vs 128k false positives) |
Architecture Overview
Inbound flow (Odoo -> Middleware): Odoo pushes full records via POST endpoints. The middleware stores the data, computes field-level diffs against the previous version, extracts prices and purchase orders into separate tables, and marks records as pending.
Outbound flow (Middleware -> Webshop): The webshop polls GET endpoints to retrieve only records that have changed, including a changedFields array describing exactly which fields were modified. After processing, the webshop acknowledges each record via DELETE or ACK endpoints.
Reverse sync (Middleware -> Odoo): Sale orders created from the webshop side are queued in the OutboundQueue and asynchronously synced back to Odoo via XML-RPC using Symfony Messenger.
Tech stack:
- PHP 8.4+ with Symfony 8.0 (MicroKernel)
- MySQL 8.0 (Doctrine ORM with attribute-based mapping)
- Symfony Messenger with Doctrine transport (async queues)
- Twig for admin templates
- Nelmio ApiDocBundle for OpenAPI/Swagger documentation