Projet Gestion Commerciale PyQt6 + MySQL
1 Présentation du Projet
1.1 Contexte
Ce projet vise à développer une application de gestion commerciale complète permettant
de gérer efficacement les ventes, les stocks, et les clients d’une petite ou moyenne entreprise.
L’application sera déployée en architecture client-serveur avec PyQt6 pour l’interface graphique
et MySQL comme système de gestion de base de données.
1.2 Objectifs pédagogiques
— Maîtriser le développement d’applications desktop avec PyQt6
— Concevoir et implémenter une base de données relationnelle MySQL
— Gérer la communication client-serveur distante
— Implémenter un système d’authentification et de gestion des rôles
— Générer des rapports et statistiques métier
— Créer une interface utilisateur professionnelle et ergonomique
1.3 Périmètre fonctionnel
L’application couvrira les modules suivants :
1. Gestion des utilisateurs : Authentification, rôles, permissions
2. Gestion des clients : CRUD complet, historique des achats
3. Gestion des produits : Catalogue, catégories, suivi des stocks
4. Gestion des ventes : Création de factures, paiements, reliquats
5. Statistiques et rapports : Tableaux de bord, exports PDF/Excel
6. Paramètres système : Configuration générale de l’application
2 Architecture Technique
2.1 Architecture globale
Soit l’exemple d’architecture à réutiliser si vous le souhaitez pour votre application ou à
adapter mais dans tous les cas vous devez utiliser une architecture client-serveur à 3 couches :
Architecture 3-tiers
1. Couche Présentation (Client) : Interface PyQt6 sur postes utilisateurs
2. Couche Métier (Application) : Logique métier Python
3. Couche Données (Serveur) : Base de données MySQL sur serveur distant
2
Projet Gestion Commerciale PyQt6 + MySQL
Composant Technologie
Langage Python 3.10+
Framework GUI PyQt6 (Qt Designer pour les interfaces)
Base de données MySQL 8.0+
Connecteur DB PyMySQL ou mysql-connector-python
Génération PDF ReportLab
Export Excel openpyxl
Graphiques Matplotlib / PyQtGraph
Hachage mots de passe bcrypt
Configuration python-dotenv
TABLE 1 – Technologies du projet
2.2 Stack technologique
2.3 Structure du projet
1 gestion_commerciale/
2
3 [Link] # Point d’entree
4 [Link] # Configuration (connexion DB)
5 [Link] # Dependances
6 .env # Variables d’environnement
7
8 database/
9 __init__.py
10 [Link] # Gestion connexion MySQL
11 [Link] # Script creation tables
12 seed_data.sql # D o n n e s de test
13
14 models/
15 __init__.py
16 [Link] # Modele Utilisateur
17 [Link] # Modele Client
18 [Link] # Modele Produit
19 [Link] # Modele Vente
20 [Link] # Modele Cat gorie
21
22 controllers/
23 __init__.py
24 user_controller.py
25 client_controller.py
26 product_controller.py
27 sale_controller.py
28
29 views/
30 __init__.py
31 ui/ # Fichiers .ui (Qt Designer)
32 [Link]
33 main_window.ui
3
Projet Gestion Commerciale PyQt6 + MySQL
34 [Link]
35 [Link]
36 [Link]
37
38 login_view.py
39 main_window.py
40 clients_view.py
41 products_view.py
42 sales_view.py
43
44 utils/
45 __init__.py
46 [Link] # Validation donnees
47 pdf_generator.py # Generation factures PDF
48 excel_exporter.py # Export Excel
49 [Link] # Fonctions utilitaires
50
51 resources/
52 icons/ # Icones interface
53 images/ # Images/logos
54 styles/ # Feuilles de style QSS
55
56 tests/
57 __init__.py
58 test_models.py
59 test_controllers.py
Listing 1 – Arborescence du projet
3 Exemple de Script SQL de création de BD
1 -- Base de donnees
2 CREATE DATABASE IF NOT EXISTS gestion_commerciale
3 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
4
5 USE gestion_commerciale;
6
7 -- Table users
8 CREATE TABLE users (
9 id INT AUTO_INCREMENT PRIMARY KEY,
10 username VARCHAR(50) UNIQUE NOT NULL,
11 password_hash VARCHAR(255) NOT NULL,
12 role ENUM(’admin’, ’manager’, ’vendeur’) NOT NULL DEFAULT ’
vendeur’,
13 email VARCHAR(100) UNIQUE NOT NULL,
14 is_active BOOLEAN DEFAULT TRUE,
15 created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
16 updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
17 INDEX idx_username (username),
4
Projet Gestion Commerciale PyQt6 + MySQL
18 INDEX idx_role (role)
19 ) ENGINE=InnoDB;
20
21 -- Table clients
22 CREATE TABLE clients (
23 id INT AUTO_INCREMENT PRIMARY KEY,
24 nom VARCHAR(100) NOT NULL,
25 prenom VARCHAR(100) NOT NULL,
26 telephone VARCHAR(20),
27 email VARCHAR(100),
28 adresse TEXT,
29 ville VARCHAR(100),
30 code_postal VARCHAR(10),
31 created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
32 updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
33 INDEX idx_nom (nom),
34 INDEX idx_telephone (telephone),
35 FULLTEXT idx_search (nom, prenom, email)
36 ) ENGINE=InnoDB;
37
38 -- Table categories
39 CREATE TABLE categories (
40 id INT AUTO_INCREMENT PRIMARY KEY,
41 nom VARCHAR(100) UNIQUE NOT NULL,
42 description TEXT,
43 created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
44 updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP
45 ) ENGINE=InnoDB;
46
47 -- Table produits
48 CREATE TABLE produits (
49 id INT AUTO_INCREMENT PRIMARY KEY,
50 category_id INT NOT NULL,
51 nom VARCHAR(200) NOT NULL,
52 description TEXT,
53 prix_achat DECIMAL(10,2) NOT NULL,
54 prix_vente DECIMAL(10,2) NOT NULL,
55 stock_min INT DEFAULT 5,
56 stock_actuel INT DEFAULT 0,
57 created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
58 updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
59 FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE
RESTRICT,
60 INDEX idx_category (category_id),
61 INDEX idx_stock (stock_actuel),
62 FULLTEXT idx_search (nom, description)
63 ) ENGINE=InnoDB;
64
5
Projet Gestion Commerciale PyQt6 + MySQL
65 -- Table ventes
66 CREATE TABLE ventes (
67 id INT AUTO_INCREMENT PRIMARY KEY,
68 numero_facture VARCHAR(50) UNIQUE NOT NULL,
69 client_id INT NOT NULL,
70 user_id INT NOT NULL,
71 date_vente DATETIME DEFAULT CURRENT_TIMESTAMP,
72 montant_total DECIMAL(10,2) NOT NULL,
73 montant_paye DECIMAL(10,2) DEFAULT 0,
74 montant_reste DECIMAL(10,2) GENERATED ALWAYS AS
75 (montant_total - montant_paye) STORED,
76 statut ENUM(’en_cours’, ’payee’, ’partielle’, ’annulee’)
77 DEFAULT ’en_cours’,
78 notes TEXT,
79 created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
80 updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
81 FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE RESTRICT
,
82 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT,
83 INDEX idx_client (client_id),
84 INDEX idx_user (user_id),
85 INDEX idx_date (date_vente),
86 INDEX idx_statut (statut),
87 INDEX idx_numero (numero_facture)
88 ) ENGINE=InnoDB;
89
90 -- Table ventes_details
91 CREATE TABLE ventes_details (
92 id INT AUTO_INCREMENT PRIMARY KEY,
93 vente_id INT NOT NULL,
94 produit_id INT NOT NULL,
95 quantite INT NOT NULL,
96 prix_unitaire DECIMAL(10,2) NOT NULL,
97 sous_total DECIMAL(10,2) GENERATED ALWAYS AS
98 (quantite * prix_unitaire) STORED,
99 FOREIGN KEY (vente_id) REFERENCES ventes(id) ON DELETE CASCADE,
100 FOREIGN KEY (produit_id) REFERENCES produits(id) ON DELETE
RESTRICT,
101 INDEX idx_vente (vente_id),
102 INDEX idx_produit (produit_id)
103 ) ENGINE=InnoDB;
104
105 -- Table mouvements_stock
106 CREATE TABLE mouvements_stock (
107 id INT AUTO_INCREMENT PRIMARY KEY,
108 produit_id INT NOT NULL,
109 user_id INT NOT NULL,
110 type ENUM(’entree’, ’sortie’, ’ajustement’, ’vente’) NOT NULL,
111 quantite INT NOT NULL,
112 date_mouvement DATETIME DEFAULT CURRENT_TIMESTAMP,
6
Projet Gestion Commerciale PyQt6 + MySQL
113 description TEXT,
114 FOREIGN KEY (produit_id) REFERENCES produits(id) ON DELETE
CASCADE,
115 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT,
116 INDEX idx_produit (produit_id),
117 INDEX idx_date (date_mouvement),
118 INDEX idx_type (type)
119 ) ENGINE=InnoDB;
120
121 -- Table parametres
122 CREATE TABLE parametres (
123 id INT AUTO_INCREMENT PRIMARY KEY,
124 cle VARCHAR(100) UNIQUE NOT NULL,
125 valeur TEXT NOT NULL,
126 description TEXT,
127 updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP
128 ) ENGINE=InnoDB;
129
130 -- Trigger pour mise jour stock apres vente
131 DELIMITER //
132 CREATE TRIGGER after_vente_insert
133 AFTER INSERT ON ventes_details
134 FOR EACH ROW
135 BEGIN
136 UPDATE produits
137 SET stock_actuel = stock_actuel - [Link]
138 WHERE id = NEW.produit_id;
139
140 INSERT INTO mouvements_stock
141 (produit_id, user_id, type, quantite, description)
142 SELECT
143 NEW.produit_id,
144 v.user_id,
145 ’vente’,
146 [Link],
147 CONCAT(’Vente facture: ’, v.numero_facture)
148 FROM ventes v
149 WHERE [Link] = NEW.vente_id;
150 END//
151 DELIMITER ;
152
153 -- Vues utiles
154 CREATE VIEW vue_produits_alertes AS
155 SELECT
156 [Link],
157 [Link],
158 [Link] AS categorie,
159 p.stock_actuel,
160 p.stock_min
161 FROM produits p
7
Projet Gestion Commerciale PyQt6 + MySQL
162 JOIN categories c ON p.category_id = [Link]
163 WHERE p.stock_actuel <= p.stock_min;
164
165 CREATE VIEW vue_ventes_resume AS
166 SELECT
167 [Link],
168 v.numero_facture,
169 CONCAT([Link], ’ ’, [Link]) AS client,
170 [Link] AS vendeur,
171 v.date_vente,
172 v.montant_total,
173 v.montant_paye,
174 v.montant_reste,
175 [Link]
176 FROM ventes v
177 JOIN clients c ON v.client_id = [Link]
178 JOIN users u ON v.user_id = [Link];
Listing 2 – [Link] - Création des tables
4 Fonctionnalités Détaillées
4.1 Module Authentification
Fonctionnalités
— Écran de connexion avec validation
— Hachage sécurisé des mots de passe (bcrypt)
— Gestion de session utilisateur
— Trois niveaux de droits :
— Admin : Accès complet, gestion utilisateurs
— Manager : Consultation rapports, validation ventes
— Vendeur : Création ventes, consultation clients/produits
— Déconnexion automatique après inactivité
4.2 Module Clients
Fonctions CRUD :
— Ajouter un nouveau client (formulaire avec validation)
— Modifier les informations d’un client
— Supprimer un client (avec vérification des ventes associées)
— Recherche multicritère (nom, téléphone, email)
— Affichage de l’historique des achats
— Export de la liste clients (Excel/PDF)
8
Projet Gestion Commerciale PyQt6 + MySQL
Interface :
— TableView avec tri et filtres
— Double-clic pour édition rapide
— Statistiques par client (CA total, dernière visite)
4.3 Module Produits et Stock
Gestion produits :
— CRUD complet des produits
— Organisation par catégories
— Calcul automatique de la marge bénéficiaire
— Images produits (optionnel)
— Gestion des stocks avec alertes
Suivi des stocks :
— Alertes visuelles pour stock bas (< stock minimum)
— Historique des mouvements de stock
— Entrées/sorties manuelles avec justification
— Ajustements d’inventaire
— Rapport d’état des stocks
4.4 Module Ventes
Création de ventes :
— Sélection client (création rapide si nouveau)
— Ajout produits par recherche ou scan code-barre (optionnel)
— Calcul automatique des totaux et TVA
— Gestion des remises (montant ou pourcentage)
— Validation et génération numéro de facture automatique
Gestion des paiements :
— Paiement complet, partiel ou à crédit
— Suivi des impayés
— Historique des paiements par facture
Impression et exports :
— Génération PDF de la facture (avec logo entreprise)
— Impression directe
— Export des ventes (Excel) avec filtres par date
9
Projet Gestion Commerciale PyQt6 + MySQL
4.5 Module Statistiques et Rapports
Tableau de bord :
— Chiffre d’affaires du jour/semaine/mois
— Nombre de ventes réalisées
— Top 5 produits vendus
— Top 5 clients
— État des stocks critiques
— Graphiques (évolution CA, répartition par catégorie)
Rapports disponibles :
— Rapport de ventes par période
— Rapport de stock avec valorisation
— Rapport des impayés clients
— Rapport d’activité par vendeur
— Export PDF et Excel
4.6 Module Paramètres
— Configuration entreprise (nom, logo, coordonnées)
— Gestion des utilisateurs (admin uniquement)
— Paramètres généraux (devise, TVA, format factures)
— Sauvegarde/Restauration de la base de données
— Journal d’activité (logs)
5 Planning de Développement (3 semaines)
Voir Table 2
6 Livrables du Projet
6.1 Documents techniques
— Spécifications fonctionnelles détaillées
— Modèle de données (MCD/MLD)
— Architecture technique
— Scripts SQL (création + données de test)
6.2 Code source
— Application PyQt6 complète et commentée
— Tests unitaires pour les modèles critiques
— Scripts d’installation et de configuration
— Fichier [Link]
10
Projet Gestion Commerciale PyQt6 + MySQL
6.3 Exécutable
— Créez un éxécutable avec pyinstaller
— Créez un installable avec InnoSetup
6.4 Documentation
— Manuel utilisateur avec captures d’écran
— Guide d’installation et de déploiement
— Documentation technique du code (docstrings)
— Guide de maintenance et évolutions futures
6.5 Présentation
— Présentation PowerPoint du projet
— Démonstration vidéo des fonctionnalités
— Rapport de développement (3 semaines)
7 Points d’Attention
7.1 Sécurité
— Mots de passe : Toujours utiliser bcrypt pour le hachage
— Connexion DB : Utiliser des variables d’environnement (.env)
— SQL Injection : Utiliser des requêtes préparées (paramétrisées)
— Validation : Valider toutes les entrées utilisateur
— Sessions : Implémenter un timeout de session
7.2 Performance
— Indexer les colonnes fréquemment recherchées
— Utiliser des connexions poolées pour MySQL
— Limiter les résultats des requêtes (pagination)
— Optimiser les jointures SQL
— Mettre en cache les données statiques
7.3 Ergonomie
— Interface claire et intuitive
— Raccourcis clavier pour les actions fréquentes
— Messages d’erreur explicites
— Confirmation pour les actions critiques
— Feedback visuel des actions (spinners, progress bars)
11