Ga naar inhoud

Datamodel & databases

De Atraxion-webshop gebruikt meerdere MySQL-databases (MariaDB-compatibel). Elke database heeft een duidelijk afgebakende verantwoordelijkheid. De toegangslaag bestaat uit twee systemen naast elkaar: Doctrine ORM/DBAL voor de modernere entiteiten en een legacy DAO-laag (GenericDAO) voor de oudere tabellen.


Databases en hun rol

De databases worden bij installatie aangemaakt vanuit de SQL-dumps in _data/ (zie INSTALL.md:26). Hieronder een overzicht:

Database Inhoud / rol
atx_www Hoofddatabase. Bevat alle kernentiteiten: artikelen (banden, velgen, accessoires), bestellingen, klanten, channels, CMS-content (cms_text, cms_template), loyaliteitspunten, coupons, transportprijzen, leveranciers, voertuigtabellen (vehicle_*), e-mailsjablonen, enzovoort.
atx_3d 3D-velgensimulator: voertuiglooks, verven, achtergrondsafbeeldingen (threed_*).
atx_dwh Data warehouse: statistieken, paginatellers, zoekhistoriek, voorraadgeschiedenis (counter, sales, search, stock_history2).
atx_log Logboeken: IP-blacklist, cache-fallback, inlogfouten, middlewarelogs, request/response-logs, klantenvalidatielogs.
atx_queue Queue-systeem voor achtergrondverwerking: app_queue, job, queue, r6_queue, r6_queue_async.
channel (seed-bestand bij installatie) — de operationele channeldata zit in atx_www.channel en gerelateerde tabellen; deze losse database is slechts een initialisatiebron.
cms_text (seed-bestand bij installatie) — vertaalteksten worden operationeel bijgehouden in atx_www.cms_text; TextDAO::Table() verwijst expliciet naar atx_www.cms_text.
customer (seed-bestand bij installatie) — klanthoofdrecords (customer-tabel). Operationele klantdata zit in atx_www.
customer_category (seed-bestand bij installatie) — klantcategorieën (code A–Z, bijv. Bandenhandelaar, Garage, Importeur). Operationeel opgeslagen in atx_www.
customer_user (seed-bestand bij installatie) — logingegevens van klantgebruikers: gebruikersnaam, bcrypt-wachtwoord, rol, taalvoorkeur, geboortedatum, 2FA-status. Operationeel beheerd in atx_www.
language (seed-bestand bij installatie) — ondersteunde talen: nl, fr, en, du. Operationeel opgeslagen in atx_www.
setting (seed-bestand bij installatie) — applicatie-instellingen (zie Configuratie & environment). Operationeel beheerd in atx_www.
vehicle_bodytype Voertuigcarrosserietypes.
vehicle_bodytype_order Sorteervolgorde per carrosserietype.
vehicle_brand Voertuigmerken (gekoppeld aan DriveRight).

De constanten voor de databasenamen staan in _www/appconfig/constants.php:

// _www/appconfig/constants.php:71–74
const APP_DB_WWW   = 'atx_www';
const APP_DB_LOG   = 'atx_log';
const APP_DB_QUEUE = 'atx_queue';
const APP_DB_DWH   = 'atx_dwh';

De databaseverbinding wordt opgezet door atx\Db (_core/model/classes/atx/Db.php), een singleton die zowel PDO als Doctrine DBAL aanbiedt:

// _core/model/classes/atx/Db.php:55
$dsn = sprintf('mysql:host=%s;dbname=%s;charset=%s', APP_DB_HOST, APP_DB_WWW, DB_CHARSET);

De primaire verbinding richt zich altijd op atx_www; andere databases worden via cross-database SQL-queries (atx_log.log_error, atx_dwh.sales, …) bereikt.


Channel-datamodel

Het channel-concept is technisch centraal: elk request hoort bij één channel (atx\channels\Channel, _core/model/classes/atx/channels/Channel.php).

  • ChannelType = 1 (WEB): standaard webshop (www.atraxion.com, ID 14) en mini-shops (*.tyrecloud.be, *.wheelcloud.be). Een mini-shop is een WEB-channel met een ingevuld OwnedByCustomer-veld (koppeling naar customer.Klantnr).
  • ChannelType = 2 (PLATFORM): externe verkoopplatformen zoals Tyre24. Een platform-channel heeft een gekoppelde channel_platform-record.

Constanten in _core/model/classes/atx/channels/Channel.php:

// Channel.php:19–44
const WEB      = 1;
const PLATFORM = 2;
const DEFAULT_CHANNEL_NAME = 'www.atraxion.com';
const DEFAULT_CHANNEL      = 14;

Het ORM-mapping-bestand _core/config/doctrine/channels.Channel.orm.xml beschrijft het volledige schema: channelnaam, subdomain, mini-shop-vlag (MiniShop), homepage-teksten per taal, verborgen merken, en de many-to-one relatie naar customer via OwnedByCustomer.

Het actieve channel wordt bij bootstrap bepaald in _www/appconfig/constants.php:51–57 via APP_CHANNEL (hostname-based lookup).


Doctrine ORM/DBAL

De Doctrine-integratie wordt beheerd door atx\doctrine\DoctrineService (_core/model/classes/atx/doctrine/DoctrineService.php). De EntityManager wordt aangemaakt via ORMSetup::createConfiguration() en gebruikt Simplified XML Driver voor de ORM-mappings.

