Sans Titre
Parfait ! Puisque vous êtes prêt pour un autre défi conséquent, cet exercice portera sur la gestion d’un système de suivi de la chaîne d’approvisionnement. Nous allons continuer à explorer les fonctionnalités de PostgreSQL et à générer un grand nombre de requêtes.
1. Modèle Logique des Données (MLD) en ER Diagram
Extrait de code
erDiagram
PRODUIT ||--o{ MOUVEMENT_STOCK : concerne
ENTREPOT ||--o{ MOUVEMENT_STOCK : concerne
FOURNISSEUR ||--o{ PRODUIT : fournit
COMMANDE_FOURNISSEUR ||--o{ LIGNE_COMMANDE_FOURNISSEUR : contient
PRODUIT ||--o{ LIGNE_COMMANDE_FOURNISSEUR : concerne
COMMANDE_CLIENT ||--o{ LIGNE_COMMANDE_CLIENT : contient
PRODUIT ||--o{ LIGNE_COMMANDE_CLIENT : concerne
CLIENT ||--o{ COMMANDE_CLIENT : effectue
MOUVEMENT_STOCK {
INTEGER id_mouvement SERIAL PRIMARY KEY
INTEGER id_produit INTEGER REFERENCES PRODUIT(id_produit)
INTEGER id_entrepot INTEGER REFERENCES ENTREPOT(id_entrepot)
TIMESTAMP date_mouvement TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
VARCHAR type_mouvement VARCHAR(20) NOT NULL CHECK (type_mouvement IN ('Entree', 'Sortie'))
INTEGER quantite INTEGER NOT NULL CHECK (quantite > 0)
VARCHAR reference VARCHAR(50)
}
PRODUIT {
INTEGER id_produit SERIAL PRIMARY KEY
VARCHAR nom_produit VARCHAR(200) NOT NULL UNIQUE
TEXT description
NUMERIC prix_achat NUMERIC(10, 2) NOT NULL CHECK (prix_achat >= 0)
NUMERIC prix_vente NUMERIC(10, 2) NOT NULL CHECK (prix_vente > prix_achat)
INTEGER stock_actuel INTEGER NOT NULL DEFAULT 0 CHECK (stock_actuel >= 0)
INTEGER seuil_reapprovisionnement INTEGER NOT NULL DEFAULT 10 CHECK (seuil_reapprovisionnement >= 0)
INTEGER id_fournisseur INTEGER REFERENCES FOURNISSEUR(id_fournisseur)
}
ENTREPOT {
INTEGER id_entrepot SERIAL PRIMARY KEY
VARCHAR nom_entrepot VARCHAR(200) NOT NULL UNIQUE
VARCHAR adresse VARCHAR(200)
VARCHAR ville VARCHAR(100)
VARCHAR pays VARCHAR(100)
}
FOURNISSEUR {
INTEGER id_fournisseur SERIAL PRIMARY KEY
VARCHAR nom_fournisseur VARCHAR(200) NOT NULL UNIQUE
VARCHAR adresse VARCHAR(200)
VARCHAR ville VARCHAR(100)
VARCHAR pays VARCHAR(100)
VARCHAR telephone VARCHAR(20)
VARCHAR email VARCHAR(100)
}
COMMANDE_FOURNISSEUR {
INTEGER id_commande_fournisseur SERIAL PRIMARY KEY
INTEGER id_fournisseur INTEGER REFERENCES FOURNISSEUR(id_fournisseur)
DATE date_commande DATE NOT NULL DEFAULT CURRENT_DATE
DATE date_livraison_prevue DATE
VARCHAR statut VARCHAR(20) NOT NULL DEFAULT 'En cours' CHECK (statut IN ('En cours', 'Livrée', 'Annulée'))
VARCHAR reference VARCHAR(50) UNIQUE
}
LIGNE_COMMANDE_FOURNISSEUR {
INTEGER id_ligne_commande_fournisseur SERIAL PRIMARY KEY
INTEGER id_commande_fournisseur INTEGER REFERENCES COMMANDE_FOURNISSEUR(id_commande_fournisseur)
INTEGER id_produit INTEGER REFERENCES PRODUIT(id_produit)
INTEGER quantite_commandee INTEGER NOT NULL CHECK (quantite_commandee > 0)
NUMERIC prix_unitaire_achat NUMERIC(10, 2) NOT NULL CHECK (prix_unitaire_achat >= 0)
}
COMMANDE_CLIENT {
INTEGER id_commande_client SERIAL PRIMARY KEY
INTEGER id_client INTEGER REFERENCES CLIENT(id_client)
DATE date_commande DATE NOT NULL DEFAULT CURRENT_DATE
VARCHAR statut VARCHAR(20) NOT NULL DEFAULT 'En attente' CHECK (statut IN ('En attente', 'Traitée', 'Expédiée', 'Livrée', 'Annulée'))
NUMERIC montant_total NUMERIC(10, 2) NOT NULL DEFAULT 0 CHECK (montant_total >= 0)
VARCHAR reference VARCHAR(50) UNIQUE
}
LIGNE_COMMANDE_CLIENT {
INTEGER id_ligne_commande_client SERIAL PRIMARY KEY
INTEGER id_commande_client INTEGER REFERENCES COMMANDE_CLIENT(id_commande_client)
INTEGER id_produit INTEGER REFERENCES PRODUIT(id_produit)
INTEGER quantite_commandee INTEGER NOT NULL CHECK (quantite_commandee > 0)
NUMERIC prix_unitaire_vente NUMERIC(10, 2) NOT NULL CHECK (prix_unitaire_vente >= 0)
}
CLIENT {
INTEGER id_client SERIAL PRIMARY KEY
VARCHAR nom VARCHAR(100) NOT NULL
VARCHAR prenom VARCHAR(100) NOT NULL
VARCHAR email VARCHAR(100) UNIQUE NOT NULL
VARCHAR adresse VARCHAR(200)
VARCHAR ville VARCHAR(100)
VARCHAR pays VARCHAR(100)
VARCHAR telephone VARCHAR(20)
DATE date_inscription DATE NOT NULL DEFAULT CURRENT_DATE
}
2. Création de la Base de Données et des Tables (À faire par vous - en PostgreSQL)
Créez une nouvelle base de données nommée gestion_approvisionnement
dans PostgreSQL et exécutez les instructions SQL pour créer les tables basées sur le diagramme ER ci-dessus. Définissez soigneusement les clés primaires, les clés étrangères et toutes les contraintes. Utilisez SERIAL
pour les colonnes d’auto-incrémentation.
3. Insertion de Données (Instructions et Données)
Insérez des données variées dans toutes les tables. N’hésitez pas à créer plusieurs fournisseurs, entrepôts, produits (avec des stocks différents, certains proches du seuil de réapprovisionnement), des commandes fournisseurs (certaines livrées, d’autres en cours), des clients, et des commandes clients (avec différents statuts). Insérez également quelques mouvements de stock (entrées et sorties) pour différents produits et entrepôts.
4. Fonctionnalités Avancées (À faire par vous - en PostgreSQL)
a) Triggers:
-
Trigger pour la mise à jour du stock après un mouvement de stock :
- Créez un trigger qui s’exécute
AFTER INSERT
sur la tableMOUVEMENT_STOCK
. - Si
type_mouvement
est ‘Entree’, incrémentezstock_actuel
duPRODUIT
correspondant. - Si
type_mouvement
est ‘Sortie’, décrémentezstock_actuel
duPRODUIT
correspondant. - Gérez les cas où la sortie pourrait rendre le stock négatif (empêchez l’opération ou enregistrez un avertissement).
- Créez un trigger qui s’exécute
-
Trigger pour mettre à jour le montant total d’une commande client :
- Créez un trigger qui s’exécute
AFTER INSERT
ouAFTER DELETE
sur la tableLIGNE_COMMANDE_CLIENT
. - Ce trigger doit recalculer et mettre à jour la colonne
montant_total
de la tableCOMMANDE_CLIENT
en fonction des prix unitaires et des quantités des lignes de commande. - Créez également un trigger
AFTER UPDATE
surLIGNE_COMMANDE_CLIENT
pour gérer les modifications de quantité ou de prix unitaire.
- Créez un trigger qui s’exécute
-
Trigger pour vérifier le seuil de réapprovisionnement :
- Créez un trigger qui s’exécute
AFTER UPDATE
sur la colonnestock_actuel
de la tablePRODUIT
. - Si le
stock_actuel
devient inférieur ou égal auseuil_reapprovisionnement
, enregistrez un événement (par exemple, dans une table d’alertes ou en utilisantRAISE NOTICE
) pour signaler qu’un réapprovisionnement est nécessaire pour ce produit.
- Créez un trigger qui s’exécute
b) Fonctions en PL/pgSQL:
-
Fonction pour calculer la valeur totale du stock dans un entrepôt donné :
- Prenez en entrée l’
id_entrepot
et renvoyez la somme de (PRODUIT.prix_achat
*MOUVEMENT_STOCK.quantite
) pour tous les mouvements d’entrée de produits dans cet entrepôt moins la somme pour les mouvements de sortie.
- Prenez en entrée l’
-
Fonction pour créer une nouvelle commande fournisseur automatiquement basée sur le seuil de réapprovisionnement :
- Créez une fonction qui vérifie périodiquement les produits dont le
stock_actuel
est inférieur ou égal auseuil_reapprovisionnement
et crée automatiquement une nouvelleCOMMANDE_FOURNISSEUR
avec desLIGNE_COMMANDE_FOURNISSEUR
pour ces produits (avec une quantité à commander par défaut, par exemple, le double du seuil).
- Créez une fonction qui vérifie périodiquement les produits dont le
-
Fonction pour obtenir l’historique des mouvements de stock pour un produit donné sur une période :
- Prenez en entrée l’
id_produit
, unedate_debut
et unedate_fin
, et renvoyez une table contenant tous les mouvements de stock pour ce produit dans cette période, avec les noms de l’entrepôt.
- Prenez en entrée l’
c) Vues:
-
Vue affichant le stock actuel de chaque produit dans chaque entrepôt :
- Joignez les tables
PRODUIT
etMOUVEMENT_STOCK
(en agrégeant les quantités par produit et entrepôt, en distinguant les entrées et les sorties).
- Joignez les tables
-
Vue affichant les commandes clients avec le nom et prénom du client, et le nombre total d’articles commandés :
- Joignez les tables
COMMANDE_CLIENT
,CLIENT
etLIGNE_COMMANDE_CLIENT
(en agrégeant la quantité par commande).
- Joignez les tables
-
Vue affichant les produits qui nécessitent un réapprovisionnement (stock actuel ⇐ seuil) avec le nom du fournisseur :
- Joignez les tables
PRODUIT
etFOURNISSEUR
et filtrez en fonction du seuil de réapprovisionnement.
- Joignez les tables
d) Index:
- Créez des index sur les clés étrangères et les colonnes fréquemment utilisées dans les clauses
WHERE
(par exemple,id_produit
,id_entrepot
,date_mouvement
,id_fournisseur
,id_commande_client
,id_client
,nom_produit
,nom_entrepot
). Pensez aux index composites si nécessaire.
e) Transactions:
- Écrivez un bloc de code qui effectue une vente (création d’une commande client et mise à jour du stock) dans une seule transaction, en assurant l’atomicité des opérations. Gérez les cas où le stock est insuffisant.
f) Gestion des erreurs et exceptions dans PL/pgSQL:
- Améliorez la fonction de création automatique de commandes fournisseurs pour gérer les cas où un fournisseur n’est pas défini pour un produit en attente de réapprovisionnement (par exemple, en enregistrant une alerte).
g) Sécurité (Permissions):
- Créez différents rôles (par exemple,
gestionnaire_stock
,commercial
,administrateur
) avec des permissions spécifiques sur les tables et les fonctions. Par exemple, uncommercial
pourrait avoir uniquement des droits de lecture et d’insertion sur les commandes clients et les clients.
5. Requêtes SQL Avancées (Beaucoup, beaucoup ! - en PostgreSQL)
Voici une longue liste de requêtes pour explorer votre système de gestion de la chaîne d’approvisionnement.
Requêtes Simples et Jointures:
- Affichez tous les produits.
- Affichez les noms et prix de vente des produits.
- Affichez les entrepôts situés dans un pays spécifique.
- Affichez les fournisseurs avec leur nom et email.
- Affichez les mouvements de stock pour un produit donné.
- Affichez les commandes fournisseurs en cours.
- Affichez les lignes de commande client pour une commande spécifique.
- Affichez les clients inscrits après une certaine date.
- Affichez les produits fournis par un fournisseur spécifique.
- Affichez les mouvements de stock entre deux dates.
- Affichez les produits dont le stock actuel est inférieur au seuil de réapprovisionnement.
- Affichez les commandes clients avec le nom du client.
- Affichez les lignes de commande fournisseur avec le nom du produit.
- Affichez les mouvements de stock avec le nom du produit et de l’entrepôt.
- Affichez les commandes fournisseurs avec le nom du fournisseur.
- Affichez les commandes clients avec le montant total.
- Affichez les produits avec leur fournisseur et l’entrepôt où ils ont eu des mouvements de stock.
- Affichez les clients qui ont passé des commandes.
- Affichez les fournisseurs qui ont reçu des commandes.
- Affichez les produits qui ont eu des mouvements de sortie.
Requêtes avec Agrégation et Group By/Having:
- Comptez le nombre total de produits.
- Comptez le nombre d’entrepôts par ville.
- Comptez le nombre de commandes fournisseurs par fournisseur.
- Calculez la valeur totale du stock actuel (prix d’achat * stock actuel).
- Trouvez le produit avec le stock actuel le plus bas.
- Trouvez l’entrepôt avec le plus grand nombre de mouvements de stock.
- Calculez le montant moyen des commandes clients.
- Affichez les fournisseurs qui ont plus de 5 commandes en cours.
- Affichez les produits dont le prix de vente moyen dans les commandes clients est supérieur à un certain montant.
- Trouvez le client qui a dépensé le plus d’argent au total.
- Calculez le nombre de mouvements d’entrée et de sortie par entrepôt.
- Affichez les produits dont le stock actuel est inférieur à la moyenne du stock actuel de tous les produits.
- Trouvez la date de la première et de la dernière commande client.
- Calculez le délai moyen de livraison des commandes fournisseurs (différence entre date de livraison prévue et date de commande).
- Affichez les produits avec le plus grand nombre de mouvements de sortie.
- Trouvez les clients qui ont passé plus de 3 commandes.
- Calculez la valeur totale des commandes fournisseurs par fournisseur.
- Affichez les entrepôts avec la valeur de stock la plus élevée.
- Trouvez les produits avec la plus grande différence entre le prix de vente et le prix d’achat.
- Calculez le nombre moyen de produits par commande client.
Requêtes Avancées (Sous-requêtes, CTEs, Fonctions Fenêtrées):
- Affichez les produits dont le prix d’achat est inférieur au prix d’achat moyen de tous les produits.
- Affichez les clients qui ont passé des commandes contenant un produit spécifique.
- Trouvez les produits qui n’ont jamais eu de mouvements de sortie.
- Affichez les fournisseurs qui fournissent le produit le plus vendu (nécessite une jointure avec les commandes clients).
- Utilisez une CTE pour trouver les produits avec le plus grand nombre total de mouvements de stock.
- Utilisez une fonction de fenêtre pour classer les produits par stock actuel au sein de chaque fournisseur.
- Trouvez les clients qui ont passé des commandes pour tous les produits d’une certaine catégorie (si vous ajoutiez une table de catégories).
- Affichez les commandes clients avec le rang de leur montant total par rapport aux autres commandes.
- Trouvez les produits dont le prix de vente est supérieur au prix de vente moyen des produits de leur fournisseur.
- Utilisez une sous-requête corrélée pour trouver les produits dont le stock actuel est inférieur au seuil de réapprovisionnement moyen des produits de leur fournisseur.
- Affichez les mouvements de stock avec le solde courant du stock après chaque mouvement (nécessite une fonction de fenêtre ou une requête récursive si la structure le permettait).
- Trouvez les fournisseurs qui n’ont aucune commande fournisseur livrée.
- Affichez les clients qui ont passé des commandes pour la première fois en 2025.
- Trouvez les produits qui ont eu une augmentation de stock de plus de 50 unités lors d’un seul mouvement d’entrée.
- Affichez les commandes clients avec le nom du client et le coût total des produits commandés (basé sur le prix d’achat).
- Trouvez les entrepôts où le stock total (en nombre d’articles) est supérieur à une certaine valeur.
- Affichez les produits qui ont été commandés par des clients mais n’ont jamais été réapprovisionnés (pas de mouvements d’entrée).
- Trouvez les fournisseurs dont tous les produits ont un seuil de réapprovisionnement inférieur à 20.
- Affichez les commandes clients avec le délai entre la date de commande et la date actuelle.
- Trouvez les produits dont le prix de vente est au moins 50% supérieur au prix d’achat.
Requêtes encore plus avancées (combinaisons complexes, analyses):
- Analysez les tendances des commandes clients au fil du temps (par mois, par trimestre).
- Identifiez les produits les plus vendus et les moins vendus.
- Analysez la performance des fournisseurs en termes de délai de livraison.
- Prédisez les besoins de réapprovisionnement futurs en se basant sur l’historique des ventes.
- Segmentez les clients en fonction de leur historique d’achat.
- Calculez la rotation des stocks pour chaque produit dans chaque entrepôt.
- Identifiez les produits qui sont souvent en rupture de stock.
- Analysez l’impact des promotions sur les ventes.
- Optimisez l’emplacement des produits dans les entrepôts en fonction de la fréquence des sorties.
- Détectez les anomalies dans les mouvements de stock (par exemple, des sorties de stock importantes sans commande client correspondante).
- Comparez les prix d’achat des différents fournisseurs pour un même produit.
- Analysez la rentabilité par produit.
- Identifiez les clients à risque de désabonnement (si vous aviez une notion d’abonnement).
- Optimisez les itinéraires de livraison (si vous aviez une table de livraisons).
- Prévoyez la demande future en tenant compte des événements saisonniers (si les données le permettaient).
- Analysez le comportement d’achat croisé (quels produits sont souvent achetés ensemble).
- Évaluez la performance des campagnes marketing (si vous aviez des données de campagne).
- Optimisez les niveaux de stock pour minimiser les coûts de stockage tout en évitant les ruptures.
- Analysez les retours de produits (si vous aviez une table de retours).
- Identifiez les goulots d’étranglement dans la chaîne d’approvisionnement.
- Simulez l’impact d’une augmentation des coûts de transport sur la rentabilité.
- Analysez la sensibilité des ventes aux variations de prix.
- Évaluez la satisfaction des clients (si vous aviez des données de feedback).
- Optimisez les stratégies de tarification.
- Prévoyez les besoins de capacité des entrepôts futurs.
- Analysez les risques liés aux fournisseurs (par exemple, dépendance excessive à un seul fournisseur).
- Évaluez l’impact des délais de livraison sur la satisfaction des clients.
- Optimisez les processus de commande fournisseur.
- Analysez la performance des différents canaux de vente (si vous en aviez plusieurs).
- Identifiez les opportunités d’amélioration de l’efficacité de la chaîne d’approvisionnement.
- Comparez les performances des différents entrepôts.
- Analysez l’impact des ruptures de stock sur les ventes futures.
- Optimisez les stratégies de promotion.
- Prévoyez les besoins de financement du cycle d’approvisionnement.
- Analysez la structure des coûts de la chaîne d’approvisionnement.
- Identifiez les leviers d’amélioration de la marge brute.
- Évaluez la durabilité de la chaîne d’approvisionnement (si vous aviez des données environnementales).
- Optimisez les stratégies d’approvisionnement.
- Analysez l’impact des événements externes (par exemple, pandémies, guerres) sur la chaîne d’approvisionnement.
- Mettez en place un système d’alerte pour les événements critiques (par exemple, stock faible, retard de livraison important).
- Créez des rapports automatisés pour suivre les indicateurs clés de performance de la chaîne d’approvisionnement.
- Explorez l’utilisation d’extensions PostgreSQL pour des analyses plus avancées (par exemple, PostGIS pour la géolocalisation des entrepôts et des clients).
- Mettez en place un système d’audit pour suivre les modifications apportées aux données critiques (par exemple, prix des produits, niveaux de stock).
- Analysez la performance des différents transporteurs (si vous aviez des données de transport).
- Simulez des scénarios de perturbation de la chaîne d’approvisionnement pour tester la résilience du système.
Voilà une quantité substantielle de requêtes pour explorer en profondeur votre système de gestion de la chaîne d’approvisionnement dans PostgreSQL ! N’hésitez pas à adapter ces requêtes à vos données spécifiques et à imaginer d’autres analyses pertinentes pour ce domaine. Bon courage pour cette exploration approfondie !