Qovans Docs
Architecture

Base de donnees

Schema PostgreSQL, modeles principaux et relations entre les tables.

PostgreSQL stocke toutes les donnees locales de Qovans. Cegid reste la source de verite pour les produits, stocks et commandes, mais PostgreSQL sert de cache performant et stocke tout ce que Cegid ne gere pas (utilisateurs, paniers, configuration).

Modeles principaux

Utilisateurs

TableRole
usersComptes utilisateurs (email, role, liaison Cegid via cegid_customer_id)
refresh_tokensTokens JWT de rafraichissement
password_reset_tokensTokens de reinitialisation mot de passe

Un utilisateur a un role parmi : customer (client), admin, sales (commercial).

Le champ cegid_customer_id (ex: C27710) fait le lien avec le client Cegid. Les admins n'ont pas de cegid_customer_id.

Les commerciaux (sales) peuvent passer des commandes au nom d'un client via le champ on_behalf_of_customer_id sur le panier.

Produits (cache local)

TableRole
productsCatalogue produit (synchronise depuis Cegid)
product_pricesPrix net par couple (produit, client)
product_stocksStock par couple (produit, depot)
product_familiesFamilles de produits (arborescence du catalogue)
product_family_assignmentsAssociation produit ↔ familles (many-to-many)
product_imagesMetadonnees images (fichiers dans MinIO S3)
dimension_labelsLibelles des variantes/dimensions Cegid

Le champ archived_by_admin sur products est un toggle admin "Produit actif". Toute requete qui liste des produits doit filtrer archived_by_admin = false sauf la page admin produits elle-meme.

Les statuts Cegid (cegid_status) sont :

  • UNI — produit standard, visible via l'API Cegid
  • GEN — produit parent (invisible via l'API, accessible en SQL)
  • DIM — variante dimensionnelle (invisible via l'API, accessible en SQL)

Panier

TableRole
cartsUn panier par utilisateur par depot
cart_itemsLignes du panier avec prix, quantite, commentaire

Un CartItem peut avoir un parent_item_id (article lie). Le champ is_linked = true indique un accessoire automatique. is_mandatory distingue les obligatoires des optionnels. custom_length_mm stocke la longueur de decoupe sur mesure.

Transport

TableRole
shipping_rulesRegles par depot (ancien systeme)
franco_exceptionsSeuil franco reduit pour clients VIP
shipping_zonesZones geographiques avec tarifs par paliers
zone_departmentsAssociation zone ↔ departement francais
shipping_optionsOptions supplementaires (hayon, grue)

Factures

TableRole
invoicesFactures synchronisees depuis Cegid
invoice_itemsLignes de facture
invoice_order_linksLiaison facture ↔ commande d'origine

Configuration

TableRole
site_configConfiguration cle/valeur du site
homepage_configBanniere et mise en page accueil
faq_articlesArticles FAQ
depotsListe des depots disponibles
color_codesCodes couleur RAL avec libelles
lead_time_rulesRegles de delai par code (A/B/C/D)
order_cutoffsHeures de coupure commande par depot
delivery_delaysDelais de livraison par depot et code

Acces client

TableRole
customer_family_accessRestreint les familles visibles par client
customer_depot_accessRestreint les depots accessibles par client
customer_repaint_accessAcces a la fonctionnalite repeinture
authorized_productsListe blanche de produits par client

Articles lies

TableRole
linked_article_groupsGroupes d'articles lies
linked_article_group_rulesRegles de liaison (obligatoire/optionnel)
linked_article_group_productsProduits declencheurs
linked_article_variant_familiesFamilles de variantes pour les groupes de choix

Ventes (commerciaux)

TableRole
sales_customer_assignmentsAffectation commercial ↔ clients
sales_order_logsJournal des commandes passees par les commerciaux

Relations cles

User ──1:N──► Cart ──1:N──► CartItem
  │                            │
  │                            └── parent_item_id (article lie)

  ├── cegid_customer_id ──► Cegid Customer (externe)

  └── role = "sales" ──► SalesCustomerAssignment ──► clients assignes

Product ──1:N──► ProductPrice (un prix par client)
        ──1:N──► ProductStock (un stock par depot)
        ──N:M──► ProductFamily (via ProductFamilyAssignment)

ShippingZone ──1:N──► ZoneDepartment
FrancoException ──► cegid_customer_id (seuil franco reduit)

Migrations

Les migrations sont gerees par Alembic (66 migrations a ce jour). Pour appliquer :

# Depuis le VPS
cd /opt/qovans/backend
source venv/bin/activate
alembic upgrade head

Pour voir l'etat actuel :

alembic current
alembic history --verbose | head -20