-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBelleFleur.sql
232 lines (203 loc) · 7.74 KB
/
BelleFleur.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
-- Table of content
-- 1. Init
-- 2. Schema
-- 3. Triggers/Procedures
-- 4. Inserts
--
-- INIT
--
DROP DATABASE IF EXISTS BelleFleur;
CREATE DATABASE BelleFleur;
USE BelleFleur;
--
-- SCHEMA
--
CREATE TABLE client (
client_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
client_prenom VARCHAR(50),
client_nom VARCHAR(50),
client_email varchar(50),
client_adresse VARCHAR(255),
client_carte_de_credit VARCHAR(50),
client_pass VARCHAR(200)
);
CREATE TABLE reduction (
reduction_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
reduction_nom varchar(50),
reduction_commandes_mois int,
reduction_valeur decimal
);
CREATE TABLE magasin (
magasin_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
magasin_nom VARCHAR(50),
magasin_adresse VARCHAR(255)
);
CREATE TABLE bouquet (
bouquet_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
bouquet_nom VARCHAR(50),
bouquet_prix decimal,
bouquet_description VARCHAR(255),
bouquet_categorie ENUM('Toute occasion', 'St-Valentin', 'Fête des mères', 'Mariage', 'Personnalisé')
);
CREATE TABLE commande (
commande_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
commande_adresse_livraison VARCHAR(255),
commande_date_livraison_desiree datetime,
commande_etat ENUM('VINV', 'CC', 'CPAV', 'CAL', 'CL'),
commande_date_creation datetime,
client_id int,
bouquet_id int,
magasin_id int,
reduction_id int,
FOREIGN KEY (client_id) REFERENCES client (client_id),
FOREIGN KEY (bouquet_id) REFERENCES bouquet (bouquet_id),
FOREIGN KEY (magasin_id) REFERENCES magasin (magasin_id),
FOREIGN KEY (reduction_id) REFERENCES reduction (reduction_id)
);
CREATE TABLE produit (
produit_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
produit_nom varchar(50),
produit_type ENUM('fleur', 'accessoire'),
produit_prix decimal,
produit_categorie ENUM('Fleur Classique', 'Fleur exotique', 'Accessoire'),
produit_disponibilite_mois VARCHAR(50) -- "1,2,3,9,10,11,12" / "*"
);
CREATE TABLE employe (
employe_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
employe_proprietaire bool,
employe_email varchar(50),
employe_pass VARCHAR(200),
employe_prenom varchar(50),
employe_nom varchar(50),
magasin_id int,
FOREIGN KEY (magasin_id) REFERENCES magasin (magasin_id)
);
CREATE TABLE compositionbouquet (
bouquet_id int NOT NULL,
produit_id int NOT NULL,
composition_quantite int,
PRIMARY KEY (bouquet_id, produit_id),
FOREIGN KEY (bouquet_id) REFERENCES bouquet (bouquet_id),
FOREIGN KEY (produit_id) REFERENCES produit (produit_id)
);
CREATE TABLE stocks (
magasin_id int NOT NULL,
produit_id int NOT NULL,
stock_qte int,
stock_qte_minimum int,
PRIMARY KEY (magasin_id, produit_id),
FOREIGN KEY (magasin_id) REFERENCES magasin (magasin_id),
FOREIGN KEY (produit_id) REFERENCES produit (produit_id)
);
--
-- TRIGGERS/PROCEDURES
--
-- On change le délimiteur pour pouvoir utiliser le ; dans les procédures
DELIMITER $$
-- Procedure 1: Récupère la réduction en fonction du nombre de commandes du client le mois précédent
CREATE PROCEDURE get_reduction_client(client_id_param INT)
BEGIN
-- Variables
DECLARE commandes INT;
-- Compter le nombre de commandes du client le mois précédent
SELECT COUNT(*) AS commandes
FROM commande
WHERE client_id = client_id_param
AND commande_date_creation >= DATE_SUB(NOW(), INTERVAL 30 DAY);
-- Trouver la meilleure réduction disponible pour le nombre de commandes
SELECT *
FROM reduction
WHERE reduction_commandes_mois <= commandes
ORDER BY reduction_commandes_mois DESC
LIMIT 1;
END$$
-- Trigger 1: Creer un stock pour un nouveau magasin
CREATE TRIGGER insert_zero_stock_for_new_magasin
AFTER INSERT
ON magasin
FOR EACH ROW
BEGIN
INSERT INTO stocks (magasin_id, produit_id, stock_qte, stock_qte_minimum)
SELECT NEW.magasin_id, produit.produit_id, 0, 0
FROM produit;
END$$
-- Trigger 2: Creer un stock pour un nouveau produit
CREATE TRIGGER insert_zero_stock_for_new_produit
AFTER INSERT
ON produit
FOR EACH ROW
BEGIN
INSERT INTO stocks (magasin_id, produit_id, stock_qte, stock_qte_minimum)
SELECT magasin.magasin_id, NEW.produit_id, 0, 0
FROM magasin;
END$$
-- Trigger 3: Mettre à jour les stocks lors du passage d'une commande au statut "CC"
CREATE TRIGGER update_stock
AFTER UPDATE
ON commande
FOR EACH ROW
BEGIN
IF NEW.commande_etat = 'CC' THEN
UPDATE stocks
SET stock_qte = stock_qte - (
SELECT composition_quantite
FROM compositionbouquet
WHERE bouquet_id = NEW.bouquet_id AND produit_id = produit_id
)
WHERE produit_id IN (SELECT produit_id FROM compositionbouquet WHERE bouquet_id = NEW.bouquet_id) AND magasin_id = NEW.magasin_id;
END IF;
END$$
DELIMITER ;
--
-- INSERTS
--
-- Bouquets/Produits/Compositions
INSERT INTO bouquet (bouquet_id, bouquet_nom, bouquet_prix, bouquet_description, bouquet_categorie) VALUES
(1, 'Gros Merci', 45, 'Arrangement floral avec marguerites et verdure', 'Toute occasion'),
(2, 'L’amoureux', 65, 'Arrangement floral avec roses blanches et roses rouges', 'St-Valentin'),
(3, 'L’Exotique', 40, 'Arrangement floral avec ginger, oiseaux du paradis, roses et genet', 'Toute occasion'),
(4, 'Maman', 80, 'Arrangement floral avec gerbera, roses blanches, lys et alstroméria', 'Fête des mères'),
(5, 'Vive la mariée', 120, 'Arrangement floral avec lys et orchidées', 'Mariage');
INSERT INTO produit (produit_id, produit_nom, produit_type, produit_prix, produit_categorie, produit_disponibilite_mois) VALUES
(1, 'Gerbera', 'fleur', 5.00, 'Fleur Classique', '*'),
(2, 'Ginger', 'fleur', 4.00, 'Fleur exotique', '*'),
(3, 'Glaïeul', 'fleur', 1.00, 'Fleur exotique', '5,6,7,8,9,10'),
(4, 'Marguerite', 'fleur', 2.25, 'Fleur Classique', '*'),
(5, 'Rose rouge', 'fleur', 2.50, 'Fleur Classique', '*'),
(6, 'Lys', 'fleur', 3.50, 'Fleur Classique', '*'),
(7, 'Orchidée', 'fleur', 8.00, 'Fleur exotique', '*'),
(8, 'Verdure', 'accessoire', 2.00, 'Fleur Classique', '*'),
(9, 'Oiseau du paradis', 'fleur', 6.00, 'Fleur exotique', '*');
INSERT INTO compositionbouquet (bouquet_id, produit_id, composition_quantite) VALUES
(1, 4, 3), -- Gros Merci avec marguerites
(1, 8, 2), -- Gros Merci avec verdure
(2, 5, 6), -- L'amoureux avec roses rouges
(3, 2, 3), -- L'Exotique avec ginger
(3, 4, 4), -- L'Exotique avec marguerites
(3, 9, 2), -- L'Exotique avec oiseaux du paradis
(3, 5, 3), -- L'Exotique avec roses
(4, 1, 3), -- Maman avec gerberas
(4, 5, 2), -- Maman avec roses blanches
(4, 6, 1), -- Maman avec lys
(4, 7, 2), -- Maman avec orchidées
(5, 1, 5), -- Vive la mariée avec lys
(5, 7, 3); -- Vive la mariée avec orchidées
-- Réductions
INSERT INTO reduction(reduction_id, reduction_nom, reduction_commandes_mois, reduction_valeur)
VALUES
(1, 'Fidélité - Normal', 0, 0.0),
(2, 'Fidélité - Bronze', 1, 0.05),
(3, 'Fidélité - OR', 5, 0.15);
-- Magasins/employés
INSERT INTO magasin (magasin_id, magasin_nom, magasin_adresse) VALUES
(1, 'Michel et une Belle de nuit', '5 Rue des Roses, 75001 Paris'),
(2, 'Le Pétale Rieur', '20 Rue des Lilas, 69002 Lyon'),
(3, 'La Fleur qui Fait Plaisir', '10 Rue des Iris, 33000 Bordeaux');
INSERT INTO employe (employe_id, employe_proprietaire, employe_email, employe_pass, employe_prenom, employe_nom, magasin_id) VALUES
(1, true, 'michel@bellefleur.fr', 'fleur', 'Michel', 'Bellefleur', 1),
(2, false, 'julien@bellefleur.fr', 'fleur', 'Julien', 'Leroy', 1),
(3, false, 'marie@bellefleur.fr', 'fleur', 'Marie', 'Dubois', 1),
(4, false, 'antoine@bellefleur.fr', 'fleur', 'Antoine', 'Dupont', 2),
(5, false, 'claire@bellefleur.fr', 'fleur', 'Claire', 'Martin', 2),
(6, false, 'mathieu@bellefleur.fr', 'fleur', 'Mathieu', 'Girard', 2),
(7, false, 'olivia@bellefleur.fr', 'fleur', 'Olivia', 'Rousseau', 3);