Tables Principales : Produits et Catégories
La table products est la fondation. Les champs incluent product_id (PK), sku (unité de stockage unique), barcode, product_name, description, category_id (FK), brand, unit_price, cost_price, tax_rate, unit_type (pièce/kg/litre), is_active et image_url. La table categories organise les produits hiérarchiquement : category_id (PK), name, parent_category_id (FK auto-référençant pour les sous-catégories) et sort_order. Un arbre de catégories bien conçu prend en charge le reporting départemental.
Inventaire et Gestion des Stocks
La table inventory suit les niveaux de stock sur plusieurs emplacements : inventory_id (PK), product_id (FK), store_id (FK), quantity_on_hand, quantity_committed (réservé pour les commandes ouvertes), reorder_point, reorder_quantity et last_count_date. Une table stock_movements enregistre chaque changement d'inventaire : movement_id (PK), product_id (FK), store_id (FK), movement_type (réception/vente/retour/ajustement/transfer), quantity, reference_document, movement_date et performed_by. Cet audit trail est essentiel pour identifier les écarts lors des inventaires physiques.
Schéma de Transaction de Vente
Le schéma de ventes suit un modèle en-tête-détail. La table sales_orders (en-tête) enregistre : order_id (PK), store_id (FK), customer_id (FK), employee_id (FK — le caissier), order_date, order_time, subtotal, discount_total, tax_total, grand_total, payment_status et order_status. La table sales_order_items (détail) capture chaque ligne : order_item_id (PK), order_id (FK), product_id (FK), quantity, unit_price_at_sale, discount_percent, line_total et returned_quantity. Stocker le unit_price_at_sale est critique car les prix des produits changent avec le temps.
Traitement des Paiements
La table payments gère plusieurs types de paiement par transaction : payment_id (PK), order_id (FK), payment_method (cash/card/UPI/credit/voucher), payment_amount, reference_number (pour les transactions card/UPI), payment_date et is_verified. Pour les paiements fractionnés, plusieurs lignes se lient au même order_id. Une table séparée registers gère les opérations de tiroir-caisse : register_id (PK), store_id (FK), opening_balance, closing_balance, opened_by, closed_by, opening_date, closing_date, expected_cash et variance.
Gestion de la Relation Client
La table customers stocke : customer_id (PK), first_name, last_name, phone, email, date_of_birth, anniversary_date, loyalty_points, total_spent, registration_date et is_vip. Une table loyalty_transactions suit les points gagnés et utilisés par commande. Pour les chaînes de détaillants, une table customer_addresses prend en charge les commandes de livraison avec plusieurs adresses. La table customers s'intègre au schéma de ventes via la FK customer_id dans sales_orders, permettant des fonctionnalités comme l'historique d'achat et les offres personnalisées.
Architecture Multi-Magasins
Pour les opérations en chaîne, la table stores définit chaque emplacement : store_id (PK), store_name, address, city, state, phone, tax_registration_number et is_active. Les ordres de transfert entre magasins utilisent une table transfer_orders : transfer_id (PK), from_store_id (FK), to_store_id (FK), product_id (FK), quantity, status (demandé/approuvé/expédié/reçu), request_date et completion_date. Cette structure prend en charge le reporting centralisé tout en permettant des opérations décentralisées.
Bonnes Pratiques pour la Base de Données POS
Utilisez des transactions de base de données pour chaque vente — si l'insertion d'une ligne échoue, l'ensemble de la commande doit être annulé. Indexez la colonne barcode pour des recherches de produits en moins d'une milliseconde au registre. Implémentez le verrouillage optimiste (colonne de numéro de version) sur les tables d'inventaire pour éviter les ventes en double pendant les périodes de forte concurrence. Partitionnez sales_order_items par order_date pour des requêtes historiques rapides. Stockez toujours les valeurs monétaires dans la plus petite unité monétaire (centimes) en entiers pour éviter les erreurs d'arrondi à virgule flottante.
AIAZH