Mapping-locaties

ORM-mappings worden op meerdere plaatsen bijgehouden (DoctrineService.php:83–98):

Pad Namespace
_core/config/doctrine/ atx (alle legacy entiteiten)
src/Atraxion/Advert/Resources/doctrine Atraxion\Advert\Entity
src/Atraxion/Api/Resources/doctrine Atraxion\Api\Entity
src/Atraxion/Coupon/Resources/doctrine Atraxion\Coupon\Entity
src/Atraxion/Edi/Resources/doctrine Atraxion\Edi\Entity
src/Atraxion/Logo/Resources/doctrine Atraxion\Logo\Entity
src/Atraxion/Loyalty/Resources/doctrine Atraxion\Loyalty\Entity
src/Atraxion/Model/Product/Resources/doctrine Atraxion\Model\Product\Entity
src/Atraxion/WheelSet/Resources/doctrine Atraxion\WheelSet\Entity
src/Atraxion/Platform/Resources/doctrine Atraxion\Platform\Model
src/Odoo/Resources/doctrine Odoo\Entity
src/Qweon/Resources/doctrine Qweon\Entity

Kern-entiteiten in _core/config/doctrine/

De ORM-bestanden zijn genaamd naar hun entiteitspad, bijv. articles.Article.orm.xml, channels.Channel.orm.xml, orders.Order.orm.xml. Voorbeelden van groepen:

  • Artikelen: Article, ArticleCategory, ArticleBrand, Tyre, TyreType, Wheel, acc.Acc, stock.Stock, stock.Export
  • Kanalen: Channel, ChannelCustomer, ChannelRanking, platforms.Platform, platforms.PlatformExport
  • Klanten: Customer, CustomerCat, CustomerMargin, Login, cart.CartArticle, cart.CartSet
  • Bestellingen: Order, OrderArticle, OrderAddress, OrderSet, ReturnRequest, Transport
  • Leveranciers: Supplier, suppliers.stock.SupplierStock, suppliers.stock.SupplierImportSettings
  • Voertuigen: VehicleBrand, VehicleModel, VehicleChassis, VehicleMotor, driveright.Tf_Vehicle
  • CMS: cms.Template, cms.BlogPost, pages.Slide
  • Facturen: invoices.Invoice, invoices.ShipmentTracking

De basisentiteit atx\DoctrineGeneric (mapping: DoctrineGeneric.orm.xml) voegt de standaardvelden Active, Added, AddedBy, Updated, UpdatedBy toe aan alle subklassen.

Migrations

Doctrine-migraties staan in _core/config/doctrine/migrations/ (georganiseerd per jaar en maand). Ze worden uitgevoerd via:

./bin/doctrine m:m -n

Nieuwe migraties worden aangemaakt met ./bin/doctrine migrations:generate (niet migrations:diff). SQL wordt handmatig geschreven. De versietabel is atx_www.doctrine_migration_versions.


Legacy DAO-laag

Naast Doctrine bestaat er een legacy DAO-laag die rechtstreeks PDO gebruikt. De abstracte basis is atx\GenericDAO (_core/model/dbclasses/atx/GenericDAO.php), die hulpmethoden biedt voor selectObjects, selectArray, insertObject, insertObjects, insertIgnoreObject, insertUpdateObject, updateObject, updateObjects, deleteObject, deleteObjects en een ingebouwde cache-array. Er zijn geen kale insert-, update- of delete-methoden.

DAO-klassen bevinden zich in _core/model/dbclasses/atx/ en zijn georganiseerd per domein:

Submap Voorbeelden
articles/ ArticleDAO.php, ArticleSearchDAO.php, PricelistDAO.php, tyres/, wheels/, acc/, stock/
orders/ OrderDAO.php, OrderArticleDAO.php, ReservationDAO.php, TransportDAO.php
customers/ (klantgerelateerde DAO's)
channels/ (channelgerelateerde DAO's)
cms/ TextDAO.php (vertaalteksten), PageDAO.php, TemplateDAO.php
system/ SettingDAO.php (applicatie-instellingen)
suppliers/ SupplierDAO.php
logs/ LogUpdateDAO.php

Een DAO bepaalt zijn tabel via de statische methode Table():

// _core/model/dbclasses/atx/cms/TextDAO.php:32
public static function Table()
{
    return APP_DB_WWW . '.cms_text';
}

De DAO-laag en Doctrine bestaan naast elkaar: sommige modules (bijv. TextDAO, SettingDAO) gebruiken de legacy-laag, terwijl nieuwe modules Doctrine Repositories gebruiken.


Mermaid: datalagen

graph TD
    Req[HTTP Request] --> ServiceReg[ServiceRegistry]
    ServiceReg --> DocSvc[DoctrineService]
    ServiceReg --> DAO[Legacy GenericDAO]
    DocSvc --> EM[EntityManager]
    EM --> XMLMap[ORM XML mappings]
    DAO --> PDO[atx\\Db PDO singleton]
    PDO --> MySQL[(atx_www / MySQL)]
    EM --> MySQL
    MySQL --> atx_log[(atx_log)]
    MySQL --> atx_dwh[(atx_dwh)]
    MySQL --> atx_queue[(atx_queue)]
    MySQL --> atx_3d[(atx_3d)]