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
| Table | Role |
|---|---|
users | Comptes utilisateurs (email, role, liaison Cegid via cegid_customer_id) |
refresh_tokens | Tokens JWT de rafraichissement |
password_reset_tokens | Tokens 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)
| Table | Role |
|---|---|
products | Catalogue produit (synchronise depuis Cegid) |
product_prices | Prix net par couple (produit, client) |
product_stocks | Stock par couple (produit, depot) |
product_families | Familles de produits (arborescence du catalogue) |
product_family_assignments | Association produit ↔ familles (many-to-many) |
product_images | Metadonnees images (fichiers dans MinIO S3) |
dimension_labels | Libelles 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 CegidGEN— produit parent (invisible via l'API, accessible en SQL)DIM— variante dimensionnelle (invisible via l'API, accessible en SQL)
Panier
| Table | Role |
|---|---|
carts | Un panier par utilisateur par depot |
cart_items | Lignes 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
| Table | Role |
|---|---|
shipping_rules | Regles par depot (ancien systeme) |
franco_exceptions | Seuil franco reduit pour clients VIP |
shipping_zones | Zones geographiques avec tarifs par paliers |
zone_departments | Association zone ↔ departement francais |
shipping_options | Options supplementaires (hayon, grue) |
Factures
| Table | Role |
|---|---|
invoices | Factures synchronisees depuis Cegid |
invoice_items | Lignes de facture |
invoice_order_links | Liaison facture ↔ commande d'origine |
Configuration
| Table | Role |
|---|---|
site_config | Configuration cle/valeur du site |
homepage_config | Banniere et mise en page accueil |
faq_articles | Articles FAQ |
depots | Liste des depots disponibles |
color_codes | Codes couleur RAL avec libelles |
lead_time_rules | Regles de delai par code (A/B/C/D) |
order_cutoffs | Heures de coupure commande par depot |
delivery_delays | Delais de livraison par depot et code |
Acces client
| Table | Role |
|---|---|
customer_family_access | Restreint les familles visibles par client |
customer_depot_access | Restreint les depots accessibles par client |
customer_repaint_access | Acces a la fonctionnalite repeinture |
authorized_products | Liste blanche de produits par client |
Articles lies
| Table | Role |
|---|---|
linked_article_groups | Groupes d'articles lies |
linked_article_group_rules | Regles de liaison (obligatoire/optionnel) |
linked_article_group_products | Produits declencheurs |
linked_article_variant_families | Familles de variantes pour les groupes de choix |
Ventes (commerciaux)
| Table | Role |
|---|---|
sales_customer_assignments | Affectation commercial ↔ clients |
sales_order_logs | Journal 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 headPour voir l'etat actuel :
alembic current
alembic history --verbose | head -20