]> Git — Sourcephile - tmp/julm/LesQuatreRoux.git/blob - LesQuatreRoux.log
dev sql and ott
[tmp/julm/LesQuatreRoux.git] / LesQuatreRoux.log
1 /*C4*/SET SCHEMA B
2 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
6 DISCONNECT
7 /*C5*/SET SCHEMA B
8 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
10 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
11 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
12 DISCONNECT
13 /*C6*/SET SCHEMA B
14 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
15 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
16 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
17 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
18 DISCONNECT
19 /*C7*/SET SCHEMA B
20 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
21 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
22 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
23 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
24 CREATE FUNCTION listeProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE (SELECT nom || ' (' || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.') || nvl(unit\u00e9,'') || ')' AS NOM_COMPLET, ID FROM "Produit");\u000a END
25 DISCONNECT
26 /*C8*/SET SCHEMA B
27 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
28 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
29 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
30 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
31 DISCONNECT
32 /*C9*/SET SCHEMA B
33 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
34 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
35 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
36 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
37 DROP FUNCTION listeProduit IF EXISTS
38 CREATE FUNCTION listeProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE (SELECT nom || ' (' || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.') || nvl(unit\u00e9,'') || ')' AS NOM_COMPLET, ID FROM "Produit");\u000a END
39 DISCONNECT
40 /*C10*/SET SCHEMA B
41 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
42 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
43 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
44 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
45 DROP FUNCTION listeDesProduits IF EXISTS
46 CREATE FUNCTION listeDesProduits()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE (SELECT nom || ' (' || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.') || nvl(unit\u00e9,'') || ')' AS NOM_COMPLET, ID FROM "Produit");\u000a END
47 DISCONNECT
48 /*C11*/SET SCHEMA B
49 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
50 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
51 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
52 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
53 DROP FUNCTION listeDesProduits IF EXISTS
54 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE (SELECT nom || ' (' || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.') || nvl(unit\u00e9,'') || ')' AS NOM_COMPLET, ID FROM "Produit");\u000a END
55 DISCONNECT
56 /*C12*/SET SCHEMA B
57 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
58 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
59 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
60 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
61 DROP FUNCTION choisirUnProduit IF EXISTS
62 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE (SELECT nom || ' (' || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.') || nvl(unit\u00e9,'') || ')' AS NOM_COMPLET, ID FROM "Produit");\u000a END
63 DISCONNECT
64 /*C3*/SET SCHEMA B
65 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
66 COMMIT
67 /*C13*/SET SCHEMA B
68 SET SCHEMA B
69 DISCONNECT
70 /*C14*/SET SCHEMA B
71 DROP SCHEMA B CASCADE
72 DISCONNECT
73 /*C15*/SET SCHEMA B
74 SET DATABASE COLLATION "French"
75 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
76 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
77 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
78 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
79 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
80 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
81 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
82 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
83 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
84 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
85 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
86 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
87 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
88 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
89 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date INTEGER NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
90 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a )
91 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
92 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
93 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
94 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
95 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
96 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
97 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
98 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
99 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a )
100 DISCONNECT
101 /*C16*/SET SCHEMA B
102 SET SCHEMA B
103 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
104 COMMIT
105 INSERT INTO "Lieu" VALUES(1,'Gentioux')
106 COMMIT
107 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
108 COMMIT
109 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
110 COMMIT
111 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
112 COMMIT
113 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
114 COMMIT
115 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
116 COMMIT
117 INSERT INTO "Lieu" VALUES(7,'Tarnac')
118 COMMIT
119 INSERT INTO "Lieu" VALUES(8,'Felletin')
120 COMMIT
121 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
122 COMMIT
123 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
124 COMMIT
125 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
126 COMMIT
127 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
128 COMMIT
129 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
130 COMMIT
131 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
132 COMMIT
133 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
134 COMMIT
135 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
136 COMMIT
137 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
138 COMMIT
139 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
140 COMMIT
141 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
142 COMMIT
143 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
144 COMMIT
145 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
146 COMMIT
147 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
148 COMMIT
149 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
150 COMMIT
151 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
152 COMMIT
153 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
154 COMMIT
155 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
156 COMMIT
157 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
158 COMMIT
159 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
160 COMMIT
161 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
162 COMMIT
163 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
164 COMMIT
165 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
166 COMMIT
167 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
168 COMMIT
169 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
170 COMMIT
171 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
172 COMMIT
173 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
174 COMMIT
175 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
176 COMMIT
177 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
178 COMMIT
179 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
180 COMMIT
181 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
182 COMMIT
183 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
184 COMMIT
185 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
186 COMMIT
187 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
188 COMMIT
189 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
190 COMMIT
191 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
192 COMMIT
193 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
194 COMMIT
195 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
196 COMMIT
197 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
198 COMMIT
199 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
200 COMMIT
201 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
202 COMMIT
203 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
204 COMMIT
205 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
206 COMMIT
207 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
208 COMMIT
209 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
210 COMMIT
211 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
212 COMMIT
213 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
214 COMMIT
215 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
216 COMMIT
217 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
218 COMMIT
219 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
220 COMMIT
221 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
222 COMMIT
223 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
224 COMMIT
225 INSERT INTO "Ingr\u00e9dient" VALUES(1,0,2,1.000)
226 COMMIT
227 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
228 COMMIT
229 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
230 COMMIT
231 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
232 COMMIT
233 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
234 COMMIT
235 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
236 COMMIT
237 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
238 COMMIT
239 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
240 COMMIT
241 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
242 COMMIT
243 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
244 COMMIT
245 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
246 COMMIT
247 DISCONNECT
248 /*C17*/SET SCHEMA B
249 DROP SCHEMA B CASCADE
250 DISCONNECT
251 /*C18*/SET SCHEMA B
252 SET DATABASE COLLATION "French"
253 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
254 DROP FUNCTION choisirUnProduit IF EXISTS
255 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom\u000a || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit");\u000a END
256 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
257 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
258 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
259 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
260 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
261 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
262 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
263 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
264 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
265 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
266 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
267 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
268 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
269 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date INTEGER NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
270 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a )
271 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
272 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
273 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
274 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
275 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
276 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
277 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
278 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
279 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a )
280 DISCONNECT
281 /*C19*/SET SCHEMA B
282 SET SCHEMA B
283 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
284 COMMIT
285 INSERT INTO "Lieu" VALUES(1,'Gentioux')
286 COMMIT
287 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
288 COMMIT
289 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
290 COMMIT
291 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
292 COMMIT
293 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
294 COMMIT
295 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
296 COMMIT
297 INSERT INTO "Lieu" VALUES(7,'Tarnac')
298 COMMIT
299 INSERT INTO "Lieu" VALUES(8,'Felletin')
300 COMMIT
301 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
302 COMMIT
303 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
304 COMMIT
305 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
306 COMMIT
307 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
308 COMMIT
309 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
310 COMMIT
311 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
312 COMMIT
313 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
314 COMMIT
315 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
316 COMMIT
317 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
318 COMMIT
319 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
320 COMMIT
321 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
322 COMMIT
323 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
324 COMMIT
325 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
326 COMMIT
327 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
328 COMMIT
329 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
330 COMMIT
331 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
332 COMMIT
333 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
334 COMMIT
335 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
336 COMMIT
337 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
338 COMMIT
339 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
340 COMMIT
341 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
342 COMMIT
343 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
344 COMMIT
345 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
346 COMMIT
347 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
348 COMMIT
349 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
350 COMMIT
351 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
352 COMMIT
353 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
354 COMMIT
355 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
356 COMMIT
357 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
358 COMMIT
359 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
360 COMMIT
361 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
362 COMMIT
363 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
364 COMMIT
365 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
366 COMMIT
367 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
368 COMMIT
369 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
370 COMMIT
371 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
372 COMMIT
373 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
374 COMMIT
375 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
376 COMMIT
377 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
378 COMMIT
379 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
380 COMMIT
381 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
382 COMMIT
383 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
384 COMMIT
385 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
386 COMMIT
387 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
388 COMMIT
389 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
390 COMMIT
391 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
392 COMMIT
393 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
394 COMMIT
395 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
396 COMMIT
397 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
398 COMMIT
399 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
400 COMMIT
401 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
402 COMMIT
403 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
404 COMMIT
405 INSERT INTO "Ingr\u00e9dient" VALUES(1,0,2,1.000)
406 COMMIT
407 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
408 COMMIT
409 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
410 COMMIT
411 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
412 COMMIT
413 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
414 COMMIT
415 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
416 COMMIT
417 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
418 COMMIT
419 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
420 COMMIT
421 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
422 COMMIT
423 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
424 COMMIT
425 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
426 COMMIT
427 DISCONNECT
428 /*C20*/SET SCHEMA B
429 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
430 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
431 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
432 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
433 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
434 INSERT INTO "Vente" VALUES(0,10,1.000,0)
435 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
436 INSERT INTO "Vente" VALUES(1,14,2.000,1)
437 INSERT INTO "Vente" VALUES(2,11,1.000,0)
438 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
439 INSERT INTO "Vente" VALUES(3,16,4.000,2)
440 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
441 INSERT INTO "Vente" VALUES(4,10,1.000,3)
442 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
443 INSERT INTO "Vente" VALUES(5,14,2.000,4)
444 INSERT INTO "Vente" VALUES(6,11,1.000,3)
445 COMMIT
446 DISCONNECT
447 /*C21*/SET SCHEMA B
448 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
449 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
450 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
451 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
452 DISCONNECT
453 /*C22*/SET SCHEMA B
454 DROP SCHEMA B CASCADE
455 DISCONNECT
456 /*C23*/SET SCHEMA B
457 SET DATABASE COLLATION "French"
458 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
459 DROP FUNCTION choisirUnProduit IF EXISTS
460 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom\u000a || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit");\u000a END
461 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
462 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
463 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
464 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
465 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
466 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
467 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
468 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
469 DROP FUNCTION choisirUnClient IF EXISTS
470 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client", "Lieu"\u000a WHERE "Client".lieu = "Lieu".ID\u000a );\u000a END
471 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
472 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
473 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
474 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
475 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
476 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date INTEGER NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
477 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a )
478 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
479 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
480 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
481 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
482 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
483 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
484 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
485 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
486 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a )
487 DISCONNECT
488 /*C24*/SET SCHEMA B
489 SET SCHEMA B
490 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
491 COMMIT
492 INSERT INTO "Lieu" VALUES(1,'Gentioux')
493 COMMIT
494 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
495 COMMIT
496 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
497 COMMIT
498 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
499 COMMIT
500 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
501 COMMIT
502 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
503 COMMIT
504 INSERT INTO "Lieu" VALUES(7,'Tarnac')
505 COMMIT
506 INSERT INTO "Lieu" VALUES(8,'Felletin')
507 COMMIT
508 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
509 COMMIT
510 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
511 COMMIT
512 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
513 COMMIT
514 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
515 COMMIT
516 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
517 COMMIT
518 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
519 COMMIT
520 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
521 COMMIT
522 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
523 COMMIT
524 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
525 COMMIT
526 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
527 COMMIT
528 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
529 COMMIT
530 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
531 COMMIT
532 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
533 COMMIT
534 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
535 COMMIT
536 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
537 COMMIT
538 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
539 COMMIT
540 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
541 COMMIT
542 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
543 COMMIT
544 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
545 COMMIT
546 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
547 COMMIT
548 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
549 COMMIT
550 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
551 COMMIT
552 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
553 COMMIT
554 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
555 COMMIT
556 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
557 COMMIT
558 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
559 COMMIT
560 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
561 COMMIT
562 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
563 COMMIT
564 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
565 COMMIT
566 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
567 COMMIT
568 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
569 COMMIT
570 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
571 COMMIT
572 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
573 COMMIT
574 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
575 COMMIT
576 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
577 COMMIT
578 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
579 COMMIT
580 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
581 COMMIT
582 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
583 COMMIT
584 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
585 COMMIT
586 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
587 COMMIT
588 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
589 COMMIT
590 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
591 COMMIT
592 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
593 COMMIT
594 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
595 COMMIT
596 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
597 COMMIT
598 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
599 COMMIT
600 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
601 COMMIT
602 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
603 COMMIT
604 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
605 COMMIT
606 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
607 COMMIT
608 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
609 COMMIT
610 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
611 COMMIT
612 INSERT INTO "Ingr\u00e9dient" VALUES(1,0,2,1.000)
613 COMMIT
614 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
615 COMMIT
616 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
617 COMMIT
618 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
619 COMMIT
620 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
621 COMMIT
622 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
623 COMMIT
624 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
625 COMMIT
626 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
627 COMMIT
628 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
629 COMMIT
630 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
631 COMMIT
632 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
633 COMMIT
634 DISCONNECT
635 /*C25*/SET SCHEMA B
636 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
637 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
638 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
639 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
640 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
641 INSERT INTO "Vente" VALUES(0,10,1.000,0)
642 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
643 INSERT INTO "Vente" VALUES(1,14,2.000,1)
644 INSERT INTO "Vente" VALUES(2,11,1.000,0)
645 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
646 INSERT INTO "Vente" VALUES(3,16,4.000,2)
647 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
648 INSERT INTO "Vente" VALUES(4,10,1.000,3)
649 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
650 INSERT INTO "Vente" VALUES(5,14,2.000,4)
651 INSERT INTO "Vente" VALUES(6,11,1.000,3)
652 COMMIT
653 DISCONNECT
654 /*C26*/SET SCHEMA B
655 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
656 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
657 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
658 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
659 DISCONNECT
660 /*C27*/SET SCHEMA B
661 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
662 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
663 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
664 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
665 DISCONNECT
666 /*C28*/SET SCHEMA B
667 DROP SCHEMA B CASCADE
668 DISCONNECT
669 /*C29*/SET SCHEMA B
670 SET DATABASE COLLATION "French"
671 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
672 DROP FUNCTION choisirUnProduit IF EXISTS
673 DISCONNECT
674 /*C30*/SET SCHEMA B
675 DROP SCHEMA B CASCADE
676 DISCONNECT
677 /*C31*/SET SCHEMA B
678 SET DATABASE COLLATION "French"
679 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
680 DROP FUNCTION choisirUnProduit IF EXISTS
681 DISCONNECT
682 /*C32*/SET SCHEMA B
683 DROP SCHEMA B CASCADE
684 DISCONNECT
685 /*C33*/SET SCHEMA B
686 SET DATABASE COLLATION "French"
687 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
688 DROP FUNCTION choisirUnProduit IF EXISTS
689 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
690 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
691 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
692 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
693 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
694 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
695 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
696 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
697 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
698 DROP FUNCTION choisirUnClient IF EXISTS
699 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
700 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
701 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
702 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
703 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
704 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
705 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date INTEGER NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
706 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a )
707 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
708 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
709 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
710 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
711 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
712 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
713 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
714 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
715 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a )
716 DISCONNECT
717 /*C34*/SET SCHEMA B
718 SET SCHEMA B
719 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
720 COMMIT
721 INSERT INTO "Lieu" VALUES(1,'Gentioux')
722 COMMIT
723 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
724 COMMIT
725 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
726 COMMIT
727 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
728 COMMIT
729 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
730 COMMIT
731 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
732 COMMIT
733 INSERT INTO "Lieu" VALUES(7,'Tarnac')
734 COMMIT
735 INSERT INTO "Lieu" VALUES(8,'Felletin')
736 COMMIT
737 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
738 COMMIT
739 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
740 COMMIT
741 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
742 COMMIT
743 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
744 COMMIT
745 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
746 COMMIT
747 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
748 COMMIT
749 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
750 COMMIT
751 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
752 COMMIT
753 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
754 COMMIT
755 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
756 COMMIT
757 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
758 COMMIT
759 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
760 COMMIT
761 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
762 COMMIT
763 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
764 COMMIT
765 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
766 COMMIT
767 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
768 COMMIT
769 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
770 COMMIT
771 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
772 COMMIT
773 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
774 COMMIT
775 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
776 COMMIT
777 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
778 COMMIT
779 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
780 COMMIT
781 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
782 COMMIT
783 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
784 COMMIT
785 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
786 COMMIT
787 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
788 COMMIT
789 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
790 COMMIT
791 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
792 COMMIT
793 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
794 COMMIT
795 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
796 COMMIT
797 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
798 COMMIT
799 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
800 COMMIT
801 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
802 COMMIT
803 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
804 COMMIT
805 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
806 COMMIT
807 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
808 COMMIT
809 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
810 COMMIT
811 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
812 COMMIT
813 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
814 COMMIT
815 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
816 COMMIT
817 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
818 COMMIT
819 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
820 COMMIT
821 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
822 COMMIT
823 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
824 COMMIT
825 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
826 COMMIT
827 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
828 COMMIT
829 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
830 COMMIT
831 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
832 COMMIT
833 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
834 COMMIT
835 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
836 COMMIT
837 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
838 COMMIT
839 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
840 COMMIT
841 INSERT INTO "Ingr\u00e9dient" VALUES(1,0,2,1.000)
842 COMMIT
843 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
844 COMMIT
845 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
846 COMMIT
847 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
848 COMMIT
849 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
850 COMMIT
851 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
852 COMMIT
853 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
854 COMMIT
855 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
856 COMMIT
857 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
858 COMMIT
859 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
860 COMMIT
861 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
862 COMMIT
863 DISCONNECT
864 /*C3*/DISCONNECT
865 /*C35*/SET SCHEMA B
866 DELETE FROM "Ingr\u00e9dient" WHERE ID=1
867 COMMIT
868 /*C36*/SET SCHEMA B
869 SET SCHEMA B
870 DISCONNECT
871 /*C37*/SET SCHEMA B
872 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
873 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
874 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
875 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
876 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
877 INSERT INTO "Vente" VALUES(0,10,1.000,0)
878 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
879 INSERT INTO "Vente" VALUES(1,14,2.000,1)
880 INSERT INTO "Vente" VALUES(2,11,1.000,0)
881 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
882 INSERT INTO "Vente" VALUES(3,16,4.000,2)
883 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
884 INSERT INTO "Vente" VALUES(4,10,1.000,3)
885 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
886 INSERT INTO "Vente" VALUES(5,14,2.000,4)
887 INSERT INTO "Vente" VALUES(6,11,1.000,3)
888 COMMIT
889 DISCONNECT
890 /*C38*/SET SCHEMA B
891 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
892 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
893 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
894 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
895 DISCONNECT
896 /*C39*/SET SCHEMA B
897 DROP SCHEMA B CASCADE
898 DISCONNECT
899 /*C40*/SET SCHEMA B
900 SET DATABASE COLLATION "French"
901 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
902 DROP FUNCTION choisirUnProduit IF EXISTS
903 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
904 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
905 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
906 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
907 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
908 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
909 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
910 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
911 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
912 DROP FUNCTION choisirUnClient IF EXISTS
913 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
914 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
915 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
916 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
917 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
918 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
919 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date INTEGER NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
920 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a )
921 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
922 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
923 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
924 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
925 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
926 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
927 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
928 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
929 DISCONNECT
930 /*C41*/SET SCHEMA B
931 DROP SCHEMA B CASCADE
932 DISCONNECT
933 /*C42*/SET SCHEMA B
934 SET DATABASE COLLATION "French"
935 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
936 DROP FUNCTION choisirUnProduit IF EXISTS
937 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
938 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
939 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
940 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
941 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
942 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
943 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
944 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
945 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
946 DROP FUNCTION choisirUnClient IF EXISTS
947 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
948 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
949 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
950 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
951 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
952 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
953 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date INTEGER NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
954 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a )
955 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
956 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
957 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
958 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
959 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
960 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
961 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
962 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
963 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a )
964 DISCONNECT
965 /*C43*/SET SCHEMA B
966 SET SCHEMA B
967 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
968 COMMIT
969 INSERT INTO "Lieu" VALUES(1,'Gentioux')
970 COMMIT
971 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
972 COMMIT
973 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
974 COMMIT
975 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
976 COMMIT
977 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
978 COMMIT
979 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
980 COMMIT
981 INSERT INTO "Lieu" VALUES(7,'Tarnac')
982 COMMIT
983 INSERT INTO "Lieu" VALUES(8,'Felletin')
984 COMMIT
985 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
986 COMMIT
987 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
988 COMMIT
989 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
990 COMMIT
991 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
992 COMMIT
993 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
994 COMMIT
995 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
996 COMMIT
997 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
998 COMMIT
999 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
1000 COMMIT
1001 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
1002 COMMIT
1003 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
1004 COMMIT
1005 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
1006 COMMIT
1007 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
1008 COMMIT
1009 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
1010 COMMIT
1011 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
1012 COMMIT
1013 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
1014 COMMIT
1015 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
1016 COMMIT
1017 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
1018 COMMIT
1019 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
1020 COMMIT
1021 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
1022 COMMIT
1023 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
1024 COMMIT
1025 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
1026 COMMIT
1027 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
1028 COMMIT
1029 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
1030 COMMIT
1031 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
1032 COMMIT
1033 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
1034 COMMIT
1035 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
1036 COMMIT
1037 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
1038 COMMIT
1039 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
1040 COMMIT
1041 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
1042 COMMIT
1043 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
1044 COMMIT
1045 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
1046 COMMIT
1047 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
1048 COMMIT
1049 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
1050 COMMIT
1051 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
1052 COMMIT
1053 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
1054 COMMIT
1055 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
1056 COMMIT
1057 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
1058 COMMIT
1059 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
1060 COMMIT
1061 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
1062 COMMIT
1063 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
1064 COMMIT
1065 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
1066 COMMIT
1067 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
1068 COMMIT
1069 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
1070 COMMIT
1071 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
1072 COMMIT
1073 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
1074 COMMIT
1075 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
1076 COMMIT
1077 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
1078 COMMIT
1079 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
1080 COMMIT
1081 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
1082 COMMIT
1083 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
1084 COMMIT
1085 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
1086 COMMIT
1087 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
1088 COMMIT
1089 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
1090 COMMIT
1091 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
1092 COMMIT
1093 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
1094 COMMIT
1095 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
1096 COMMIT
1097 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
1098 COMMIT
1099 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
1100 COMMIT
1101 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
1102 COMMIT
1103 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
1104 COMMIT
1105 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
1106 COMMIT
1107 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
1108 COMMIT
1109 DISCONNECT
1110 /*C44*/SET SCHEMA B
1111 DROP SCHEMA B CASCADE
1112 DISCONNECT
1113 /*C45*/SET SCHEMA B
1114 SET DATABASE COLLATION "French"
1115 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1116 DROP FUNCTION choisirUnProduit IF EXISTS
1117 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1118 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1119 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1120 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1121 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1122 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1123 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1124 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1125 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1126 DROP FUNCTION choisirUnClient IF EXISTS
1127 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1128 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1129 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1130 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1131 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1132 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1133 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date INTEGER NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
1134 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a )
1135 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
1136 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
1137 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
1138 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1139 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
1140 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
1141 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1142 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1143 DISCONNECT
1144 /*C46*/SET SCHEMA B
1145 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1146 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1147 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1148 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1149 DISCONNECT
1150 /*C47*/SET SCHEMA B
1151 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1152 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1153 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1154 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1155 DISCONNECT
1156 /*C48*/SET SCHEMA B
1157 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1158 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1159 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1160 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1161 DISCONNECT
1162 /*C49*/SET SCHEMA B
1163 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1164 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1165 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1166 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1167 DISCONNECT
1168 /*C50*/SET SCHEMA B
1169 DROP SCHEMA B CASCADE
1170 DISCONNECT
1171 /*C51*/SET SCHEMA B
1172 SET DATABASE COLLATION "French"
1173 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1174 DROP FUNCTION choisirUnProduit IF EXISTS
1175 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1176 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1177 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1178 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1179 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1180 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1181 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1182 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1183 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1184 DROP FUNCTION choisirUnClient IF EXISTS
1185 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1186 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1187 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1188 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1189 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1190 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1191 DISCONNECT
1192 /*C52*/SET SCHEMA B
1193 DROP SCHEMA B CASCADE
1194 DISCONNECT
1195 /*C53*/SET SCHEMA B
1196 SET DATABASE COLLATION "French"
1197 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1198 DROP FUNCTION choisirUnProduit IF EXISTS
1199 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1200 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1201 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1202 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1203 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1204 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1205 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1206 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1207 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1208 DROP FUNCTION choisirUnClient IF EXISTS
1209 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1210 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1211 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1212 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1213 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1214 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1215 DISCONNECT
1216 /*C54*/SET SCHEMA B
1217 DROP SCHEMA B CASCADE
1218 DISCONNECT
1219 /*C55*/SET SCHEMA B
1220 SET DATABASE COLLATION "French"
1221 SET DATABASE DEFAULT TABLE TYPE CACHED
1222 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1223 DROP FUNCTION choisirUnProduit IF EXISTS
1224 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1225 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1226 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1227 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1228 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1229 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1230 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1231 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1232 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1233 DROP FUNCTION choisirUnClient IF EXISTS
1234 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1235 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1236 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1237 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1238 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1239 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1240 DISCONNECT
1241 /*C56*/SET SCHEMA B
1242 DROP SCHEMA B CASCADE
1243 DISCONNECT
1244 /*C57*/SET SCHEMA B
1245 SET DATABASE COLLATION "French"
1246 SET DATABASE DEFAULT TABLE TYPE CACHED
1247 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1248 DROP FUNCTION choisirUnProduit IF EXISTS
1249 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1250 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1251 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1252 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1253 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1254 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1255 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1256 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1257 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1258 DROP FUNCTION choisirUnClient IF EXISTS
1259 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1260 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1261 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1262 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1263 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1264 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1265 DISCONNECT
1266 /*C58*/SET SCHEMA B
1267 DROP SCHEMA B CASCADE
1268 DISCONNECT
1269 /*C59*/SET SCHEMA B
1270 SET DATABASE COLLATION "French"
1271 SET DATABASE DEFAULT TABLE TYPE CACHED
1272 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1273 DROP FUNCTION choisirUnProduit IF EXISTS
1274 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1275 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1276 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1277 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1278 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1279 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1280 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1281 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1282 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1283 DROP FUNCTION choisirUnClient IF EXISTS
1284 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1285 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1286 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1287 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1288 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1289 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1290 DISCONNECT
1291 /*C60*/SET SCHEMA B
1292 DROP SCHEMA B CASCADE
1293 DISCONNECT
1294 /*C61*/SET SCHEMA B
1295 SET DATABASE COLLATION "French"
1296 SET DATABASE DEFAULT TABLE TYPE CACHED
1297 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1298 DROP FUNCTION choisirUnProduit IF EXISTS
1299 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1300 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1301 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1302 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1303 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1304 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1305 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1306 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1307 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1308 DROP FUNCTION choisirUnClient IF EXISTS
1309 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1310 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1311 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1312 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1313 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1314 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1315 DISCONNECT
1316 /*C62*/SET SCHEMA B
1317 DROP SCHEMA B CASCADE
1318 DISCONNECT
1319 /*C63*/SET SCHEMA B
1320 SET DATABASE COLLATION "French"
1321 SET DATABASE DEFAULT TABLE TYPE CACHED
1322 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1323 DROP FUNCTION choisirUnProduit IF EXISTS
1324 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1325 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1326 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1327 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1328 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1329 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1330 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1331 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1332 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1333 DROP FUNCTION choisirUnClient IF EXISTS
1334 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1335 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1336 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1337 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1338 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1339 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1340 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date INTEGER DEFAULT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
1341 DISCONNECT
1342 /*C64*/SET SCHEMA B
1343 DROP SCHEMA B CASCADE
1344 DISCONNECT
1345 /*C65*/SET SCHEMA B
1346 SET DATABASE COLLATION "French"
1347 SET DATABASE DEFAULT TABLE TYPE CACHED
1348 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1349 DROP FUNCTION choisirUnProduit IF EXISTS
1350 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1351 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1352 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1353 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1354 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1355 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1356 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1357 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1358 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1359 DROP FUNCTION choisirUnClient IF EXISTS
1360 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1361 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1362 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1363 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1364 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1365 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1366 DISCONNECT
1367 /*C66*/SET SCHEMA B
1368 DROP SCHEMA B CASCADE
1369 DISCONNECT
1370 /*C67*/SET SCHEMA B
1371 SET DATABASE COLLATION "French"
1372 SET DATABASE DEFAULT TABLE TYPE CACHED
1373 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1374 DROP FUNCTION choisirUnProduit IF EXISTS
1375 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1376 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1377 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1378 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1379 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1380 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1381 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1382 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1383 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1384 DROP FUNCTION choisirUnClient IF EXISTS
1385 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1386 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1387 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1388 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1389 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1390 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1391 DISCONNECT
1392 /*C68*/SET SCHEMA B
1393 DROP SCHEMA B CASCADE
1394 DISCONNECT
1395 /*C69*/SET SCHEMA B
1396 SET DATABASE COLLATION "French"
1397 SET DATABASE DEFAULT TABLE TYPE CACHED
1398 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1399 DROP FUNCTION choisirUnProduit IF EXISTS
1400 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1401 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1402 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1403 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1404 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1405 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1406 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1407 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1408 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1409 DROP FUNCTION choisirUnClient IF EXISTS
1410 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1411 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1412 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1413 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1414 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1415 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1416 DISCONNECT
1417 /*C70*/SET SCHEMA B
1418 DROP SCHEMA B CASCADE
1419 DISCONNECT
1420 /*C71*/SET SCHEMA B
1421 SET DATABASE COLLATION "French"
1422 SET DATABASE DEFAULT TABLE TYPE CACHED
1423 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1424 DROP FUNCTION choisirUnProduit IF EXISTS
1425 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1426 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1427 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1428 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1429 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1430 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1431 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1432 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1433 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1434 DROP FUNCTION choisirUnClient IF EXISTS
1435 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1436 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1437 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1438 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1439 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1440 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1441 DISCONNECT
1442 /*C72*/SET SCHEMA B
1443 DROP SCHEMA B CASCADE
1444 DISCONNECT
1445 /*C73*/SET SCHEMA B
1446 SET DATABASE COLLATION "French"
1447 SET DATABASE DEFAULT TABLE TYPE CACHED
1448 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1449 DROP FUNCTION choisirUnProduit IF EXISTS
1450 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1451 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1452 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1453 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1454 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1455 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1456 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1457 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1458 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1459 DROP FUNCTION choisirUnClient IF EXISTS
1460 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1461 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1462 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1463 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1464 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1465 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1466 DISCONNECT
1467 /*C74*/SET SCHEMA B
1468 DROP SCHEMA B CASCADE
1469 DISCONNECT
1470 /*C75*/SET SCHEMA B
1471 SET DATABASE COLLATION "French"
1472 SET DATABASE DEFAULT TABLE TYPE CACHED
1473 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1474 DROP FUNCTION choisirUnProduit IF EXISTS
1475 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1476 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1477 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1478 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1479 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1480 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1481 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1482 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1483 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1484 DROP FUNCTION choisirUnClient IF EXISTS
1485 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1486 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1487 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1488 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1489 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1490 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1491 DISCONNECT
1492 /*C76*/SET SCHEMA B
1493 DROP SCHEMA B CASCADE
1494 DISCONNECT
1495 /*C77*/SET SCHEMA B
1496 SET DATABASE COLLATION "French"
1497 SET DATABASE DEFAULT TABLE TYPE CACHED
1498 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1499 DROP FUNCTION choisirUnProduit IF EXISTS
1500 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1501 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1502 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1503 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1504 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1505 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1506 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1507 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1508 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1509 DROP FUNCTION choisirUnClient IF EXISTS
1510 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1511 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1512 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1513 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1514 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1515 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1516 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
1517 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a )
1518 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
1519 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
1520 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
1521 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1522 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
1523 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
1524 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1525 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1526 DISCONNECT
1527 /*C78*/SET SCHEMA B
1528 DROP SCHEMA B CASCADE
1529 DISCONNECT
1530 /*C79*/SET SCHEMA B
1531 SET DATABASE COLLATION "French"
1532 SET DATABASE DEFAULT TABLE TYPE CACHED
1533 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1534 DROP FUNCTION choisirUnProduit IF EXISTS
1535 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1536 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1537 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1538 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1539 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1540 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1541 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1542 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1543 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1544 DROP FUNCTION choisirUnClient IF EXISTS
1545 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1546 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1547 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1548 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1549 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1550 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1551 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
1552 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a )
1553 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
1554 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
1555 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
1556 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1557 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
1558 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
1559 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1560 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1561 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a )
1562 DISCONNECT
1563 /*C80*/SET SCHEMA B
1564 SET SCHEMA B
1565 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
1566 COMMIT
1567 INSERT INTO "Lieu" VALUES(1,'Gentioux')
1568 COMMIT
1569 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
1570 COMMIT
1571 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
1572 COMMIT
1573 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
1574 COMMIT
1575 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
1576 COMMIT
1577 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
1578 COMMIT
1579 INSERT INTO "Lieu" VALUES(7,'Tarnac')
1580 COMMIT
1581 INSERT INTO "Lieu" VALUES(8,'Felletin')
1582 COMMIT
1583 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
1584 COMMIT
1585 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
1586 COMMIT
1587 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
1588 COMMIT
1589 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
1590 COMMIT
1591 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
1592 COMMIT
1593 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
1594 COMMIT
1595 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
1596 COMMIT
1597 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
1598 COMMIT
1599 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
1600 COMMIT
1601 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
1602 COMMIT
1603 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
1604 COMMIT
1605 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
1606 COMMIT
1607 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
1608 COMMIT
1609 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
1610 COMMIT
1611 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
1612 COMMIT
1613 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
1614 COMMIT
1615 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
1616 COMMIT
1617 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
1618 COMMIT
1619 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
1620 COMMIT
1621 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
1622 COMMIT
1623 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
1624 COMMIT
1625 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
1626 COMMIT
1627 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
1628 COMMIT
1629 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
1630 COMMIT
1631 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
1632 COMMIT
1633 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
1634 COMMIT
1635 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
1636 COMMIT
1637 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
1638 COMMIT
1639 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
1640 COMMIT
1641 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
1642 COMMIT
1643 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
1644 COMMIT
1645 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
1646 COMMIT
1647 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
1648 COMMIT
1649 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
1650 COMMIT
1651 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
1652 COMMIT
1653 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
1654 COMMIT
1655 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
1656 COMMIT
1657 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
1658 COMMIT
1659 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
1660 COMMIT
1661 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
1662 COMMIT
1663 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
1664 COMMIT
1665 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
1666 COMMIT
1667 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
1668 COMMIT
1669 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
1670 COMMIT
1671 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
1672 COMMIT
1673 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
1674 COMMIT
1675 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
1676 COMMIT
1677 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
1678 COMMIT
1679 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
1680 COMMIT
1681 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
1682 COMMIT
1683 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
1684 COMMIT
1685 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
1686 COMMIT
1687 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
1688 COMMIT
1689 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
1690 COMMIT
1691 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
1692 COMMIT
1693 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
1694 COMMIT
1695 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
1696 COMMIT
1697 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
1698 COMMIT
1699 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
1700 COMMIT
1701 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
1702 COMMIT
1703 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
1704 COMMIT
1705 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
1706 COMMIT
1707 DISCONNECT
1708 /*C81*/SET SCHEMA B
1709 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1710 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1711 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1712 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1713 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
1714 INSERT INTO "Vente" VALUES(0,10,1.000,0)
1715 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
1716 INSERT INTO "Vente" VALUES(1,14,2.000,1)
1717 INSERT INTO "Vente" VALUES(2,11,1.000,0)
1718 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
1719 INSERT INTO "Vente" VALUES(3,16,4.000,2)
1720 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
1721 INSERT INTO "Vente" VALUES(4,10,1.000,3)
1722 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
1723 INSERT INTO "Vente" VALUES(5,14,2.000,4)
1724 INSERT INTO "Vente" VALUES(6,11,1.000,3)
1725 COMMIT
1726 DISCONNECT
1727 /*C82*/SET SCHEMA B
1728 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1729 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1730 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1731 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1732 DISCONNECT
1733 /*C83*/SET SCHEMA B
1734 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1735 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1736 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1737 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1738 DISCONNECT
1739 /*C84*/SET SCHEMA B
1740 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1741 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1742 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1743 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1744 DISCONNECT
1745 /*C85*/SET SCHEMA B
1746 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1747 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1748 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1749 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1750 DISCONNECT
1751 /*C86*/SET SCHEMA B
1752 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1753 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1754 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1755 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1756 DISCONNECT
1757 /*C87*/SET SCHEMA B
1758 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1759 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1760 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1761 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1762 DISCONNECT
1763 /*C88*/SET SCHEMA B
1764 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1765 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1766 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1767 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1768 DISCONNECT
1769 /*C89*/SET SCHEMA B
1770 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1771 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1772 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1773 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1774 DISCONNECT
1775 /*C90*/SET SCHEMA B
1776 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1777 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1778 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1779 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1780 DROP FUNCTION produit2MaxDate IF EXISTS
1781 CREATE FUNCTION produit2MaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1782 DISCONNECT
1783 /*C91*/SET SCHEMA B
1784 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1785 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1786 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1787 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1788 DROP FUNCTION produit2MaxDate IF EXISTS
1789 CREATE FUNCTION produit2MaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1790 DISCONNECT
1791 /*C92*/SET SCHEMA B
1792 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1793 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1794 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1795 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1796 DROP FUNCTION produit2MaxDate IF EXISTS
1797 CREATE FUNCTION produit2MaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1798 DISCONNECT
1799 /*C93*/SET SCHEMA B
1800 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1801 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1802 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1803 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1804 DROP FUNCTION produit2MaxDate IF EXISTS
1805 DROP FUNCTION produitToMaxDate IF EXISTS
1806 CREATE FUNCTION produitToMaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1807 DISCONNECT
1808 /*C94*/SET SCHEMA B
1809 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1810 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1811 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1812 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1813 DROP FUNCTION produitToMaxDate IF EXISTS
1814 CREATE FUNCTION produitToMaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1815 DISCONNECT
1816 /*C95*/SET SCHEMA B
1817 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1818 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1819 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1820 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1821 DROP FUNCTION produitToMaxDate IF EXISTS
1822 CREATE FUNCTION produitToMaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1823 DISCONNECT
1824 /*C96*/SET SCHEMA B
1825 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1826 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1827 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1828 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1829 DROP FUNCTION produitToMaxDate IF EXISTS
1830 CREATE FUNCTION produitToMaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1831 DISCONNECT
1832 /*C97*/SET SCHEMA B
1833 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1834 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1835 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1836 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1837 DROP FUNCTION produitToMaxDate IF EXISTS
1838 CREATE FUNCTION produitToMaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1839 DISCONNECT
1840 /*C98*/SET SCHEMA B
1841 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1842 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1843 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1844 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1845 DROP FUNCTION produitToMaxDate IF EXISTS
1846 CREATE FUNCTION produitToMaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1847 DISCONNECT
1848 /*C99*/SET SCHEMA B
1849 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1850 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1851 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1852 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1853 DROP FUNCTION produitToMaxDate IF EXISTS
1854 CREATE FUNCTION produitToMaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1855 DISCONNECT
1856 /*C100*/SET SCHEMA B
1857 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1858 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1859 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1860 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1861 DROP FUNCTION produitToMaxDate IF EXISTS
1862 CREATE FUNCTION produitToMaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1863 DISCONNECT
1864 /*C101*/SET SCHEMA B
1865 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1866 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1867 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1868 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1869 DROP FUNCTION produitToMaxDate IF EXISTS
1870 CREATE FUNCTION produitToMaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1871 DISCONNECT
1872 /*C102*/SET SCHEMA B
1873 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1874 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1875 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1876 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1877 DROP FUNCTION produitToMaxDate IF EXISTS
1878 CREATE FUNCTION produitToMaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1879 DISCONNECT
1880 /*C103*/SET SCHEMA B
1881 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
1882 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
1883 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
1884 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
1885 DROP FUNCTION produitToMaxDate IF EXISTS
1886 CREATE FUNCTION produitToMaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
1887 DISCONNECT
1888 /*C104*/SET SCHEMA B
1889 DROP SCHEMA B CASCADE
1890 DISCONNECT
1891 /*C105*/SET SCHEMA B
1892 SET DATABASE COLLATION "French"
1893 SET DATABASE DEFAULT TABLE TYPE CACHED
1894 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
1895 DROP FUNCTION choisirUnProduit IF EXISTS
1896 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
1897 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
1898 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
1899 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
1900 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1901 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1902 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
1903 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
1904 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1905 DROP FUNCTION choisirUnClient IF EXISTS
1906 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
1907 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
1908 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
1909 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1910 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
1911 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1912 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
1913 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a )
1914 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
1915 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
1916 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
1917 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1918 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
1919 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
1920 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
1921 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1922 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a )
1923 ALTER TABLE "Prix"\u000a ADD CONSTRAINT "FK_Prix_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
1924 DISCONNECT
1925 /*C106*/SET SCHEMA B
1926 SET SCHEMA B
1927 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
1928 COMMIT
1929 INSERT INTO "Lieu" VALUES(1,'Gentioux')
1930 COMMIT
1931 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
1932 COMMIT
1933 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
1934 COMMIT
1935 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
1936 COMMIT
1937 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
1938 COMMIT
1939 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
1940 COMMIT
1941 INSERT INTO "Lieu" VALUES(7,'Tarnac')
1942 COMMIT
1943 INSERT INTO "Lieu" VALUES(8,'Felletin')
1944 COMMIT
1945 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
1946 COMMIT
1947 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
1948 COMMIT
1949 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
1950 COMMIT
1951 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
1952 COMMIT
1953 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
1954 COMMIT
1955 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
1956 COMMIT
1957 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
1958 COMMIT
1959 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
1960 COMMIT
1961 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
1962 COMMIT
1963 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
1964 COMMIT
1965 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
1966 COMMIT
1967 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
1968 COMMIT
1969 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
1970 COMMIT
1971 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
1972 COMMIT
1973 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
1974 COMMIT
1975 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
1976 COMMIT
1977 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
1978 COMMIT
1979 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
1980 COMMIT
1981 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
1982 COMMIT
1983 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
1984 COMMIT
1985 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
1986 COMMIT
1987 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
1988 COMMIT
1989 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
1990 COMMIT
1991 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
1992 COMMIT
1993 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
1994 COMMIT
1995 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
1996 COMMIT
1997 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
1998 COMMIT
1999 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
2000 COMMIT
2001 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
2002 COMMIT
2003 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
2004 COMMIT
2005 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
2006 COMMIT
2007 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
2008 COMMIT
2009 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
2010 COMMIT
2011 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
2012 COMMIT
2013 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
2014 COMMIT
2015 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
2016 COMMIT
2017 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
2018 COMMIT
2019 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
2020 COMMIT
2021 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
2022 COMMIT
2023 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
2024 COMMIT
2025 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
2026 COMMIT
2027 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
2028 COMMIT
2029 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
2030 COMMIT
2031 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
2032 COMMIT
2033 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
2034 COMMIT
2035 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
2036 COMMIT
2037 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
2038 COMMIT
2039 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
2040 COMMIT
2041 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
2042 COMMIT
2043 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
2044 COMMIT
2045 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
2046 COMMIT
2047 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
2048 COMMIT
2049 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
2050 COMMIT
2051 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
2052 COMMIT
2053 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
2054 COMMIT
2055 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
2056 COMMIT
2057 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
2058 COMMIT
2059 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
2060 COMMIT
2061 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
2062 COMMIT
2063 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
2064 COMMIT
2065 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
2066 COMMIT
2067 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
2068 COMMIT
2069 DISCONNECT
2070 /*C107*/SET SCHEMA B
2071 DROP SCHEMA B CASCADE
2072 DISCONNECT
2073 /*C108*/SET SCHEMA B
2074 SET DATABASE COLLATION "French"
2075 SET DATABASE DEFAULT TABLE TYPE CACHED
2076 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
2077 DROP FUNCTION choisirUnProduit IF EXISTS
2078 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
2079 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
2080 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
2081 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
2082 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2083 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2084 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
2085 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
2086 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
2087 DROP FUNCTION choisirUnClient IF EXISTS
2088 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
2089 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
2090 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
2091 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2092 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
2093 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
2094 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
2095 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a )
2096 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
2097 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
2098 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
2099 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2100 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
2101 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
2102 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
2103 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2104 DISCONNECT
2105 /*C109*/SET SCHEMA B
2106 DROP SCHEMA B CASCADE
2107 DISCONNECT
2108 /*C110*/SET SCHEMA B
2109 SET DATABASE COLLATION "French"
2110 SET DATABASE DEFAULT TABLE TYPE CACHED
2111 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
2112 DROP FUNCTION choisirUnProduit IF EXISTS
2113 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
2114 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
2115 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
2116 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
2117 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2118 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2119 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
2120 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
2121 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
2122 DROP FUNCTION choisirUnClient IF EXISTS
2123 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
2124 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
2125 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
2126 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2127 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
2128 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
2129 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
2130 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a )
2131 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
2132 ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
2133 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
2134 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2135 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
2136 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
2137 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
2138 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2139 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
2140 DISCONNECT
2141 /*C111*/SET SCHEMA B
2142 SET SCHEMA B
2143 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
2144 COMMIT
2145 INSERT INTO "Lieu" VALUES(1,'Gentioux')
2146 COMMIT
2147 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
2148 COMMIT
2149 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
2150 COMMIT
2151 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
2152 COMMIT
2153 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
2154 COMMIT
2155 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
2156 COMMIT
2157 INSERT INTO "Lieu" VALUES(7,'Tarnac')
2158 COMMIT
2159 INSERT INTO "Lieu" VALUES(8,'Felletin')
2160 COMMIT
2161 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
2162 COMMIT
2163 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
2164 COMMIT
2165 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
2166 COMMIT
2167 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
2168 COMMIT
2169 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
2170 COMMIT
2171 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
2172 COMMIT
2173 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
2174 COMMIT
2175 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
2176 COMMIT
2177 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
2178 COMMIT
2179 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
2180 COMMIT
2181 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
2182 COMMIT
2183 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
2184 COMMIT
2185 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
2186 COMMIT
2187 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
2188 COMMIT
2189 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
2190 COMMIT
2191 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
2192 COMMIT
2193 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
2194 COMMIT
2195 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
2196 COMMIT
2197 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
2198 COMMIT
2199 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
2200 COMMIT
2201 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
2202 COMMIT
2203 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
2204 COMMIT
2205 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
2206 COMMIT
2207 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
2208 COMMIT
2209 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
2210 COMMIT
2211 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
2212 COMMIT
2213 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
2214 COMMIT
2215 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
2216 COMMIT
2217 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
2218 COMMIT
2219 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
2220 COMMIT
2221 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
2222 COMMIT
2223 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
2224 COMMIT
2225 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
2226 COMMIT
2227 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
2228 COMMIT
2229 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
2230 COMMIT
2231 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
2232 COMMIT
2233 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
2234 COMMIT
2235 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
2236 COMMIT
2237 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
2238 COMMIT
2239 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
2240 COMMIT
2241 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
2242 COMMIT
2243 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
2244 COMMIT
2245 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
2246 COMMIT
2247 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
2248 COMMIT
2249 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
2250 COMMIT
2251 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
2252 COMMIT
2253 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
2254 COMMIT
2255 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
2256 COMMIT
2257 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
2258 COMMIT
2259 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
2260 COMMIT
2261 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
2262 COMMIT
2263 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
2264 COMMIT
2265 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
2266 COMMIT
2267 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
2268 COMMIT
2269 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
2270 COMMIT
2271 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
2272 COMMIT
2273 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
2274 COMMIT
2275 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
2276 COMMIT
2277 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
2278 COMMIT
2279 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
2280 COMMIT
2281 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
2282 COMMIT
2283 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
2284 COMMIT
2285 DISCONNECT
2286 /*C112*/SET SCHEMA B
2287 DROP SCHEMA B CASCADE
2288 DISCONNECT
2289 /*C113*/SET SCHEMA B
2290 SET DATABASE COLLATION "French"
2291 SET DATABASE DEFAULT TABLE TYPE CACHED
2292 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
2293 DROP FUNCTION choisirUnProduit IF EXISTS
2294 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
2295 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a )
2296 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
2297 ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
2298 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2299 ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2300 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
2301 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
2302 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
2303 DROP FUNCTION choisirUnClient IF EXISTS
2304 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
2305 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
2306 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
2307 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2308 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
2309 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
2310 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
2311 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
2312 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
2313 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2314 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
2315 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
2316 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
2317 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2318 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
2319 DISCONNECT
2320 /*C114*/SET SCHEMA B
2321 SET SCHEMA B
2322 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
2323 COMMIT
2324 INSERT INTO "Lieu" VALUES(1,'Gentioux')
2325 COMMIT
2326 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
2327 COMMIT
2328 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
2329 COMMIT
2330 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
2331 COMMIT
2332 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
2333 COMMIT
2334 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
2335 COMMIT
2336 INSERT INTO "Lieu" VALUES(7,'Tarnac')
2337 COMMIT
2338 INSERT INTO "Lieu" VALUES(8,'Felletin')
2339 COMMIT
2340 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
2341 COMMIT
2342 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
2343 COMMIT
2344 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
2345 COMMIT
2346 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
2347 COMMIT
2348 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
2349 COMMIT
2350 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
2351 COMMIT
2352 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
2353 COMMIT
2354 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
2355 COMMIT
2356 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
2357 COMMIT
2358 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
2359 COMMIT
2360 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
2361 COMMIT
2362 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
2363 COMMIT
2364 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
2365 COMMIT
2366 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
2367 COMMIT
2368 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
2369 COMMIT
2370 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
2371 COMMIT
2372 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
2373 COMMIT
2374 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
2375 COMMIT
2376 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
2377 COMMIT
2378 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
2379 COMMIT
2380 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
2381 COMMIT
2382 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
2383 COMMIT
2384 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
2385 COMMIT
2386 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
2387 COMMIT
2388 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
2389 COMMIT
2390 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
2391 COMMIT
2392 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
2393 COMMIT
2394 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
2395 COMMIT
2396 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
2397 COMMIT
2398 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
2399 COMMIT
2400 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
2401 COMMIT
2402 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
2403 COMMIT
2404 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
2405 COMMIT
2406 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
2407 COMMIT
2408 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
2409 COMMIT
2410 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
2411 COMMIT
2412 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
2413 COMMIT
2414 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
2415 COMMIT
2416 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
2417 COMMIT
2418 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
2419 COMMIT
2420 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
2421 COMMIT
2422 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
2423 COMMIT
2424 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
2425 COMMIT
2426 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
2427 COMMIT
2428 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
2429 COMMIT
2430 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
2431 COMMIT
2432 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
2433 COMMIT
2434 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
2435 COMMIT
2436 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
2437 COMMIT
2438 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
2439 COMMIT
2440 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
2441 COMMIT
2442 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
2443 COMMIT
2444 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
2445 COMMIT
2446 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
2447 COMMIT
2448 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
2449 COMMIT
2450 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
2451 COMMIT
2452 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
2453 COMMIT
2454 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
2455 COMMIT
2456 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
2457 COMMIT
2458 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
2459 COMMIT
2460 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
2461 COMMIT
2462 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
2463 COMMIT
2464 DISCONNECT
2465 /*C115*/SET SCHEMA B
2466 DROP SCHEMA B CASCADE
2467 DISCONNECT
2468 /*C116*/SET SCHEMA B
2469 SET DATABASE COLLATION "French"
2470 SET DATABASE DEFAULT TABLE TYPE CACHED
2471 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
2472 DROP FUNCTION choisirUnProduit IF EXISTS
2473 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
2474 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
2475 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
2476 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
2477 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
2478 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
2479 DROP FUNCTION choisirUnClient IF EXISTS
2480 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
2481 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
2482 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(client) REFERENCES "Client"(ID) ON DELETE CASCADE\u000a )
2483 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2484 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
2485 ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
2486 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
2487 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
2488 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a )
2489 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2490 ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
2491 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a )
2492 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
2493 ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
2494 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
2495 DISCONNECT
2496 /*C117*/SET SCHEMA B
2497 SET SCHEMA B
2498 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
2499 COMMIT
2500 INSERT INTO "Lieu" VALUES(1,'Gentioux')
2501 COMMIT
2502 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
2503 COMMIT
2504 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
2505 COMMIT
2506 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
2507 COMMIT
2508 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
2509 COMMIT
2510 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
2511 COMMIT
2512 INSERT INTO "Lieu" VALUES(7,'Tarnac')
2513 COMMIT
2514 INSERT INTO "Lieu" VALUES(8,'Felletin')
2515 COMMIT
2516 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
2517 COMMIT
2518 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
2519 COMMIT
2520 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
2521 COMMIT
2522 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
2523 COMMIT
2524 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
2525 COMMIT
2526 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
2527 COMMIT
2528 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
2529 COMMIT
2530 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
2531 COMMIT
2532 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
2533 COMMIT
2534 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
2535 COMMIT
2536 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
2537 COMMIT
2538 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
2539 COMMIT
2540 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
2541 COMMIT
2542 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
2543 COMMIT
2544 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
2545 COMMIT
2546 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
2547 COMMIT
2548 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
2549 COMMIT
2550 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
2551 COMMIT
2552 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
2553 COMMIT
2554 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
2555 COMMIT
2556 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
2557 COMMIT
2558 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
2559 COMMIT
2560 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
2561 COMMIT
2562 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
2563 COMMIT
2564 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
2565 COMMIT
2566 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
2567 COMMIT
2568 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
2569 COMMIT
2570 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
2571 COMMIT
2572 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
2573 COMMIT
2574 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
2575 COMMIT
2576 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
2577 COMMIT
2578 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
2579 COMMIT
2580 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
2581 COMMIT
2582 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
2583 COMMIT
2584 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
2585 COMMIT
2586 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
2587 COMMIT
2588 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
2589 COMMIT
2590 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
2591 COMMIT
2592 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
2593 COMMIT
2594 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
2595 COMMIT
2596 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
2597 COMMIT
2598 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
2599 COMMIT
2600 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
2601 COMMIT
2602 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
2603 COMMIT
2604 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
2605 COMMIT
2606 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
2607 COMMIT
2608 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
2609 COMMIT
2610 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
2611 COMMIT
2612 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
2613 COMMIT
2614 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
2615 COMMIT
2616 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
2617 COMMIT
2618 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
2619 COMMIT
2620 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
2621 COMMIT
2622 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
2623 COMMIT
2624 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
2625 COMMIT
2626 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
2627 COMMIT
2628 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
2629 COMMIT
2630 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
2631 COMMIT
2632 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
2633 COMMIT
2634 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
2635 COMMIT
2636 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
2637 COMMIT
2638 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
2639 COMMIT
2640 DISCONNECT
2641 /*C118*/SET SCHEMA B
2642 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2643 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2644 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2645 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2646 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
2647 INSERT INTO "Vente" VALUES(0,10,1.000,0)
2648 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
2649 INSERT INTO "Vente" VALUES(1,14,2.000,1)
2650 INSERT INTO "Vente" VALUES(2,11,1.000,0)
2651 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
2652 INSERT INTO "Vente" VALUES(3,16,4.000,2)
2653 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
2654 INSERT INTO "Vente" VALUES(4,10,1.000,3)
2655 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
2656 INSERT INTO "Vente" VALUES(5,14,2.000,4)
2657 INSERT INTO "Vente" VALUES(6,11,1.000,3)
2658 COMMIT
2659 DROP FUNCTION produitToMaxDate IF EXISTS
2660 CREATE FUNCTION produitToMaxDate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
2661 DISCONNECT
2662 /*C119*/SET SCHEMA B
2663 DROP SCHEMA B CASCADE
2664 DISCONNECT
2665 /*C120*/SET SCHEMA B
2666 SET DATABASE COLLATION "French"
2667 SET DATABASE DEFAULT TABLE TYPE CACHED
2668 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
2669 DROP FUNCTION choisirUnProduit IF EXISTS
2670 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
2671 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
2672 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
2673 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
2674 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
2675 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
2676 DROP FUNCTION choisirUnClient IF EXISTS
2677 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
2678 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
2679 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
2680 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
2681 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
2682 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a )
2683 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
2684 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
2685 DISCONNECT
2686 /*C121*/SET SCHEMA B
2687 SET SCHEMA B
2688 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
2689 COMMIT
2690 INSERT INTO "Lieu" VALUES(1,'Gentioux')
2691 COMMIT
2692 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
2693 COMMIT
2694 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
2695 COMMIT
2696 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
2697 COMMIT
2698 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
2699 COMMIT
2700 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
2701 COMMIT
2702 INSERT INTO "Lieu" VALUES(7,'Tarnac')
2703 COMMIT
2704 INSERT INTO "Lieu" VALUES(8,'Felletin')
2705 COMMIT
2706 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
2707 COMMIT
2708 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
2709 COMMIT
2710 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
2711 COMMIT
2712 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
2713 COMMIT
2714 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
2715 COMMIT
2716 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
2717 COMMIT
2718 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
2719 COMMIT
2720 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
2721 COMMIT
2722 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
2723 COMMIT
2724 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
2725 COMMIT
2726 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
2727 COMMIT
2728 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
2729 COMMIT
2730 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
2731 COMMIT
2732 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
2733 COMMIT
2734 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
2735 COMMIT
2736 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
2737 COMMIT
2738 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
2739 COMMIT
2740 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
2741 COMMIT
2742 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
2743 COMMIT
2744 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
2745 COMMIT
2746 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
2747 COMMIT
2748 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
2749 COMMIT
2750 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
2751 COMMIT
2752 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
2753 COMMIT
2754 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
2755 COMMIT
2756 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
2757 COMMIT
2758 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
2759 COMMIT
2760 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
2761 COMMIT
2762 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
2763 COMMIT
2764 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
2765 COMMIT
2766 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
2767 COMMIT
2768 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
2769 COMMIT
2770 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
2771 COMMIT
2772 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
2773 COMMIT
2774 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
2775 COMMIT
2776 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
2777 COMMIT
2778 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
2779 COMMIT
2780 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
2781 COMMIT
2782 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
2783 COMMIT
2784 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
2785 COMMIT
2786 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
2787 COMMIT
2788 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
2789 COMMIT
2790 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
2791 COMMIT
2792 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
2793 COMMIT
2794 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
2795 COMMIT
2796 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
2797 COMMIT
2798 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
2799 COMMIT
2800 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
2801 COMMIT
2802 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
2803 COMMIT
2804 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
2805 COMMIT
2806 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
2807 COMMIT
2808 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
2809 COMMIT
2810 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
2811 COMMIT
2812 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
2813 COMMIT
2814 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
2815 COMMIT
2816 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
2817 COMMIT
2818 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
2819 COMMIT
2820 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
2821 COMMIT
2822 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
2823 COMMIT
2824 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
2825 COMMIT
2826 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
2827 COMMIT
2828 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
2829 COMMIT
2830 DISCONNECT
2831 /*C122*/SET SCHEMA B
2832 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2833 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2834 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2835 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2836 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
2837 INSERT INTO "Vente" VALUES(0,10,1.000,0)
2838 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
2839 INSERT INTO "Vente" VALUES(1,14,2.000,1)
2840 INSERT INTO "Vente" VALUES(2,11,1.000,0)
2841 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
2842 INSERT INTO "Vente" VALUES(3,16,4.000,2)
2843 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
2844 INSERT INTO "Vente" VALUES(4,10,1.000,3)
2845 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
2846 INSERT INTO "Vente" VALUES(5,14,2.000,4)
2847 INSERT INTO "Vente" VALUES(6,11,1.000,3)
2848 COMMIT
2849 DROP FUNCTION produitToMaxDate IF EXISTS
2850 DROP FUNCTION produit_MaxDate IF EXISTS
2851 CREATE FUNCTION produit_maxdate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
2852 DISCONNECT
2853 /*C123*/SET SCHEMA B
2854 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2855 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2856 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2857 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2858 DROP FUNCTION produit_MaxDate IF EXISTS
2859 CREATE FUNCTION produit_maxdate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
2860 DISCONNECT
2861 /*C124*/SET SCHEMA B
2862 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2863 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2864 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2865 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2866 DROP FUNCTION produit_maxdate IF EXISTS
2867 CREATE FUNCTION produit_maxdate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
2868 DISCONNECT
2869 /*C125*/SET SCHEMA B
2870 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2871 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2872 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2873 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2874 DROP FUNCTION produit_maxdate IF EXISTS
2875 DISCONNECT
2876 /*C126*/SET SCHEMA B
2877 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2878 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2879 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2880 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2881 DROP FUNCTION produit_maxdate IF EXISTS
2882 DISCONNECT
2883 /*C127*/SET SCHEMA B
2884 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2885 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2886 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2887 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2888 DROP FUNCTION produit_maxdate IF EXISTS
2889 DISCONNECT
2890 /*C128*/SET SCHEMA B
2891 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2892 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2893 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2894 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2895 DROP FUNCTION produit_maxdate IF EXISTS
2896 DISCONNECT
2897 /*C129*/SET SCHEMA B
2898 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2899 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2900 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2901 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2902 DROP FUNCTION produit_maxdate IF EXISTS
2903 DISCONNECT
2904 /*C130*/SET SCHEMA B
2905 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2906 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2907 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2908 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2909 DROP FUNCTION produit_maxdate IF EXISTS
2910 DISCONNECT
2911 /*C131*/SET SCHEMA B
2912 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2913 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2914 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2915 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2916 DROP FUNCTION produit_maxdate IF EXISTS
2917 DISCONNECT
2918 /*C132*/SET SCHEMA B
2919 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2920 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2921 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2922 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2923 DROP FUNCTION produit_maxdate IF EXISTS
2924 CREATE FUNCTION produit_maxdate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE, prix DECIMAL(100,2))\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a , MAX(euros) as prix \u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
2925 DISCONNECT
2926 /*C133*/SET SCHEMA B
2927 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2928 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2929 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2930 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2931 DROP FUNCTION produit_maxdate IF EXISTS
2932 CREATE FUNCTION produit_maxdate(IN last_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE, prix DECIMAL(100,2))\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a , MIN(euros) as prix \u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= last_date\u000a GROUP BY "Produit".ID)\u000a ;\u000a END
2933 DISCONNECT
2934 /*C134*/SET SCHEMA B
2935 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2936 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2937 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2938 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2939 DROP FUNCTION produit_maxdate IF EXISTS
2940 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
2941 DISCONNECT
2942 /*C135*/SET SCHEMA B
2943 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2944 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2945 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2946 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2947 DROP FUNCTION produit_maxdate IF EXISTS
2948 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
2949 DROP FUNCTION prix IF EXISTS
2950 DISCONNECT
2951 /*C136*/SET SCHEMA B
2952 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2953 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2954 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2955 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2956 DROP FUNCTION produit_maxdate IF EXISTS
2957 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
2958 DISCONNECT
2959 /*C137*/SET SCHEMA B
2960 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2961 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2962 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2963 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2964 DROP FUNCTION produit_maxdate IF EXISTS
2965 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
2966 DISCONNECT
2967 /*C138*/SET SCHEMA B
2968 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2969 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2970 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2971 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2972 DROP FUNCTION produit_maxdate IF EXISTS
2973 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
2974 DISCONNECT
2975 /*C139*/SET SCHEMA B
2976 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2977 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2978 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2979 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2980 DROP FUNCTION produit_maxdate IF EXISTS
2981 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
2982 DISCONNECT
2983 /*C140*/SET SCHEMA B
2984 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2985 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2986 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2987 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2988 DROP FUNCTION produit_maxdate IF EXISTS
2989 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
2990 DISCONNECT
2991 /*C141*/SET SCHEMA B
2992 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
2993 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
2994 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
2995 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
2996 DROP FUNCTION produit_maxdate IF EXISTS
2997 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(ID INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as PRODUIT_ID\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
2998 DISCONNECT
2999 /*C142*/SET SCHEMA B
3000 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3001 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3002 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3003 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3004 DROP FUNCTION produit_maxdate IF EXISTS
3005 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3006 DISCONNECT
3007 /*C143*/SET SCHEMA B
3008 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3009 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3010 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3011 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3012 DROP FUNCTION produit_maxdate IF EXISTS
3013 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3014 DISCONNECT
3015 /*C144*/SET SCHEMA B
3016 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3017 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3018 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3019 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3020 DROP FUNCTION produit_maxdate IF EXISTS
3021 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3022 DISCONNECT
3023 /*C145*/SET SCHEMA B
3024 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3025 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3026 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3027 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3028 DROP FUNCTION produit_maxdate IF EXISTS
3029 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3030 DISCONNECT
3031 /*C35*/INSERT INTO "Prix" VALUES(9,'2025-04-29',0,23.00)
3032 COMMIT
3033 INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
3034 COMMIT
3035 /*C146*/SET SCHEMA B
3036 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3037 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3038 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3039 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3040 DROP FUNCTION produit_maxdate IF EXISTS
3041 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3042 DISCONNECT
3043 /*C147*/SET SCHEMA B
3044 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3045 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3046 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3047 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3048 DROP FUNCTION produit_maxdate IF EXISTS
3049 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3050 DISCONNECT
3051 /*C148*/SET SCHEMA B
3052 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3053 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3054 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3055 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3056 DROP FUNCTION produit_maxdate IF EXISTS
3057 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3058 DISCONNECT
3059 /*C149*/SET SCHEMA B
3060 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3061 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3062 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3063 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3064 DROP FUNCTION produit_maxdate IF EXISTS
3065 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3066 DISCONNECT
3067 /*C150*/SET SCHEMA B
3068 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3069 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3070 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3071 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3072 DROP FUNCTION produit_maxdate IF EXISTS
3073 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3074 DISCONNECT
3075 /*C151*/SET SCHEMA B
3076 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3077 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3078 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3079 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3080 DROP FUNCTION produit_maxdate IF EXISTS
3081 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3082 DISCONNECT
3083 /*C152*/SET SCHEMA B
3084 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3085 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3086 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3087 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3088 DROP FUNCTION produit_maxdate IF EXISTS
3089 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3090 DISCONNECT
3091 /*C153*/SET SCHEMA B
3092 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3093 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3094 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3095 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3096 DROP FUNCTION produit_maxdate IF EXISTS
3097 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3098 DISCONNECT
3099 /*C154*/SET SCHEMA B
3100 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3101 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3102 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3103 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3104 DROP FUNCTION produit_maxdate IF EXISTS
3105 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3106 DISCONNECT
3107 /*C155*/SET SCHEMA B
3108 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3109 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3110 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3111 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3112 DROP FUNCTION produit_maxdate IF EXISTS
3113 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3114 DISCONNECT
3115 /*C156*/SET SCHEMA B
3116 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3117 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3118 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3119 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3120 DROP FUNCTION produit_maxdate IF EXISTS
3121 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3122 DISCONNECT
3123 /*C157*/SET SCHEMA B
3124 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3125 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3126 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3127 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3128 DROP FUNCTION produit_maxdate IF EXISTS
3129 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3130 DISCONNECT
3131 /*C158*/SET SCHEMA B
3132 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3133 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3134 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3135 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3136 DROP FUNCTION produit_maxdate IF EXISTS
3137 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3138 DISCONNECT
3139 /*C159*/SET SCHEMA B
3140 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3141 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3142 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3143 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3144 DROP FUNCTION produit_maxdate IF EXISTS
3145 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3146 DISCONNECT
3147 /*C160*/SET SCHEMA B
3148 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3149 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3150 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3151 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3152 DROP FUNCTION produit_maxdate IF EXISTS
3153 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3154 DISCONNECT
3155 /*C161*/SET SCHEMA B
3156 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3157 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3158 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3159 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3160 DROP FUNCTION produit_maxdate IF EXISTS
3161 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3162 DISCONNECT
3163 /*C162*/SET SCHEMA B
3164 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3165 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3166 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3167 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3168 DROP FUNCTION produit_maxdate IF EXISTS
3169 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3170 DISCONNECT
3171 /*C163*/SET SCHEMA B
3172 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3173 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3174 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3175 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3176 DROP FUNCTION produit_maxdate IF EXISTS
3177 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3178 DISCONNECT
3179 /*C164*/SET SCHEMA B
3180 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3181 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3182 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3183 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3184 DROP FUNCTION produit_maxdate IF EXISTS
3185 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3186 DISCONNECT
3187 /*C165*/SET SCHEMA B
3188 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3189 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3190 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3191 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3192 DROP FUNCTION produit_maxdate IF EXISTS
3193 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3194 DISCONNECT
3195 /*C166*/SET SCHEMA B
3196 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3197 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3198 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3199 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3200 DROP FUNCTION produit_maxdate IF EXISTS
3201 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3202 DISCONNECT
3203 /*C167*/SET SCHEMA B
3204 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3205 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3206 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3207 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3208 DROP FUNCTION produit_maxdate IF EXISTS
3209 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3210 DISCONNECT
3211 /*C168*/SET SCHEMA B
3212 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3213 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3214 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3215 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3216 DROP FUNCTION produit_maxdate IF EXISTS
3217 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3218 DISCONNECT
3219 /*C169*/SET SCHEMA B
3220 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3221 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3222 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3223 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3224 DROP FUNCTION produit_maxdate IF EXISTS
3225 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3226 DISCONNECT
3227 /*C170*/SET SCHEMA B
3228 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3229 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3230 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3231 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3232 DROP FUNCTION produit_maxdate IF EXISTS
3233 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3234 DISCONNECT
3235 /*C171*/SET SCHEMA B
3236 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3237 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3238 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3239 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3240 DROP FUNCTION produit_maxdate IF EXISTS
3241 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3242 DISCONNECT
3243 /*C172*/SET SCHEMA B
3244 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3245 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3246 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3247 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3248 DROP FUNCTION produit_maxdate IF EXISTS
3249 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3250 DISCONNECT
3251 /*C173*/SET SCHEMA B
3252 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3253 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3254 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3255 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3256 DROP FUNCTION produit_maxdate IF EXISTS
3257 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3258 DISCONNECT
3259 /*C174*/SET SCHEMA B
3260 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3261 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3262 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3263 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3264 DROP FUNCTION produit_maxdate IF EXISTS
3265 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3266 DISCONNECT
3267 /*C175*/SET SCHEMA B
3268 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3269 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3270 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3271 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3272 DROP FUNCTION produit_maxdate IF EXISTS
3273 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3274 DISCONNECT
3275 /*C176*/SET SCHEMA B
3276 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3277 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3278 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3279 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3280 DROP FUNCTION produit_maxdate IF EXISTS
3281 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3282 DISCONNECT
3283 /*C177*/SET SCHEMA B
3284 SET SCHEMA B
3285 DISCONNECT
3286 /*C178*/SET SCHEMA B
3287 DROP SCHEMA B CASCADE
3288 DISCONNECT
3289 /*C179*/SET SCHEMA B
3290 SET DATABASE COLLATION "French"
3291 SET DATABASE DEFAULT TABLE TYPE CACHED
3292 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
3293 DROP FUNCTION choisirUnProduit IF EXISTS
3294 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
3295 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
3296 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
3297 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
3298 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
3299 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
3300 DROP FUNCTION choisirUnClient IF EXISTS
3301 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
3302 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
3303 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
3304 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
3305 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
3306 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a )
3307 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
3308 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "Un seul prix de produit par date"\u000a UNIQUE (produit, date)\u000a )
3309 DISCONNECT
3310 /*C180*/SET SCHEMA B
3311 SET SCHEMA B
3312 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
3313 COMMIT
3314 INSERT INTO "Lieu" VALUES(1,'Gentioux')
3315 COMMIT
3316 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
3317 COMMIT
3318 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
3319 COMMIT
3320 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
3321 COMMIT
3322 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
3323 COMMIT
3324 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
3325 COMMIT
3326 INSERT INTO "Lieu" VALUES(7,'Tarnac')
3327 COMMIT
3328 INSERT INTO "Lieu" VALUES(8,'Felletin')
3329 COMMIT
3330 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
3331 COMMIT
3332 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
3333 COMMIT
3334 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
3335 COMMIT
3336 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
3337 COMMIT
3338 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
3339 COMMIT
3340 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
3341 COMMIT
3342 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
3343 COMMIT
3344 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
3345 COMMIT
3346 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
3347 COMMIT
3348 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
3349 COMMIT
3350 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
3351 COMMIT
3352 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
3353 COMMIT
3354 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
3355 COMMIT
3356 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
3357 COMMIT
3358 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
3359 COMMIT
3360 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
3361 COMMIT
3362 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
3363 COMMIT
3364 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
3365 COMMIT
3366 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
3367 COMMIT
3368 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
3369 COMMIT
3370 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
3371 COMMIT
3372 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
3373 COMMIT
3374 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
3375 COMMIT
3376 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
3377 COMMIT
3378 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
3379 COMMIT
3380 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
3381 COMMIT
3382 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
3383 COMMIT
3384 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
3385 COMMIT
3386 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
3387 COMMIT
3388 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
3389 COMMIT
3390 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
3391 COMMIT
3392 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
3393 COMMIT
3394 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
3395 COMMIT
3396 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
3397 COMMIT
3398 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
3399 COMMIT
3400 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
3401 COMMIT
3402 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
3403 COMMIT
3404 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
3405 COMMIT
3406 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
3407 COMMIT
3408 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
3409 COMMIT
3410 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
3411 COMMIT
3412 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
3413 COMMIT
3414 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
3415 COMMIT
3416 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
3417 COMMIT
3418 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
3419 COMMIT
3420 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
3421 COMMIT
3422 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
3423 COMMIT
3424 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
3425 COMMIT
3426 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
3427 COMMIT
3428 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
3429 COMMIT
3430 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
3431 COMMIT
3432 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
3433 COMMIT
3434 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
3435 COMMIT
3436 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
3437 COMMIT
3438 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
3439 COMMIT
3440 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
3441 COMMIT
3442 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
3443 COMMIT
3444 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
3445 COMMIT
3446 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
3447 COMMIT
3448 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
3449 COMMIT
3450 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
3451 COMMIT
3452 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
3453 COMMIT
3454 INSERT INTO "Prix" VALUES(9,'2025-04-29',0,23.00)
3455 COMMIT
3456 DISCONNECT
3457 /*C181*/SET SCHEMA B
3458 DROP SCHEMA B CASCADE
3459 DISCONNECT
3460 /*C182*/SET SCHEMA B
3461 SET DATABASE COLLATION "French"
3462 SET DATABASE DEFAULT TABLE TYPE CACHED
3463 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
3464 DROP FUNCTION choisirUnProduit IF EXISTS
3465 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
3466 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
3467 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
3468 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
3469 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
3470 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
3471 DROP FUNCTION choisirUnClient IF EXISTS
3472 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
3473 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
3474 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
3475 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
3476 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
3477 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a )
3478 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
3479 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "Un seul prix de produit par date"\u000a UNIQUE (produit, date)\u000a )
3480 DISCONNECT
3481 /*C183*/SET SCHEMA B
3482 SET SCHEMA B
3483 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
3484 COMMIT
3485 INSERT INTO "Lieu" VALUES(1,'Gentioux')
3486 COMMIT
3487 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
3488 COMMIT
3489 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
3490 COMMIT
3491 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
3492 COMMIT
3493 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
3494 COMMIT
3495 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
3496 COMMIT
3497 INSERT INTO "Lieu" VALUES(7,'Tarnac')
3498 COMMIT
3499 INSERT INTO "Lieu" VALUES(8,'Felletin')
3500 COMMIT
3501 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
3502 COMMIT
3503 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
3504 COMMIT
3505 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
3506 COMMIT
3507 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
3508 COMMIT
3509 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
3510 COMMIT
3511 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
3512 COMMIT
3513 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
3514 COMMIT
3515 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
3516 COMMIT
3517 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
3518 COMMIT
3519 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
3520 COMMIT
3521 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
3522 COMMIT
3523 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
3524 COMMIT
3525 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
3526 COMMIT
3527 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
3528 COMMIT
3529 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
3530 COMMIT
3531 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
3532 COMMIT
3533 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
3534 COMMIT
3535 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
3536 COMMIT
3537 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
3538 COMMIT
3539 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
3540 COMMIT
3541 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
3542 COMMIT
3543 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
3544 COMMIT
3545 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
3546 COMMIT
3547 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
3548 COMMIT
3549 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
3550 COMMIT
3551 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
3552 COMMIT
3553 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
3554 COMMIT
3555 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
3556 COMMIT
3557 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
3558 COMMIT
3559 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
3560 COMMIT
3561 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
3562 COMMIT
3563 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
3564 COMMIT
3565 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
3566 COMMIT
3567 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
3568 COMMIT
3569 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
3570 COMMIT
3571 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
3572 COMMIT
3573 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
3574 COMMIT
3575 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
3576 COMMIT
3577 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
3578 COMMIT
3579 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
3580 COMMIT
3581 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
3582 COMMIT
3583 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
3584 COMMIT
3585 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
3586 COMMIT
3587 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
3588 COMMIT
3589 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
3590 COMMIT
3591 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
3592 COMMIT
3593 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
3594 COMMIT
3595 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
3596 COMMIT
3597 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
3598 COMMIT
3599 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
3600 COMMIT
3601 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
3602 COMMIT
3603 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
3604 COMMIT
3605 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
3606 COMMIT
3607 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
3608 COMMIT
3609 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
3610 COMMIT
3611 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
3612 COMMIT
3613 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
3614 COMMIT
3615 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
3616 COMMIT
3617 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
3618 COMMIT
3619 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
3620 COMMIT
3621 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
3622 COMMIT
3623 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
3624 COMMIT
3625 INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
3626 COMMIT
3627 INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
3628 COMMIT
3629 DISCONNECT
3630 /*C184*/SET SCHEMA B
3631 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3632 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3633 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3634 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3635 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
3636 INSERT INTO "Vente" VALUES(0,10,1.000,0)
3637 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
3638 INSERT INTO "Vente" VALUES(1,14,2.000,1)
3639 INSERT INTO "Vente" VALUES(2,11,1.000,0)
3640 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
3641 INSERT INTO "Vente" VALUES(3,16,4.000,2)
3642 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
3643 INSERT INTO "Vente" VALUES(4,10,1.000,3)
3644 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
3645 INSERT INTO "Vente" VALUES(5,14,2.000,4)
3646 INSERT INTO "Vente" VALUES(6,11,1.000,3)
3647 COMMIT
3648 DROP FUNCTION produit_maxdate IF EXISTS
3649 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3650 DISCONNECT
3651 /*C185*/SET SCHEMA B
3652 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3653 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3654 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3655 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3656 DROP FUNCTION produit_maxdate IF EXISTS
3657 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3658 DROP FUNCTION prix_\u00e0_date IF EXISTS
3659 DISCONNECT
3660 /*C186*/SET SCHEMA B
3661 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3662 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3663 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3664 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3665 DROP FUNCTION produit_maxdate IF EXISTS
3666 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3667 DROP FUNCTION prix_\u00e0_date IF EXISTS
3668 DISCONNECT
3669 /*C187*/SET SCHEMA B
3670 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3671 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3672 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3673 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3674 DROP FUNCTION produit_maxdate IF EXISTS
3675 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3676 DROP FUNCTION prix_\u00e0_date IF EXISTS
3677 DISCONNECT
3678 /*C188*/SET SCHEMA B
3679 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3680 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3681 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3682 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3683 DROP FUNCTION produit_maxdate IF EXISTS
3684 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3685 DROP FUNCTION prix_\u00e0_date IF EXISTS
3686 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
3687 DISCONNECT
3688 /*C189*/SET SCHEMA B
3689 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3690 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3691 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3692 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3693 DISCONNECT
3694 /*C190*/SET SCHEMA B
3695 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3696 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3697 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3698 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3699 DISCONNECT
3700 /*C191*/SET SCHEMA B
3701 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3702 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3703 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3704 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3705 DISCONNECT
3706 /*C192*/SET SCHEMA B
3707 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3708 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3709 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3710 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3711 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
3712 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3713 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
3714 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
3715 DISCONNECT
3716 /*C193*/SET SCHEMA B
3717 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3718 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3719 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3720 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3721 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
3722 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3723 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
3724 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
3725 DISCONNECT
3726 /*C35*/DISCONNECT
3727 /*C194*/SET SCHEMA B
3728 DISCONNECT
3729 /*C195*/SET SCHEMA B
3730 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3731 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3732 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3733 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3734 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
3735 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3736 DROP FUNCTION prixadate IF EXISTS CASCADE
3737 CREATE FUNCTION prixadate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
3738 DISCONNECT
3739 /*C197*/SET SCHEMA B
3740 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3741 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3742 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3743 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3744 DISCONNECT
3745 /*C198*/SET SCHEMA B
3746 DROP SCHEMA B CASCADE
3747 DISCONNECT
3748 /*C199*/SET SCHEMA B
3749 SET DATABASE COLLATION "French"
3750 SET DATABASE DEFAULT TABLE TYPE CACHED
3751 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a )
3752 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
3753 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
3754 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
3755 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
3756 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
3757 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
3758 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
3759 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
3760 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
3761 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
3762 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
3763 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
3764 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
3765 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a )
3766 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
3767 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "Un seul prix de produit par date"\u000a UNIQUE (produit, date)\u000a )
3768 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
3769 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
3770 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
3771 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
3772 DISCONNECT
3773 /*C200*/SET SCHEMA B
3774 SET SCHEMA B
3775 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
3776 COMMIT
3777 INSERT INTO "Lieu" VALUES(1,'Gentioux')
3778 COMMIT
3779 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
3780 COMMIT
3781 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
3782 COMMIT
3783 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
3784 COMMIT
3785 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
3786 COMMIT
3787 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
3788 COMMIT
3789 INSERT INTO "Lieu" VALUES(7,'Tarnac')
3790 COMMIT
3791 INSERT INTO "Lieu" VALUES(8,'Felletin')
3792 COMMIT
3793 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
3794 COMMIT
3795 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
3796 COMMIT
3797 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
3798 COMMIT
3799 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
3800 COMMIT
3801 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
3802 COMMIT
3803 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
3804 COMMIT
3805 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
3806 COMMIT
3807 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
3808 COMMIT
3809 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
3810 COMMIT
3811 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
3812 COMMIT
3813 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
3814 COMMIT
3815 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
3816 COMMIT
3817 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
3818 COMMIT
3819 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
3820 COMMIT
3821 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
3822 COMMIT
3823 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
3824 COMMIT
3825 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
3826 COMMIT
3827 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
3828 COMMIT
3829 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
3830 COMMIT
3831 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
3832 COMMIT
3833 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
3834 COMMIT
3835 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
3836 COMMIT
3837 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
3838 COMMIT
3839 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
3840 COMMIT
3841 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
3842 COMMIT
3843 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
3844 COMMIT
3845 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
3846 COMMIT
3847 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
3848 COMMIT
3849 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
3850 COMMIT
3851 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
3852 COMMIT
3853 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
3854 COMMIT
3855 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
3856 COMMIT
3857 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
3858 COMMIT
3859 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
3860 COMMIT
3861 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
3862 COMMIT
3863 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
3864 COMMIT
3865 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
3866 COMMIT
3867 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
3868 COMMIT
3869 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
3870 COMMIT
3871 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
3872 COMMIT
3873 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
3874 COMMIT
3875 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
3876 COMMIT
3877 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
3878 COMMIT
3879 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
3880 COMMIT
3881 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
3882 COMMIT
3883 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
3884 COMMIT
3885 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
3886 COMMIT
3887 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
3888 COMMIT
3889 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
3890 COMMIT
3891 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
3892 COMMIT
3893 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
3894 COMMIT
3895 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
3896 COMMIT
3897 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
3898 COMMIT
3899 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
3900 COMMIT
3901 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
3902 COMMIT
3903 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
3904 COMMIT
3905 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
3906 COMMIT
3907 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
3908 COMMIT
3909 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
3910 COMMIT
3911 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
3912 COMMIT
3913 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
3914 COMMIT
3915 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
3916 COMMIT
3917 INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
3918 COMMIT
3919 INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
3920 COMMIT
3921 DISCONNECT
3922 /*C201*/SET SCHEMA B
3923 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3924 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3925 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3926 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3927 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
3928 INSERT INTO "Vente" VALUES(0,10,1.000,0)
3929 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
3930 INSERT INTO "Vente" VALUES(1,14,2.000,1)
3931 INSERT INTO "Vente" VALUES(2,11,1.000,0)
3932 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
3933 INSERT INTO "Vente" VALUES(3,16,4.000,2)
3934 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
3935 INSERT INTO "Vente" VALUES(4,10,1.000,3)
3936 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
3937 INSERT INTO "Vente" VALUES(5,14,2.000,4)
3938 INSERT INTO "Vente" VALUES(6,11,1.000,3)
3939 COMMIT
3940 DISCONNECT
3941 /*C196*/SET SCHEMA B
3942 DISCONNECT
3943 /*C203*/SET SCHEMA B
3944 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3945 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3946 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3947 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3948 DISCONNECT
3949 /*C204*/SET SCHEMA B
3950 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3951 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3952 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3953 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3954 DISCONNECT
3955 /*C205*/SET SCHEMA B
3956 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3957 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3958 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3959 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3960 DISCONNECT
3961 /*C206*/SET SCHEMA B
3962 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3963 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3964 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3965 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3966 DISCONNECT
3967 /*C207*/SET SCHEMA B
3968 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3969 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3970 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3971 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3972 DISCONNECT
3973 /*C208*/SET SCHEMA B
3974 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3975 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3976 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3977 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3978 DISCONNECT
3979 /*C209*/SET SCHEMA B
3980 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3981 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3982 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3983 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3984 DISCONNECT
3985 /*C210*/SET SCHEMA B
3986 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3987 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3988 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3989 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3990 DISCONNECT
3991 /*C211*/SET SCHEMA B
3992 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
3993 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
3994 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
3995 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
3996 DISCONNECT
3997 /*C202*/SET SCHEMA B
3998 DISCONNECT
3999 /*C212*/SET SCHEMA B
4000 DROP SCHEMA B CASCADE
4001 DISCONNECT
4002 /*C213*/SET SCHEMA B
4003 SET DATABASE COLLATION "French"
4004 SET DATABASE DEFAULT TABLE TYPE CACHED
4005 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom,quantit\u00e9)\u000a )
4006 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
4007 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
4008 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
4009 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
4010 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
4011 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
4012 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
4013 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
4014 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
4015 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
4016 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
4017 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
4018 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
4019 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a )
4020 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
4021 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
4022 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
4023 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
4024 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
4025 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
4026 DISCONNECT
4027 /*C214*/SET SCHEMA B
4028 SET SCHEMA B
4029 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
4030 COMMIT
4031 INSERT INTO "Lieu" VALUES(1,'Gentioux')
4032 COMMIT
4033 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
4034 COMMIT
4035 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
4036 COMMIT
4037 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
4038 COMMIT
4039 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
4040 COMMIT
4041 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
4042 COMMIT
4043 INSERT INTO "Lieu" VALUES(7,'Tarnac')
4044 COMMIT
4045 INSERT INTO "Lieu" VALUES(8,'Felletin')
4046 COMMIT
4047 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
4048 COMMIT
4049 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
4050 COMMIT
4051 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
4052 COMMIT
4053 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
4054 COMMIT
4055 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
4056 COMMIT
4057 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
4058 COMMIT
4059 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
4060 COMMIT
4061 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
4062 COMMIT
4063 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
4064 COMMIT
4065 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
4066 COMMIT
4067 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
4068 COMMIT
4069 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
4070 COMMIT
4071 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
4072 COMMIT
4073 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
4074 COMMIT
4075 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
4076 COMMIT
4077 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
4078 COMMIT
4079 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
4080 COMMIT
4081 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
4082 COMMIT
4083 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
4084 COMMIT
4085 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
4086 COMMIT
4087 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
4088 COMMIT
4089 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
4090 COMMIT
4091 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
4092 COMMIT
4093 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
4094 COMMIT
4095 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
4096 COMMIT
4097 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
4098 COMMIT
4099 DISCONNECT
4100 /*C215*/SET SCHEMA B
4101 DROP SCHEMA B CASCADE
4102 DISCONNECT
4103 /*C216*/SET SCHEMA B
4104 SET DATABASE COLLATION "French"
4105 SET DATABASE DEFAULT TABLE TYPE CACHED
4106 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom,quantit\u00e9)\u000a )
4107 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
4108 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
4109 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
4110 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
4111 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
4112 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
4113 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
4114 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
4115 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
4116 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
4117 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
4118 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
4119 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
4120 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a )
4121 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
4122 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
4123 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
4124 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
4125 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
4126 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
4127 DISCONNECT
4128 /*C217*/SET SCHEMA B
4129 SET SCHEMA B
4130 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
4131 COMMIT
4132 INSERT INTO "Lieu" VALUES(1,'Gentioux')
4133 COMMIT
4134 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
4135 COMMIT
4136 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
4137 COMMIT
4138 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
4139 COMMIT
4140 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
4141 COMMIT
4142 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
4143 COMMIT
4144 INSERT INTO "Lieu" VALUES(7,'Tarnac')
4145 COMMIT
4146 INSERT INTO "Lieu" VALUES(8,'Felletin')
4147 COMMIT
4148 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
4149 COMMIT
4150 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
4151 COMMIT
4152 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
4153 COMMIT
4154 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
4155 COMMIT
4156 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
4157 COMMIT
4158 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
4159 COMMIT
4160 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
4161 COMMIT
4162 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
4163 COMMIT
4164 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
4165 COMMIT
4166 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
4167 COMMIT
4168 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
4169 COMMIT
4170 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
4171 COMMIT
4172 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
4173 COMMIT
4174 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
4175 COMMIT
4176 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
4177 COMMIT
4178 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
4179 COMMIT
4180 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
4181 COMMIT
4182 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
4183 COMMIT
4184 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
4185 COMMIT
4186 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
4187 COMMIT
4188 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
4189 COMMIT
4190 DISCONNECT
4191 /*C218*/SET SCHEMA B
4192 DROP SCHEMA B CASCADE
4193 DISCONNECT
4194 /*C219*/SET SCHEMA B
4195 SET DATABASE COLLATION "French"
4196 SET DATABASE DEFAULT TABLE TYPE CACHED
4197 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom,quantit\u00e9)\u000a )
4198 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
4199 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
4200 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
4201 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
4202 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
4203 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
4204 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
4205 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
4206 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
4207 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
4208 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
4209 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
4210 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
4211 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a )
4212 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
4213 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
4214 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
4215 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
4216 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
4217 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
4218 DISCONNECT
4219 /*C220*/SET SCHEMA B
4220 SET SCHEMA B
4221 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
4222 COMMIT
4223 INSERT INTO "Lieu" VALUES(1,'Gentioux')
4224 COMMIT
4225 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
4226 COMMIT
4227 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
4228 COMMIT
4229 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
4230 COMMIT
4231 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
4232 COMMIT
4233 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
4234 COMMIT
4235 INSERT INTO "Lieu" VALUES(7,'Tarnac')
4236 COMMIT
4237 INSERT INTO "Lieu" VALUES(8,'Felletin')
4238 COMMIT
4239 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
4240 COMMIT
4241 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
4242 COMMIT
4243 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
4244 COMMIT
4245 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
4246 COMMIT
4247 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
4248 COMMIT
4249 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
4250 COMMIT
4251 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
4252 COMMIT
4253 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
4254 COMMIT
4255 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
4256 COMMIT
4257 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
4258 COMMIT
4259 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
4260 COMMIT
4261 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
4262 COMMIT
4263 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
4264 COMMIT
4265 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
4266 COMMIT
4267 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
4268 COMMIT
4269 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
4270 COMMIT
4271 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
4272 COMMIT
4273 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
4274 COMMIT
4275 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
4276 COMMIT
4277 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
4278 COMMIT
4279 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
4280 COMMIT
4281 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
4282 COMMIT
4283 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
4284 COMMIT
4285 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
4286 COMMIT
4287 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
4288 COMMIT
4289 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
4290 COMMIT
4291 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
4292 COMMIT
4293 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
4294 COMMIT
4295 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
4296 COMMIT
4297 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
4298 COMMIT
4299 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
4300 COMMIT
4301 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
4302 COMMIT
4303 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
4304 COMMIT
4305 DISCONNECT
4306 /*C221*/SET SCHEMA B
4307 DROP SCHEMA B CASCADE
4308 DISCONNECT
4309 /*C222*/SET SCHEMA B
4310 SET DATABASE COLLATION "French"
4311 SET DATABASE DEFAULT TABLE TYPE CACHED
4312 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom,quantit\u00e9)\u000a )
4313 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
4314 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
4315 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
4316 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
4317 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
4318 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
4319 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
4320 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
4321 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
4322 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
4323 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
4324 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
4325 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
4326 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a )
4327 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
4328 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
4329 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
4330 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
4331 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
4332 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
4333 DISCONNECT
4334 /*C223*/SET SCHEMA B
4335 SET SCHEMA B
4336 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
4337 COMMIT
4338 INSERT INTO "Lieu" VALUES(1,'Gentioux')
4339 COMMIT
4340 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
4341 COMMIT
4342 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
4343 COMMIT
4344 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
4345 COMMIT
4346 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
4347 COMMIT
4348 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
4349 COMMIT
4350 INSERT INTO "Lieu" VALUES(7,'Tarnac')
4351 COMMIT
4352 INSERT INTO "Lieu" VALUES(8,'Felletin')
4353 COMMIT
4354 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
4355 COMMIT
4356 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
4357 COMMIT
4358 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
4359 COMMIT
4360 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
4361 COMMIT
4362 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
4363 COMMIT
4364 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
4365 COMMIT
4366 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
4367 COMMIT
4368 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
4369 COMMIT
4370 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
4371 COMMIT
4372 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
4373 COMMIT
4374 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
4375 COMMIT
4376 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
4377 COMMIT
4378 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
4379 COMMIT
4380 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
4381 COMMIT
4382 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
4383 COMMIT
4384 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
4385 COMMIT
4386 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
4387 COMMIT
4388 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
4389 COMMIT
4390 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
4391 COMMIT
4392 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
4393 COMMIT
4394 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
4395 COMMIT
4396 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
4397 COMMIT
4398 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
4399 COMMIT
4400 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
4401 COMMIT
4402 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
4403 COMMIT
4404 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
4405 COMMIT
4406 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
4407 COMMIT
4408 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
4409 COMMIT
4410 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
4411 COMMIT
4412 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
4413 COMMIT
4414 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
4415 COMMIT
4416 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
4417 COMMIT
4418 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
4419 COMMIT
4420 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
4421 COMMIT
4422 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
4423 COMMIT
4424 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
4425 COMMIT
4426 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
4427 COMMIT
4428 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
4429 COMMIT
4430 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
4431 COMMIT
4432 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
4433 COMMIT
4434 DISCONNECT
4435 /*C224*/SET SCHEMA B
4436 DROP SCHEMA B CASCADE
4437 DISCONNECT
4438 /*C225*/SET SCHEMA B
4439 SET DATABASE COLLATION "French"
4440 SET DATABASE DEFAULT TABLE TYPE CACHED
4441 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom,quantit\u00e9)\u000a )
4442 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
4443 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
4444 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
4445 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
4446 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
4447 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
4448 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
4449 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
4450 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
4451 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
4452 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
4453 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
4454 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
4455 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a )
4456 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
4457 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
4458 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
4459 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
4460 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
4461 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
4462 DISCONNECT
4463 /*C226*/SET SCHEMA B
4464 SET SCHEMA B
4465 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
4466 COMMIT
4467 INSERT INTO "Lieu" VALUES(1,'Gentioux')
4468 COMMIT
4469 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
4470 COMMIT
4471 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
4472 COMMIT
4473 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
4474 COMMIT
4475 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
4476 COMMIT
4477 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
4478 COMMIT
4479 INSERT INTO "Lieu" VALUES(7,'Tarnac')
4480 COMMIT
4481 INSERT INTO "Lieu" VALUES(8,'Felletin')
4482 COMMIT
4483 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
4484 COMMIT
4485 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
4486 COMMIT
4487 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
4488 COMMIT
4489 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
4490 COMMIT
4491 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
4492 COMMIT
4493 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
4494 COMMIT
4495 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
4496 COMMIT
4497 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
4498 COMMIT
4499 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
4500 COMMIT
4501 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
4502 COMMIT
4503 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
4504 COMMIT
4505 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
4506 COMMIT
4507 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
4508 COMMIT
4509 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
4510 COMMIT
4511 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
4512 COMMIT
4513 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
4514 COMMIT
4515 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
4516 COMMIT
4517 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
4518 COMMIT
4519 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
4520 COMMIT
4521 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
4522 COMMIT
4523 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
4524 COMMIT
4525 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
4526 COMMIT
4527 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
4528 COMMIT
4529 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
4530 COMMIT
4531 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
4532 COMMIT
4533 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
4534 COMMIT
4535 DISCONNECT
4536 /*C227*/SET SCHEMA B
4537 DROP SCHEMA B CASCADE
4538 DISCONNECT
4539 /*C228*/SET SCHEMA B
4540 SET DATABASE COLLATION "French"
4541 SET DATABASE DEFAULT TABLE TYPE CACHED
4542 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
4543 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
4544 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
4545 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
4546 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
4547 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
4548 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
4549 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
4550 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
4551 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
4552 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
4553 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
4554 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
4555 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
4556 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a )
4557 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
4558 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
4559 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
4560 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
4561 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
4562 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
4563 DISCONNECT
4564 /*C229*/SET SCHEMA B
4565 SET SCHEMA B
4566 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
4567 COMMIT
4568 INSERT INTO "Lieu" VALUES(1,'Gentioux')
4569 COMMIT
4570 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
4571 COMMIT
4572 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
4573 COMMIT
4574 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
4575 COMMIT
4576 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
4577 COMMIT
4578 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
4579 COMMIT
4580 INSERT INTO "Lieu" VALUES(7,'Tarnac')
4581 COMMIT
4582 INSERT INTO "Lieu" VALUES(8,'Felletin')
4583 COMMIT
4584 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
4585 COMMIT
4586 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
4587 COMMIT
4588 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
4589 COMMIT
4590 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
4591 COMMIT
4592 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
4593 COMMIT
4594 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
4595 COMMIT
4596 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
4597 COMMIT
4598 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
4599 COMMIT
4600 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
4601 COMMIT
4602 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
4603 COMMIT
4604 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
4605 COMMIT
4606 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
4607 COMMIT
4608 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
4609 COMMIT
4610 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
4611 COMMIT
4612 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
4613 COMMIT
4614 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
4615 COMMIT
4616 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
4617 COMMIT
4618 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
4619 COMMIT
4620 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
4621 COMMIT
4622 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
4623 COMMIT
4624 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
4625 COMMIT
4626 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
4627 COMMIT
4628 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
4629 COMMIT
4630 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
4631 COMMIT
4632 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
4633 COMMIT
4634 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
4635 COMMIT
4636 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
4637 COMMIT
4638 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
4639 COMMIT
4640 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
4641 COMMIT
4642 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
4643 COMMIT
4644 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
4645 COMMIT
4646 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
4647 COMMIT
4648 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
4649 COMMIT
4650 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
4651 COMMIT
4652 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
4653 COMMIT
4654 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
4655 COMMIT
4656 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
4657 COMMIT
4658 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
4659 COMMIT
4660 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
4661 COMMIT
4662 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
4663 COMMIT
4664 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
4665 COMMIT
4666 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
4667 COMMIT
4668 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
4669 COMMIT
4670 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
4671 COMMIT
4672 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
4673 COMMIT
4674 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
4675 COMMIT
4676 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
4677 COMMIT
4678 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
4679 COMMIT
4680 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
4681 COMMIT
4682 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
4683 COMMIT
4684 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
4685 COMMIT
4686 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
4687 COMMIT
4688 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
4689 COMMIT
4690 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
4691 COMMIT
4692 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
4693 COMMIT
4694 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
4695 COMMIT
4696 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
4697 COMMIT
4698 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
4699 COMMIT
4700 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
4701 COMMIT
4702 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
4703 COMMIT
4704 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
4705 COMMIT
4706 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
4707 COMMIT
4708 INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
4709 COMMIT
4710 INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
4711 COMMIT
4712 DISCONNECT
4713 /*C230*/SET SCHEMA B
4714 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4715 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4716 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4717 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4718 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
4719 INSERT INTO "Vente" VALUES(0,10,1.000,0)
4720 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
4721 INSERT INTO "Vente" VALUES(1,14,2.000,1)
4722 INSERT INTO "Vente" VALUES(2,11,1.000,0)
4723 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
4724 INSERT INTO "Vente" VALUES(3,16,4.000,2)
4725 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
4726 INSERT INTO "Vente" VALUES(4,10,1.000,3)
4727 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
4728 INSERT INTO "Vente" VALUES(5,14,2.000,4)
4729 INSERT INTO "Vente" VALUES(6,11,1.000,3)
4730 COMMIT
4731 DISCONNECT
4732 /*C231*/SET SCHEMA B
4733 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4734 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4735 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4736 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4737 DISCONNECT
4738 /*C232*/SET SCHEMA B
4739 DELETE FROM "Vente" WHERE ID=6
4740 INSERT INTO "Vente" VALUES(6,15,1.000,3)
4741 COMMIT
4742 /*C233*/SET SCHEMA B
4743 SET SCHEMA B
4744 DISCONNECT
4745 /*C234*/SET SCHEMA B
4746 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4747 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4748 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4749 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4750 INSERT INTO "Vente" VALUES(7,11,1.000,3)
4751 COMMIT
4752 DISCONNECT
4753 /*C235*/SET SCHEMA B
4754 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4755 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4756 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4757 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4758 DROP PROCEDURE insertFactureClient IF EXISTS
4759 DISCONNECT
4760 /*C236*/SET SCHEMA B
4761 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4762 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4763 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4764 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4765 DROP PROCEDURE insertFactureClient IF EXISTS
4766 DISCONNECT
4767 /*C237*/SET SCHEMA B
4768 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4769 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4770 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4771 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4772 DROP PROCEDURE insertFactureClient IF EXISTS
4773 DISCONNECT
4774 /*C238*/SET SCHEMA B
4775 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4776 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4777 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4778 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4779 DROP PROCEDURE insertFactureClient IF EXISTS
4780 DISCONNECT
4781 /*C239*/SET SCHEMA B
4782 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4783 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4784 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4785 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4786 DROP PROCEDURE insertFactureClient IF EXISTS
4787 CREATE PROCEDURE insertFactureClient(IN client INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a END
4788 DISCONNECT
4789 /*C240*/SET SCHEMA B
4790 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4791 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4792 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4793 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4794 DISCONNECT
4795 /*C241*/SET SCHEMA B
4796 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4797 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4798 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4799 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4800 DISCONNECT
4801 /*C242*/SET SCHEMA B
4802 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4803 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4804 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4805 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4806 DISCONNECT
4807 /*C243*/SET SCHEMA B
4808 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4809 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4810 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4811 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4812 DISCONNECT
4813 /*C244*/SET SCHEMA B
4814 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4815 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4816 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4817 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4818 DISCONNECT
4819 /*C245*/SET SCHEMA B
4820 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4821 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4822 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4823 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4824 DISCONNECT
4825 /*C246*/SET SCHEMA B
4826 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4827 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4828 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4829 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4830 DISCONNECT
4831 /*C247*/SET SCHEMA B
4832 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4833 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4834 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4835 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4836 DISCONNECT
4837 /*C248*/SET SCHEMA B
4838 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4839 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4840 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4841 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4842 DISCONNECT
4843 /*C249*/SET SCHEMA B
4844 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4845 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4846 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4847 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4848 DROP PROCEDURE insertFactureClient IF EXISTS
4849 DISCONNECT
4850 /*C250*/SET SCHEMA B
4851 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4852 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4853 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4854 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4855 DROP PROCEDURE insertFactureClient IF EXISTS
4856 DISCONNECT
4857 /*C251*/SET SCHEMA B
4858 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4859 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4860 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4861 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4862 DROP PROCEDURE insertFactureClient IF EXISTS
4863 DISCONNECT
4864 /*C252*/SET SCHEMA B
4865 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4866 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4867 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4868 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4869 DROP PROCEDURE insertFactureClient IF EXISTS
4870 DISCONNECT
4871 /*C253*/SET SCHEMA B
4872 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4873 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4874 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4875 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4876 DROP PROCEDURE insertFactureClient IF EXISTS
4877 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4878 DISCONNECT
4879 /*C254*/SET SCHEMA B
4880 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4881 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4882 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4883 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4884 DROP PROCEDURE insertFactureClient IF EXISTS
4885 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4886 DISCONNECT
4887 /*C255*/SET SCHEMA B
4888 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4889 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4890 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4891 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4892 DROP PROCEDURE insertFactureClient IF EXISTS
4893 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4894 DISCONNECT
4895 /*C256*/SET SCHEMA B
4896 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4897 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4898 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4899 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4900 DROP PROCEDURE insertFactureClient IF EXISTS
4901 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4902 INSERT INTO "Facture" VALUES(0,'2025-04-29')
4903 DELETE FROM "Panier" WHERE ID=0
4904 DELETE FROM "Panier" WHERE ID=3
4905 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
4906 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
4907 COMMIT
4908 DISCONNECT
4909 /*C257*/SET SCHEMA B
4910 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4911 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4912 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4913 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4914 DROP PROCEDURE insertFactureClient IF EXISTS
4915 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4916 DISCONNECT
4917 /*C258*/SET SCHEMA B
4918 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4919 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4920 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4921 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4922 DROP PROCEDURE insertFactureClient IF EXISTS
4923 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4924 INSERT INTO "Facture" VALUES(1,'2025-04-29')
4925 DELETE FROM "Panier" WHERE ID=1
4926 DELETE FROM "Panier" WHERE ID=4
4927 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
4928 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
4929 COMMIT
4930 DISCONNECT
4931 /*C259*/SET SCHEMA B
4932 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4933 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4934 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4935 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4936 DROP PROCEDURE insertFactureClient IF EXISTS
4937 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4938 DISCONNECT
4939 /*C260*/SET SCHEMA B
4940 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4941 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4942 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4943 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4944 DROP PROCEDURE insertFactureClient IF EXISTS
4945 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4946 INSERT INTO "Facture" VALUES(2,'2025-04-29')
4947 DELETE FROM "Panier" WHERE ID=2
4948 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
4949 COMMIT
4950 DISCONNECT
4951 /*C261*/SET SCHEMA B
4952 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4953 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4954 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4955 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4956 DROP PROCEDURE insertFactureClient IF EXISTS
4957 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4958 DISCONNECT
4959 /*C262*/SET SCHEMA B
4960 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4961 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4962 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4963 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4964 DROP PROCEDURE insertFactureClient IF EXISTS
4965 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4966 DISCONNECT
4967 /*C263*/SET SCHEMA B
4968 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4969 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4970 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4971 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4972 DROP PROCEDURE insertFactureClient IF EXISTS
4973 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4974 DISCONNECT
4975 /*C264*/SET SCHEMA B
4976 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4977 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4978 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4979 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4980 DROP PROCEDURE insertFactureClient IF EXISTS
4981 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4982 DISCONNECT
4983 /*C265*/SET SCHEMA B
4984 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4985 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4986 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4987 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4988 DROP PROCEDURE insertFactureClient IF EXISTS
4989 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4990 DISCONNECT
4991 /*C266*/SET SCHEMA B
4992 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
4993 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
4994 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
4995 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
4996 DROP PROCEDURE insertFactureClient IF EXISTS
4997 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
4998 DISCONNECT
4999 /*C267*/SET SCHEMA B
5000 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5001 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5002 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5003 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5004 DROP PROCEDURE insertFactureClient IF EXISTS
5005 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5006 DISCONNECT
5007 /*C268*/SET SCHEMA B
5008 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5009 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5010 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5011 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5012 DROP PROCEDURE insertFactureClient IF EXISTS
5013 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5014 DISCONNECT
5015 /*C269*/SET SCHEMA B
5016 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5017 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5018 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5019 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5020 DROP PROCEDURE insertFactureClient IF EXISTS
5021 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5022 DISCONNECT
5023 /*C270*/SET SCHEMA B
5024 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5025 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5026 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5027 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5028 DROP PROCEDURE insertFactureClient IF EXISTS
5029 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5030 DISCONNECT
5031 /*C271*/SET SCHEMA B
5032 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5033 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5034 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5035 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5036 DROP PROCEDURE insertFactureClient IF EXISTS
5037 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5038 DISCONNECT
5039 /*C272*/SET SCHEMA B
5040 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5041 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5042 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5043 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5044 DROP PROCEDURE insertFactureClient IF EXISTS
5045 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5046 DISCONNECT
5047 /*C273*/SET SCHEMA B
5048 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5049 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5050 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5051 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5052 DROP PROCEDURE insertFactureClient IF EXISTS
5053 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5054 DISCONNECT
5055 /*C274*/SET SCHEMA B
5056 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5057 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5058 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5059 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5060 DROP PROCEDURE insertFactureClient IF EXISTS
5061 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5062 DISCONNECT
5063 /*C275*/SET SCHEMA B
5064 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5065 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5066 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5067 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5068 DROP PROCEDURE insertFactureClient IF EXISTS
5069 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5070 DISCONNECT
5071 /*C276*/SET SCHEMA B
5072 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5073 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5074 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5075 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5076 DROP PROCEDURE insertFactureClient IF EXISTS
5077 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5078 DISCONNECT
5079 /*C277*/SET SCHEMA B
5080 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5081 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5082 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5083 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5084 DROP PROCEDURE insertFactureClient IF EXISTS
5085 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5086 DISCONNECT
5087 /*C278*/SET SCHEMA B
5088 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5089 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5090 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5091 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5092 DROP PROCEDURE insertFactureClient IF EXISTS
5093 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5094 DISCONNECT
5095 /*C279*/SET SCHEMA B
5096 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5097 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5098 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5099 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5100 DROP PROCEDURE insertFactureClient IF EXISTS
5101 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5102 DISCONNECT
5103 /*C280*/SET SCHEMA B
5104 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5105 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5106 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5107 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5108 DROP PROCEDURE insertFactureClient IF EXISTS
5109 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5110 DISCONNECT
5111 /*C281*/SET SCHEMA B
5112 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5113 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5114 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5115 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5116 DROP PROCEDURE insertFactureClient IF EXISTS
5117 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5118 DISCONNECT
5119 /*C282*/SET SCHEMA B
5120 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5121 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5122 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5123 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5124 DROP PROCEDURE insertFactureClient IF EXISTS
5125 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5126 DISCONNECT
5127 /*C283*/SET SCHEMA B
5128 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5129 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5130 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5131 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5132 DROP PROCEDURE insertFactureClient IF EXISTS
5133 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5134 DISCONNECT
5135 /*C284*/SET SCHEMA B
5136 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5137 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5138 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5139 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5140 DROP PROCEDURE insertFactureClient IF EXISTS
5141 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5142 DISCONNECT
5143 /*C285*/SET SCHEMA B
5144 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5145 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5146 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5147 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5148 DROP PROCEDURE insertFactureClient IF EXISTS
5149 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5150 DISCONNECT
5151 /*C286*/SET SCHEMA B
5152 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5153 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5154 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5155 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5156 DROP PROCEDURE insertFactureClient IF EXISTS
5157 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5158 DISCONNECT
5159 /*C287*/SET SCHEMA B
5160 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5161 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5162 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5163 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5164 DROP PROCEDURE insertFactureClient IF EXISTS
5165 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5166 DISCONNECT
5167 /*C288*/SET SCHEMA B
5168 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5169 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5170 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5171 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5172 DROP PROCEDURE insertFactureClient IF EXISTS
5173 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5174 DISCONNECT
5175 /*C289*/SET SCHEMA B
5176 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5177 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5178 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5179 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5180 DROP PROCEDURE insertFactureClient IF EXISTS
5181 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5182 DISCONNECT
5183 /*C290*/SET SCHEMA B
5184 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5185 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5186 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5187 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5188 DROP PROCEDURE insertFactureClient IF EXISTS
5189 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5190 DISCONNECT
5191 /*C291*/SET SCHEMA B
5192 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5193 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5194 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5195 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5196 DROP PROCEDURE insertFactureClient IF EXISTS
5197 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5198 DISCONNECT
5199 /*C292*/SET SCHEMA B
5200 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5201 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5202 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5203 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5204 DROP PROCEDURE insertFactureClient IF EXISTS
5205 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5206 DISCONNECT
5207 /*C293*/SET SCHEMA B
5208 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5209 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5210 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5211 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5212 DROP PROCEDURE insertFactureClient IF EXISTS
5213 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5214 DISCONNECT
5215 /*C294*/SET SCHEMA B
5216 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5217 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5218 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5219 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5220 DROP PROCEDURE insertFactureClient IF EXISTS
5221 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5222 DISCONNECT
5223 /*C295*/SET SCHEMA B
5224 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5225 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5226 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5227 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5228 DROP PROCEDURE insertFactureClient IF EXISTS
5229 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5230 DISCONNECT
5231 /*C296*/SET SCHEMA B
5232 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5233 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5234 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5235 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5236 DROP PROCEDURE insertFactureClient IF EXISTS
5237 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5238 DISCONNECT
5239 /*C297*/SET SCHEMA B
5240 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5241 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5242 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5243 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5244 DROP PROCEDURE insertFactureClient IF EXISTS
5245 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5246 DISCONNECT
5247 /*C298*/SET SCHEMA B
5248 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5249 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5250 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5251 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5252 DROP PROCEDURE insertFactureClient IF EXISTS
5253 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5254 DISCONNECT
5255 /*C299*/SET SCHEMA B
5256 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5257 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5258 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5259 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5260 DROP PROCEDURE insertFactureClient IF EXISTS
5261 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5262 DISCONNECT
5263 /*C300*/SET SCHEMA B
5264 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5265 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5266 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5267 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5268 DROP PROCEDURE insertFactureClient IF EXISTS
5269 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5270 DISCONNECT
5271 /*C301*/SET SCHEMA B
5272 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5273 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5274 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5275 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5276 DROP PROCEDURE insertFactureClient IF EXISTS
5277 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5278 DISCONNECT
5279 /*C302*/SET SCHEMA B
5280 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5281 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5282 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5283 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5284 DROP PROCEDURE insertFactureClient IF EXISTS
5285 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5286 DISCONNECT
5287 /*C303*/SET SCHEMA B
5288 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5289 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5290 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5291 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5292 DROP PROCEDURE insertFactureClient IF EXISTS
5293 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5294 DISCONNECT
5295 /*C304*/SET SCHEMA B
5296 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5297 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5298 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5299 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5300 DROP PROCEDURE insertFactureClient IF EXISTS
5301 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5302 DISCONNECT
5303 /*C305*/SET SCHEMA B
5304 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5305 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5306 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5307 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5308 DROP PROCEDURE insertFactureClient IF EXISTS
5309 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5310 DISCONNECT
5311 /*C306*/SET SCHEMA B
5312 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5313 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5314 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5315 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5316 DROP PROCEDURE insertFactureClient IF EXISTS
5317 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5318 DISCONNECT
5319 /*C307*/SET SCHEMA B
5320 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5321 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5322 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5323 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5324 DROP PROCEDURE insertFactureClient IF EXISTS
5325 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5326 DISCONNECT
5327 /*C308*/SET SCHEMA B
5328 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5329 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5330 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5331 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5332 DROP PROCEDURE insertFactureClient IF EXISTS
5333 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5334 DISCONNECT
5335 /*C309*/SET SCHEMA B
5336 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5337 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5338 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5339 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5340 DROP PROCEDURE insertFactureClient IF EXISTS
5341 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5342 DISCONNECT
5343 /*C310*/SET SCHEMA B
5344 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5345 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5346 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5347 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5348 DROP PROCEDURE insertFactureClient IF EXISTS
5349 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5350 DISCONNECT
5351 /*C311*/SET SCHEMA B
5352 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5353 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5354 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5355 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5356 DROP PROCEDURE insertFactureClient IF EXISTS
5357 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5358 DISCONNECT
5359 /*C312*/SET SCHEMA B
5360 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5361 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5362 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5363 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5364 DROP PROCEDURE insertFactureClient IF EXISTS
5365 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5366 DISCONNECT
5367 /*C313*/SET SCHEMA B
5368 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5369 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5370 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5371 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5372 DROP PROCEDURE insertFactureClient IF EXISTS
5373 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5374 DISCONNECT
5375 /*C314*/SET SCHEMA B
5376 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5377 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5378 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5379 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5380 DROP PROCEDURE insertFactureClient IF EXISTS
5381 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5382 DISCONNECT
5383 /*C315*/SET SCHEMA B
5384 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5385 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5386 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5387 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5388 DROP PROCEDURE insertFactureClient IF EXISTS
5389 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5390 DISCONNECT
5391 /*C316*/SET SCHEMA B
5392 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5393 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5394 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5395 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5396 DROP PROCEDURE insertFactureClient IF EXISTS
5397 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5398 DISCONNECT
5399 /*C317*/SET SCHEMA B
5400 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5401 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5402 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5403 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5404 DROP PROCEDURE insertFactureClient IF EXISTS
5405 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5406 DISCONNECT
5407 /*C318*/SET SCHEMA B
5408 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5409 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5410 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5411 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5412 DROP PROCEDURE insertFactureClient IF EXISTS
5413 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5414 DISCONNECT
5415 /*C319*/SET SCHEMA B
5416 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5417 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5418 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5419 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5420 DROP PROCEDURE insertFactureClient IF EXISTS
5421 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5422 DISCONNECT
5423 /*C320*/SET SCHEMA B
5424 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5425 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5426 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5427 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5428 DROP PROCEDURE insertFactureClient IF EXISTS
5429 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5430 DISCONNECT
5431 /*C321*/SET SCHEMA B
5432 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5433 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5434 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5435 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5436 DROP PROCEDURE insertFactureClient IF EXISTS
5437 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5438 DISCONNECT
5439 /*C322*/SET SCHEMA B
5440 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5441 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5442 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5443 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5444 DROP PROCEDURE insertFactureClient IF EXISTS
5445 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5446 DISCONNECT
5447 /*C323*/SET SCHEMA B
5448 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5449 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5450 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5451 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5452 DROP PROCEDURE insertFactureClient IF EXISTS
5453 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5454 DISCONNECT
5455 /*C324*/SET SCHEMA B
5456 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5457 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5458 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5459 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5460 DROP PROCEDURE insertFactureClient IF EXISTS
5461 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5462 DISCONNECT
5463 /*C325*/SET SCHEMA B
5464 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5465 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5466 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5467 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5468 DROP PROCEDURE insertFactureClient IF EXISTS
5469 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5470 DISCONNECT
5471 /*C326*/SET SCHEMA B
5472 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5473 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5474 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5475 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5476 DROP PROCEDURE insertFactureClient IF EXISTS
5477 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5478 DISCONNECT
5479 /*C327*/SET SCHEMA B
5480 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5481 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5482 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5483 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5484 DROP PROCEDURE insertFactureClient IF EXISTS
5485 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5486 DISCONNECT
5487 /*C328*/SET SCHEMA B
5488 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5489 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5490 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5491 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5492 DROP PROCEDURE insertFactureClient IF EXISTS
5493 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5494 DISCONNECT
5495 /*C329*/SET SCHEMA B
5496 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5497 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5498 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5499 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5500 DROP PROCEDURE insertFactureClient IF EXISTS
5501 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5502 DISCONNECT
5503 /*C330*/SET SCHEMA B
5504 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5505 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5506 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5507 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5508 DROP PROCEDURE insertFactureClient IF EXISTS
5509 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5510 DISCONNECT
5511 /*C331*/SET SCHEMA B
5512 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5513 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5514 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5515 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5516 DROP PROCEDURE insertFactureClient IF EXISTS
5517 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5518 DISCONNECT
5519 /*C332*/SET SCHEMA B
5520 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5521 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5522 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5523 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5524 DROP PROCEDURE insertFactureClient IF EXISTS
5525 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5526 DISCONNECT
5527 /*C333*/SET SCHEMA B
5528 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5529 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5530 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5531 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5532 DROP PROCEDURE insertFactureClient IF EXISTS
5533 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5534 DISCONNECT
5535 /*C334*/SET SCHEMA B
5536 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5537 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5538 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5539 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5540 DROP PROCEDURE insertFactureClient IF EXISTS
5541 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5542 DISCONNECT
5543 /*C335*/SET SCHEMA B
5544 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5545 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5546 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5547 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5548 DROP PROCEDURE insertFactureClient IF EXISTS
5549 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5550 DISCONNECT
5551 /*C336*/SET SCHEMA B
5552 DROP SCHEMA B CASCADE
5553 DISCONNECT
5554 /*C337*/SET SCHEMA B
5555 SET DATABASE COLLATION "French"
5556 SET DATABASE DEFAULT TABLE TYPE CACHED
5557 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
5558 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
5559 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
5560 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
5561 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
5562 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
5563 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100)\u000a , m\u00e9l VARCHAR(100)\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a )
5564 ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
5565 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
5566 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
5567 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
5568 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
5569 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
5570 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
5571 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
5572 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
5573 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
5574 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
5575 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
5576 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
5577 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
5578 DISCONNECT
5579 /*C338*/SET SCHEMA B
5580 SET SCHEMA B
5581 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
5582 COMMIT
5583 INSERT INTO "Lieu" VALUES(1,'Gentioux')
5584 COMMIT
5585 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
5586 COMMIT
5587 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
5588 COMMIT
5589 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
5590 COMMIT
5591 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
5592 COMMIT
5593 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
5594 COMMIT
5595 INSERT INTO "Lieu" VALUES(7,'Tarnac')
5596 COMMIT
5597 INSERT INTO "Lieu" VALUES(8,'Felletin')
5598 COMMIT
5599 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
5600 COMMIT
5601 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
5602 COMMIT
5603 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
5604 COMMIT
5605 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
5606 COMMIT
5607 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
5608 COMMIT
5609 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
5610 COMMIT
5611 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
5612 COMMIT
5613 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
5614 COMMIT
5615 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
5616 COMMIT
5617 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
5618 COMMIT
5619 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
5620 COMMIT
5621 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
5622 COMMIT
5623 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
5624 COMMIT
5625 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
5626 COMMIT
5627 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
5628 COMMIT
5629 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
5630 COMMIT
5631 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
5632 COMMIT
5633 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
5634 COMMIT
5635 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
5636 COMMIT
5637 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
5638 COMMIT
5639 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
5640 COMMIT
5641 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
5642 COMMIT
5643 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
5644 COMMIT
5645 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
5646 COMMIT
5647 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
5648 COMMIT
5649 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
5650 COMMIT
5651 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
5652 COMMIT
5653 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
5654 COMMIT
5655 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
5656 COMMIT
5657 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
5658 COMMIT
5659 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
5660 COMMIT
5661 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
5662 COMMIT
5663 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
5664 COMMIT
5665 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
5666 COMMIT
5667 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
5668 COMMIT
5669 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
5670 COMMIT
5671 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
5672 COMMIT
5673 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
5674 COMMIT
5675 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
5676 COMMIT
5677 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
5678 COMMIT
5679 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
5680 COMMIT
5681 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
5682 COMMIT
5683 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
5684 COMMIT
5685 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
5686 COMMIT
5687 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
5688 COMMIT
5689 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
5690 COMMIT
5691 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
5692 COMMIT
5693 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
5694 COMMIT
5695 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
5696 COMMIT
5697 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
5698 COMMIT
5699 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
5700 COMMIT
5701 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
5702 COMMIT
5703 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
5704 COMMIT
5705 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
5706 COMMIT
5707 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
5708 COMMIT
5709 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
5710 COMMIT
5711 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
5712 COMMIT
5713 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
5714 COMMIT
5715 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
5716 COMMIT
5717 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
5718 COMMIT
5719 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
5720 COMMIT
5721 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
5722 COMMIT
5723 INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
5724 COMMIT
5725 INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
5726 COMMIT
5727 DISCONNECT
5728 /*C339*/SET SCHEMA B
5729 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5730 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5731 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5732 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5733 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
5734 INSERT INTO "Vente" VALUES(0,10,1.000,0)
5735 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
5736 INSERT INTO "Vente" VALUES(1,14,2.000,1)
5737 INSERT INTO "Vente" VALUES(2,11,1.000,0)
5738 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
5739 INSERT INTO "Vente" VALUES(3,16,4.000,2)
5740 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
5741 INSERT INTO "Vente" VALUES(4,10,1.000,3)
5742 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
5743 INSERT INTO "Vente" VALUES(5,14,2.000,4)
5744 INSERT INTO "Vente" VALUES(6,11,1.000,3)
5745 COMMIT
5746 DROP PROCEDURE insertFactureClient IF EXISTS
5747 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5748 INSERT INTO "Facture" VALUES(0,'2025-04-29')
5749 DELETE FROM "Panier" WHERE ID=0
5750 DELETE FROM "Panier" WHERE ID=3
5751 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
5752 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
5753 COMMIT
5754 INSERT INTO "Facture" VALUES(1,'2025-04-29')
5755 DELETE FROM "Panier" WHERE ID=1
5756 DELETE FROM "Panier" WHERE ID=4
5757 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
5758 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
5759 COMMIT
5760 INSERT INTO "Facture" VALUES(2,'2025-04-29')
5761 DELETE FROM "Panier" WHERE ID=2
5762 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
5763 COMMIT
5764 DISCONNECT
5765 /*C340*/SET SCHEMA B
5766 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5767 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5768 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5769 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5770 DROP PROCEDURE insertFactureClient IF EXISTS
5771 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5772 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".nom) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
5773 DISCONNECT
5774 /*C341*/SET SCHEMA B
5775 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5776 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5777 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5778 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5779 DROP PROCEDURE insertFactureClient IF EXISTS
5780 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5781 DISCONNECT
5782 /*C342*/SET SCHEMA B
5783 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5784 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5785 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5786 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5787 DROP PROCEDURE insertFactureClient IF EXISTS
5788 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5789 DISCONNECT
5790 /*C343*/SET SCHEMA B
5791 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5792 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5793 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5794 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5795 DROP PROCEDURE insertFactureClient IF EXISTS
5796 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5797 DROP VIEW Factures IF EXISTS
5798 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".nom) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
5799 DISCONNECT
5800 /*C344*/SET SCHEMA B
5801 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5802 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5803 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5804 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5805 DROP PROCEDURE insertFactureClient IF EXISTS
5806 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5807 DROP VIEW Factures IF EXISTS
5808 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".nom) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
5809 DISCONNECT
5810 /*C345*/SET SCHEMA B
5811 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5812 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5813 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5814 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5815 DROP PROCEDURE insertFactureClient IF EXISTS
5816 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID FROM "Panier" WHERE facture IS NULL AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5817 DROP VIEW Factures IF EXISTS
5818 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".nom) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
5819 DISCONNECT
5820 /*C346*/SET SCHEMA B
5821 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
5822 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
5823 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
5824 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
5825 DROP PROCEDURE insertFactureClient IF EXISTS
5826 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
5827 DROP VIEW Factures IF EXISTS
5828 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".nom) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
5829 DISCONNECT
5830 /*C347*/SET SCHEMA B
5831 DROP SCHEMA B CASCADE
5832 DISCONNECT
5833 /*C348*/SET SCHEMA B
5834 SET DATABASE COLLATION "French"
5835 SET DATABASE DEFAULT TABLE TYPE CACHED
5836 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
5837 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
5838 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
5839 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
5840 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
5841 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
5842 DISCONNECT
5843 /*C349*/SET SCHEMA B
5844 DROP SCHEMA B CASCADE
5845 DISCONNECT
5846 /*C350*/SET SCHEMA B
5847 SET DATABASE COLLATION "French"
5848 SET DATABASE DEFAULT TABLE TYPE CACHED
5849 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
5850 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
5851 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
5852 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
5853 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
5854 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
5855 DISCONNECT
5856 /*C351*/SET SCHEMA B
5857 DROP SCHEMA B CASCADE
5858 DISCONNECT
5859 /*C352*/SET SCHEMA B
5860 SET DATABASE COLLATION "French"
5861 SET DATABASE DEFAULT TABLE TYPE CACHED
5862 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
5863 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
5864 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
5865 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
5866 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
5867 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
5868 DISCONNECT
5869 /*C353*/SET SCHEMA B
5870 DROP SCHEMA B CASCADE
5871 DISCONNECT
5872 /*C354*/SET SCHEMA B
5873 SET DATABASE COLLATION "French"
5874 SET DATABASE DEFAULT TABLE TYPE CACHED
5875 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
5876 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
5877 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
5878 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
5879 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
5880 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
5881 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
5882 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
5883 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
5884 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
5885 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
5886 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
5887 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
5888 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
5889 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
5890 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
5891 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
5892 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
5893 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
5894 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
5895 DISCONNECT
5896 /*C355*/SET SCHEMA B
5897 SET SCHEMA B
5898 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
5899 COMMIT
5900 INSERT INTO "Lieu" VALUES(1,'Gentioux')
5901 COMMIT
5902 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
5903 COMMIT
5904 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
5905 COMMIT
5906 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
5907 COMMIT
5908 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
5909 COMMIT
5910 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
5911 COMMIT
5912 INSERT INTO "Lieu" VALUES(7,'Tarnac')
5913 COMMIT
5914 INSERT INTO "Lieu" VALUES(8,'Felletin')
5915 COMMIT
5916 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
5917 COMMIT
5918 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
5919 COMMIT
5920 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
5921 COMMIT
5922 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
5923 COMMIT
5924 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
5925 COMMIT
5926 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
5927 COMMIT
5928 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
5929 COMMIT
5930 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
5931 COMMIT
5932 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
5933 COMMIT
5934 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
5935 COMMIT
5936 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
5937 COMMIT
5938 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
5939 COMMIT
5940 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
5941 COMMIT
5942 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
5943 COMMIT
5944 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
5945 COMMIT
5946 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
5947 COMMIT
5948 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
5949 COMMIT
5950 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
5951 COMMIT
5952 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
5953 COMMIT
5954 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
5955 COMMIT
5956 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
5957 COMMIT
5958 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
5959 COMMIT
5960 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
5961 COMMIT
5962 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
5963 COMMIT
5964 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
5965 COMMIT
5966 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
5967 COMMIT
5968 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
5969 COMMIT
5970 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
5971 COMMIT
5972 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
5973 COMMIT
5974 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
5975 COMMIT
5976 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
5977 COMMIT
5978 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
5979 COMMIT
5980 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
5981 COMMIT
5982 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
5983 COMMIT
5984 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
5985 COMMIT
5986 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
5987 COMMIT
5988 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
5989 COMMIT
5990 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
5991 COMMIT
5992 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
5993 COMMIT
5994 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
5995 COMMIT
5996 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
5997 COMMIT
5998 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
5999 COMMIT
6000 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
6001 COMMIT
6002 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
6003 COMMIT
6004 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
6005 COMMIT
6006 DISCONNECT
6007 /*C356*/SET SCHEMA B
6008 DROP SCHEMA B CASCADE
6009 DISCONNECT
6010 /*C357*/SET SCHEMA B
6011 SET DATABASE COLLATION "French"
6012 SET DATABASE DEFAULT TABLE TYPE CACHED
6013 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
6014 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
6015 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
6016 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
6017 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
6018 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
6019 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
6020 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
6021 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
6022 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
6023 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
6024 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
6025 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
6026 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
6027 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
6028 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
6029 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
6030 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
6031 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
6032 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
6033 DISCONNECT
6034 /*C358*/SET SCHEMA B
6035 SET SCHEMA B
6036 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
6037 COMMIT
6038 INSERT INTO "Lieu" VALUES(1,'Gentioux')
6039 COMMIT
6040 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
6041 COMMIT
6042 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
6043 COMMIT
6044 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
6045 COMMIT
6046 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
6047 COMMIT
6048 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
6049 COMMIT
6050 INSERT INTO "Lieu" VALUES(7,'Tarnac')
6051 COMMIT
6052 INSERT INTO "Lieu" VALUES(8,'Felletin')
6053 COMMIT
6054 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
6055 COMMIT
6056 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
6057 COMMIT
6058 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
6059 COMMIT
6060 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
6061 COMMIT
6062 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
6063 COMMIT
6064 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
6065 COMMIT
6066 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
6067 COMMIT
6068 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
6069 COMMIT
6070 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
6071 COMMIT
6072 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
6073 COMMIT
6074 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
6075 COMMIT
6076 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
6077 COMMIT
6078 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
6079 COMMIT
6080 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
6081 COMMIT
6082 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
6083 COMMIT
6084 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
6085 COMMIT
6086 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
6087 COMMIT
6088 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
6089 COMMIT
6090 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
6091 COMMIT
6092 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
6093 COMMIT
6094 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
6095 COMMIT
6096 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
6097 COMMIT
6098 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
6099 COMMIT
6100 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
6101 COMMIT
6102 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
6103 COMMIT
6104 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
6105 COMMIT
6106 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
6107 COMMIT
6108 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
6109 COMMIT
6110 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
6111 COMMIT
6112 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
6113 COMMIT
6114 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
6115 COMMIT
6116 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
6117 COMMIT
6118 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
6119 COMMIT
6120 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
6121 COMMIT
6122 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
6123 COMMIT
6124 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
6125 COMMIT
6126 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
6127 COMMIT
6128 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
6129 COMMIT
6130 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
6131 COMMIT
6132 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
6133 COMMIT
6134 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
6135 COMMIT
6136 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
6137 COMMIT
6138 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
6139 COMMIT
6140 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
6141 COMMIT
6142 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
6143 COMMIT
6144 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
6145 COMMIT
6146 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
6147 COMMIT
6148 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
6149 COMMIT
6150 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
6151 COMMIT
6152 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
6153 COMMIT
6154 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
6155 COMMIT
6156 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
6157 COMMIT
6158 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
6159 COMMIT
6160 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
6161 COMMIT
6162 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
6163 COMMIT
6164 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
6165 COMMIT
6166 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
6167 COMMIT
6168 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
6169 COMMIT
6170 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
6171 COMMIT
6172 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
6173 COMMIT
6174 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
6175 COMMIT
6176 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
6177 COMMIT
6178 INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
6179 COMMIT
6180 INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
6181 COMMIT
6182 DISCONNECT
6183 /*C359*/SET SCHEMA B
6184 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
6185 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
6186 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
6187 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
6188 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
6189 INSERT INTO "Vente" VALUES(0,10,1.000,0)
6190 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
6191 INSERT INTO "Vente" VALUES(1,14,2.000,1)
6192 INSERT INTO "Vente" VALUES(2,11,1.000,0)
6193 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
6194 INSERT INTO "Vente" VALUES(3,16,4.000,2)
6195 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
6196 INSERT INTO "Vente" VALUES(4,10,1.000,3)
6197 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
6198 INSERT INTO "Vente" VALUES(5,14,2.000,4)
6199 INSERT INTO "Vente" VALUES(6,11,1.000,3)
6200 COMMIT
6201 DROP PROCEDURE insertFactureClient IF EXISTS
6202 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
6203 INSERT INTO "Facture" VALUES(0,'2025-04-29')
6204 DELETE FROM "Panier" WHERE ID=0
6205 DELETE FROM "Panier" WHERE ID=3
6206 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
6207 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
6208 COMMIT
6209 INSERT INTO "Facture" VALUES(1,'2025-04-29')
6210 DELETE FROM "Panier" WHERE ID=1
6211 DELETE FROM "Panier" WHERE ID=4
6212 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
6213 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
6214 COMMIT
6215 INSERT INTO "Facture" VALUES(2,'2025-04-29')
6216 DELETE FROM "Panier" WHERE ID=2
6217 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
6218 COMMIT
6219 DROP VIEW Factures IF EXISTS
6220 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".nom) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
6221 DISCONNECT
6222 /*C360*/SET SCHEMA B
6223 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
6224 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
6225 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
6226 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
6227 DROP PROCEDURE insertFactureClient IF EXISTS
6228 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
6229 DROP VIEW Factures IF EXISTS
6230 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
6231 DISCONNECT
6232 /*C232*/DISCONNECT
6233 /*C362*/SET SCHEMA B
6234 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
6235 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
6236 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
6237 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
6238 DROP PROCEDURE insertFactureClient IF EXISTS
6239 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
6240 DROP VIEW Factures IF EXISTS
6241 DISCONNECT
6242 /*C363*/SET SCHEMA B
6243 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
6244 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
6245 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
6246 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
6247 DROP PROCEDURE insertFactureClient IF EXISTS
6248 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
6249 DROP VIEW Factures IF EXISTS
6250 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
6251 DISCONNECT
6252 /*C364*/SET SCHEMA B
6253 DROP SCHEMA B CASCADE
6254 DISCONNECT
6255 /*C365*/SET SCHEMA B
6256 SET DATABASE COLLATION "French"
6257 SET DATABASE DEFAULT TABLE TYPE CACHED
6258 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
6259 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
6260 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
6261 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
6262 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
6263 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
6264 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
6265 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
6266 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
6267 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
6268 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
6269 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
6270 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
6271 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
6272 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
6273 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
6274 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
6275 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
6276 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
6277 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
6278 DISCONNECT
6279 /*C366*/SET SCHEMA B
6280 SET SCHEMA B
6281 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
6282 COMMIT
6283 INSERT INTO "Lieu" VALUES(1,'Gentioux')
6284 COMMIT
6285 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
6286 COMMIT
6287 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
6288 COMMIT
6289 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
6290 COMMIT
6291 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
6292 COMMIT
6293 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
6294 COMMIT
6295 INSERT INTO "Lieu" VALUES(7,'Tarnac')
6296 COMMIT
6297 INSERT INTO "Lieu" VALUES(8,'Felletin')
6298 COMMIT
6299 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
6300 COMMIT
6301 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
6302 COMMIT
6303 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
6304 COMMIT
6305 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
6306 COMMIT
6307 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
6308 COMMIT
6309 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
6310 COMMIT
6311 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
6312 COMMIT
6313 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
6314 COMMIT
6315 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
6316 COMMIT
6317 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
6318 COMMIT
6319 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
6320 COMMIT
6321 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
6322 COMMIT
6323 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
6324 COMMIT
6325 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
6326 COMMIT
6327 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
6328 COMMIT
6329 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
6330 COMMIT
6331 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
6332 COMMIT
6333 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
6334 COMMIT
6335 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
6336 COMMIT
6337 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
6338 COMMIT
6339 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
6340 COMMIT
6341 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
6342 COMMIT
6343 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
6344 COMMIT
6345 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
6346 COMMIT
6347 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
6348 COMMIT
6349 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
6350 COMMIT
6351 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
6352 COMMIT
6353 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
6354 COMMIT
6355 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
6356 COMMIT
6357 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
6358 COMMIT
6359 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
6360 COMMIT
6361 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
6362 COMMIT
6363 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
6364 COMMIT
6365 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
6366 COMMIT
6367 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
6368 COMMIT
6369 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
6370 COMMIT
6371 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
6372 COMMIT
6373 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
6374 COMMIT
6375 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
6376 COMMIT
6377 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
6378 COMMIT
6379 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
6380 COMMIT
6381 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
6382 COMMIT
6383 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
6384 COMMIT
6385 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
6386 COMMIT
6387 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
6388 COMMIT
6389 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
6390 COMMIT
6391 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
6392 COMMIT
6393 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
6394 COMMIT
6395 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
6396 COMMIT
6397 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
6398 COMMIT
6399 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
6400 COMMIT
6401 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
6402 COMMIT
6403 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
6404 COMMIT
6405 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
6406 COMMIT
6407 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
6408 COMMIT
6409 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
6410 COMMIT
6411 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
6412 COMMIT
6413 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
6414 COMMIT
6415 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
6416 COMMIT
6417 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
6418 COMMIT
6419 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
6420 COMMIT
6421 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
6422 COMMIT
6423 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
6424 COMMIT
6425 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
6426 COMMIT
6427 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
6428 COMMIT
6429 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
6430 COMMIT
6431 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
6432 COMMIT
6433 DISCONNECT
6434 /*C367*/SET SCHEMA B
6435 DROP SCHEMA B CASCADE
6436 DISCONNECT
6437 /*C368*/SET SCHEMA B
6438 SET DATABASE COLLATION "French"
6439 SET DATABASE DEFAULT TABLE TYPE CACHED
6440 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
6441 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
6442 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
6443 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
6444 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
6445 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
6446 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
6447 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
6448 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
6449 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
6450 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
6451 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
6452 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
6453 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
6454 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
6455 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
6456 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
6457 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
6458 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
6459 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
6460 DISCONNECT
6461 /*C369*/SET SCHEMA B
6462 SET SCHEMA B
6463 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
6464 COMMIT
6465 INSERT INTO "Lieu" VALUES(1,'Gentioux')
6466 COMMIT
6467 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
6468 COMMIT
6469 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
6470 COMMIT
6471 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
6472 COMMIT
6473 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
6474 COMMIT
6475 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
6476 COMMIT
6477 INSERT INTO "Lieu" VALUES(7,'Tarnac')
6478 COMMIT
6479 INSERT INTO "Lieu" VALUES(8,'Felletin')
6480 COMMIT
6481 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
6482 COMMIT
6483 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
6484 COMMIT
6485 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
6486 COMMIT
6487 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
6488 COMMIT
6489 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
6490 COMMIT
6491 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
6492 COMMIT
6493 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
6494 COMMIT
6495 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
6496 COMMIT
6497 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
6498 COMMIT
6499 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
6500 COMMIT
6501 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
6502 COMMIT
6503 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
6504 COMMIT
6505 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
6506 COMMIT
6507 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
6508 COMMIT
6509 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
6510 COMMIT
6511 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
6512 COMMIT
6513 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
6514 COMMIT
6515 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
6516 COMMIT
6517 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
6518 COMMIT
6519 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
6520 COMMIT
6521 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
6522 COMMIT
6523 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
6524 COMMIT
6525 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
6526 COMMIT
6527 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
6528 COMMIT
6529 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
6530 COMMIT
6531 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
6532 COMMIT
6533 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
6534 COMMIT
6535 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
6536 COMMIT
6537 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
6538 COMMIT
6539 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
6540 COMMIT
6541 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
6542 COMMIT
6543 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
6544 COMMIT
6545 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
6546 COMMIT
6547 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
6548 COMMIT
6549 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
6550 COMMIT
6551 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
6552 COMMIT
6553 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
6554 COMMIT
6555 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
6556 COMMIT
6557 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
6558 COMMIT
6559 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
6560 COMMIT
6561 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
6562 COMMIT
6563 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
6564 COMMIT
6565 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
6566 COMMIT
6567 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
6568 COMMIT
6569 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
6570 COMMIT
6571 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
6572 COMMIT
6573 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
6574 COMMIT
6575 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
6576 COMMIT
6577 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
6578 COMMIT
6579 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
6580 COMMIT
6581 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
6582 COMMIT
6583 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
6584 COMMIT
6585 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
6586 COMMIT
6587 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
6588 COMMIT
6589 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
6590 COMMIT
6591 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
6592 COMMIT
6593 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
6594 COMMIT
6595 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
6596 COMMIT
6597 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
6598 COMMIT
6599 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
6600 COMMIT
6601 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
6602 COMMIT
6603 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
6604 COMMIT
6605 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
6606 COMMIT
6607 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
6608 COMMIT
6609 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
6610 COMMIT
6611 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
6612 COMMIT
6613 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
6614 COMMIT
6615 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
6616 COMMIT
6617 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
6618 COMMIT
6619 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
6620 COMMIT
6621 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
6622 COMMIT
6623 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
6624 COMMIT
6625 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
6626 COMMIT
6627 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
6628 COMMIT
6629 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
6630 COMMIT
6631 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
6632 COMMIT
6633 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
6634 COMMIT
6635 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
6636 COMMIT
6637 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
6638 COMMIT
6639 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
6640 COMMIT
6641 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
6642 COMMIT
6643 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
6644 COMMIT
6645 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
6646 COMMIT
6647 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
6648 COMMIT
6649 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
6650 COMMIT
6651 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
6652 COMMIT
6653 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
6654 COMMIT
6655 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
6656 COMMIT
6657 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
6658 COMMIT
6659 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
6660 COMMIT
6661 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
6662 COMMIT
6663 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
6664 COMMIT
6665 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
6666 COMMIT
6667 DISCONNECT
6668 /*C370*/SET SCHEMA B
6669 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
6670 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
6671 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
6672 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
6673 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
6674 INSERT INTO "Vente" VALUES(0,10,1.000,0)
6675 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
6676 INSERT INTO "Vente" VALUES(1,14,2.000,1)
6677 INSERT INTO "Vente" VALUES(2,11,1.000,0)
6678 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
6679 INSERT INTO "Vente" VALUES(3,16,4.000,2)
6680 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
6681 INSERT INTO "Vente" VALUES(4,10,1.000,3)
6682 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
6683 INSERT INTO "Vente" VALUES(5,14,2.000,4)
6684 INSERT INTO "Vente" VALUES(6,11,1.000,3)
6685 COMMIT
6686 DROP PROCEDURE insertFactureClient IF EXISTS
6687 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
6688 INSERT INTO "Facture" VALUES(0,'2025-04-29')
6689 DELETE FROM "Panier" WHERE ID=0
6690 DELETE FROM "Panier" WHERE ID=3
6691 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
6692 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
6693 COMMIT
6694 INSERT INTO "Facture" VALUES(1,'2025-04-29')
6695 DELETE FROM "Panier" WHERE ID=1
6696 DELETE FROM "Panier" WHERE ID=4
6697 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
6698 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
6699 COMMIT
6700 INSERT INTO "Facture" VALUES(2,'2025-04-29')
6701 DELETE FROM "Panier" WHERE ID=2
6702 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
6703 COMMIT
6704 DROP VIEW Factures IF EXISTS
6705 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
6706 DISCONNECT
6707 /*C371*/SET SCHEMA B
6708 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
6709 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
6710 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
6711 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
6712 DROP PROCEDURE insertFactureClient IF EXISTS
6713 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
6714 DROP VIEW Factures IF EXISTS
6715 DISCONNECT
6716 /*C372*/SET SCHEMA B
6717 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
6718 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
6719 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
6720 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
6721 DROP PROCEDURE insertFactureClient IF EXISTS
6722 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
6723 DROP VIEW Factures IF EXISTS
6724 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros) as prix\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
6725 DISCONNECT
6726 /*C373*/SET SCHEMA B
6727 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
6728 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
6729 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
6730 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
6731 DROP PROCEDURE insertFactureClient IF EXISTS
6732 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
6733 DROP VIEW Factures IF EXISTS
6734 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
6735 DISCONNECT
6736 /*C374*/SET SCHEMA B
6737 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
6738 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
6739 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
6740 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
6741 DROP PROCEDURE insertFactureClient IF EXISTS
6742 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
6743 DROP VIEW Factures IF EXISTS
6744 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros) as prix\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
6745 DISCONNECT
6746 /*C375*/SET SCHEMA B
6747 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
6748 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
6749 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
6750 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
6751 DROP PROCEDURE insertFactureClient IF EXISTS
6752 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
6753 DROP VIEW Factures IF EXISTS
6754 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
6755 DISCONNECT
6756 /*C376*/SET SCHEMA B
6757 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
6758 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
6759 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
6760 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
6761 DROP PROCEDURE insertFactureClient IF EXISTS
6762 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
6763 DROP VIEW Factures IF EXISTS
6764 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
6765 DISCONNECT
6766 /*C377*/SET SCHEMA B
6767 DROP SCHEMA B CASCADE
6768 DISCONNECT
6769 /*C378*/SET SCHEMA B
6770 SET DATABASE COLLATION "French"
6771 SET DATABASE DEFAULT TABLE TYPE CACHED
6772 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
6773 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
6774 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
6775 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
6776 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
6777 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
6778 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
6779 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
6780 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
6781 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
6782 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
6783 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
6784 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
6785 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
6786 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
6787 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
6788 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
6789 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
6790 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
6791 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
6792 DISCONNECT
6793 /*C379*/SET SCHEMA B
6794 SET SCHEMA B
6795 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
6796 COMMIT
6797 INSERT INTO "Lieu" VALUES(1,'Gentioux')
6798 COMMIT
6799 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
6800 COMMIT
6801 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
6802 COMMIT
6803 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
6804 COMMIT
6805 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
6806 COMMIT
6807 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
6808 COMMIT
6809 INSERT INTO "Lieu" VALUES(7,'Tarnac')
6810 COMMIT
6811 INSERT INTO "Lieu" VALUES(8,'Felletin')
6812 COMMIT
6813 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
6814 COMMIT
6815 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
6816 COMMIT
6817 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
6818 COMMIT
6819 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
6820 COMMIT
6821 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
6822 COMMIT
6823 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
6824 COMMIT
6825 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
6826 COMMIT
6827 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
6828 COMMIT
6829 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
6830 COMMIT
6831 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
6832 COMMIT
6833 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
6834 COMMIT
6835 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
6836 COMMIT
6837 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
6838 COMMIT
6839 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
6840 COMMIT
6841 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
6842 COMMIT
6843 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
6844 COMMIT
6845 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
6846 COMMIT
6847 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
6848 COMMIT
6849 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
6850 COMMIT
6851 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
6852 COMMIT
6853 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
6854 COMMIT
6855 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
6856 COMMIT
6857 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
6858 COMMIT
6859 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
6860 COMMIT
6861 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
6862 COMMIT
6863 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
6864 COMMIT
6865 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
6866 COMMIT
6867 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
6868 COMMIT
6869 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
6870 COMMIT
6871 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
6872 COMMIT
6873 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
6874 COMMIT
6875 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
6876 COMMIT
6877 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
6878 COMMIT
6879 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
6880 COMMIT
6881 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
6882 COMMIT
6883 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
6884 COMMIT
6885 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
6886 COMMIT
6887 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
6888 COMMIT
6889 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
6890 COMMIT
6891 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
6892 COMMIT
6893 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
6894 COMMIT
6895 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
6896 COMMIT
6897 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
6898 COMMIT
6899 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
6900 COMMIT
6901 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
6902 COMMIT
6903 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
6904 COMMIT
6905 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
6906 COMMIT
6907 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
6908 COMMIT
6909 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
6910 COMMIT
6911 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
6912 COMMIT
6913 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
6914 COMMIT
6915 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
6916 COMMIT
6917 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
6918 COMMIT
6919 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
6920 COMMIT
6921 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
6922 COMMIT
6923 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
6924 COMMIT
6925 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
6926 COMMIT
6927 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
6928 COMMIT
6929 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
6930 COMMIT
6931 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
6932 COMMIT
6933 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
6934 COMMIT
6935 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
6936 COMMIT
6937 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
6938 COMMIT
6939 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
6940 COMMIT
6941 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
6942 COMMIT
6943 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
6944 COMMIT
6945 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
6946 COMMIT
6947 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
6948 COMMIT
6949 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
6950 COMMIT
6951 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
6952 COMMIT
6953 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
6954 COMMIT
6955 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
6956 COMMIT
6957 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
6958 COMMIT
6959 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
6960 COMMIT
6961 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
6962 COMMIT
6963 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
6964 COMMIT
6965 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
6966 COMMIT
6967 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
6968 COMMIT
6969 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
6970 COMMIT
6971 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
6972 COMMIT
6973 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
6974 COMMIT
6975 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
6976 COMMIT
6977 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
6978 COMMIT
6979 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
6980 COMMIT
6981 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
6982 COMMIT
6983 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
6984 COMMIT
6985 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
6986 COMMIT
6987 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
6988 COMMIT
6989 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
6990 COMMIT
6991 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
6992 COMMIT
6993 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
6994 COMMIT
6995 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
6996 COMMIT
6997 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
6998 COMMIT
6999 DISCONNECT
7000 /*C380*/SET SCHEMA B
7001 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
7002 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
7003 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
7004 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
7005 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
7006 INSERT INTO "Vente" VALUES(0,10,1.000,0)
7007 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
7008 INSERT INTO "Vente" VALUES(1,14,2.000,1)
7009 INSERT INTO "Vente" VALUES(2,11,1.000,0)
7010 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
7011 INSERT INTO "Vente" VALUES(3,16,4.000,2)
7012 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
7013 INSERT INTO "Vente" VALUES(4,10,1.000,3)
7014 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
7015 INSERT INTO "Vente" VALUES(5,14,2.000,4)
7016 INSERT INTO "Vente" VALUES(6,11,1.000,3)
7017 COMMIT
7018 DROP PROCEDURE insertFactureClient IF EXISTS
7019 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
7020 INSERT INTO "Facture" VALUES(0,'2025-04-29')
7021 DELETE FROM "Panier" WHERE ID=0
7022 DELETE FROM "Panier" WHERE ID=3
7023 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
7024 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
7025 COMMIT
7026 INSERT INTO "Facture" VALUES(1,'2025-04-29')
7027 DELETE FROM "Panier" WHERE ID=1
7028 DELETE FROM "Panier" WHERE ID=4
7029 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
7030 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
7031 COMMIT
7032 INSERT INTO "Facture" VALUES(2,'2025-04-29')
7033 DELETE FROM "Panier" WHERE ID=2
7034 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
7035 COMMIT
7036 DROP VIEW Factures IF EXISTS
7037 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
7038 DISCONNECT
7039 /*C381*/SET SCHEMA B
7040 DROP SCHEMA B CASCADE
7041 DISCONNECT
7042 /*C382*/SET SCHEMA B
7043 SET DATABASE COLLATION "French"
7044 SET DATABASE DEFAULT TABLE TYPE CACHED
7045 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
7046 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
7047 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
7048 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
7049 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
7050 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
7051 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
7052 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
7053 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
7054 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
7055 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
7056 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
7057 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
7058 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
7059 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
7060 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
7061 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
7062 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
7063 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
7064 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
7065 DISCONNECT
7066 /*C383*/SET SCHEMA B
7067 SET SCHEMA B
7068 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
7069 COMMIT
7070 INSERT INTO "Lieu" VALUES(1,'Gentioux')
7071 COMMIT
7072 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
7073 COMMIT
7074 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
7075 COMMIT
7076 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
7077 COMMIT
7078 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
7079 COMMIT
7080 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
7081 COMMIT
7082 INSERT INTO "Lieu" VALUES(7,'Tarnac')
7083 COMMIT
7084 INSERT INTO "Lieu" VALUES(8,'Felletin')
7085 COMMIT
7086 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
7087 COMMIT
7088 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
7089 COMMIT
7090 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
7091 COMMIT
7092 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
7093 COMMIT
7094 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
7095 COMMIT
7096 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
7097 COMMIT
7098 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
7099 COMMIT
7100 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
7101 COMMIT
7102 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
7103 COMMIT
7104 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
7105 COMMIT
7106 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
7107 COMMIT
7108 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
7109 COMMIT
7110 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
7111 COMMIT
7112 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
7113 COMMIT
7114 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
7115 COMMIT
7116 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
7117 COMMIT
7118 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
7119 COMMIT
7120 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
7121 COMMIT
7122 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
7123 COMMIT
7124 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
7125 COMMIT
7126 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
7127 COMMIT
7128 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
7129 COMMIT
7130 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
7131 COMMIT
7132 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
7133 COMMIT
7134 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
7135 COMMIT
7136 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
7137 COMMIT
7138 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
7139 COMMIT
7140 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
7141 COMMIT
7142 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
7143 COMMIT
7144 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
7145 COMMIT
7146 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
7147 COMMIT
7148 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
7149 COMMIT
7150 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
7151 COMMIT
7152 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
7153 COMMIT
7154 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
7155 COMMIT
7156 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
7157 COMMIT
7158 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
7159 COMMIT
7160 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
7161 COMMIT
7162 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
7163 COMMIT
7164 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
7165 COMMIT
7166 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
7167 COMMIT
7168 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
7169 COMMIT
7170 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
7171 COMMIT
7172 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
7173 COMMIT
7174 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
7175 COMMIT
7176 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
7177 COMMIT
7178 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
7179 COMMIT
7180 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
7181 COMMIT
7182 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
7183 COMMIT
7184 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
7185 COMMIT
7186 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
7187 COMMIT
7188 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
7189 COMMIT
7190 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
7191 COMMIT
7192 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
7193 COMMIT
7194 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
7195 COMMIT
7196 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
7197 COMMIT
7198 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
7199 COMMIT
7200 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
7201 COMMIT
7202 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
7203 COMMIT
7204 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
7205 COMMIT
7206 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
7207 COMMIT
7208 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
7209 COMMIT
7210 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
7211 COMMIT
7212 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
7213 COMMIT
7214 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
7215 COMMIT
7216 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
7217 COMMIT
7218 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
7219 COMMIT
7220 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
7221 COMMIT
7222 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
7223 COMMIT
7224 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
7225 COMMIT
7226 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
7227 COMMIT
7228 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
7229 COMMIT
7230 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
7231 COMMIT
7232 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
7233 COMMIT
7234 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
7235 COMMIT
7236 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
7237 COMMIT
7238 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
7239 COMMIT
7240 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
7241 COMMIT
7242 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
7243 COMMIT
7244 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
7245 COMMIT
7246 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
7247 COMMIT
7248 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
7249 COMMIT
7250 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
7251 COMMIT
7252 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
7253 COMMIT
7254 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
7255 COMMIT
7256 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
7257 COMMIT
7258 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
7259 COMMIT
7260 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
7261 COMMIT
7262 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
7263 COMMIT
7264 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
7265 COMMIT
7266 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
7267 COMMIT
7268 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
7269 COMMIT
7270 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
7271 COMMIT
7272 DISCONNECT
7273 /*C384*/SET SCHEMA B
7274 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
7275 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
7276 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
7277 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
7278 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
7279 INSERT INTO "Vente" VALUES(0,10,1.000,0)
7280 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
7281 INSERT INTO "Vente" VALUES(1,14,2.000,1)
7282 INSERT INTO "Vente" VALUES(2,11,1.000,0)
7283 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
7284 INSERT INTO "Vente" VALUES(3,16,4.000,2)
7285 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
7286 INSERT INTO "Vente" VALUES(4,10,1.000,3)
7287 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
7288 INSERT INTO "Vente" VALUES(5,14,2.000,4)
7289 INSERT INTO "Vente" VALUES(6,11,1.000,3)
7290 COMMIT
7291 DROP PROCEDURE insertFactureClient IF EXISTS
7292 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
7293 INSERT INTO "Facture" VALUES(0,'2025-04-29')
7294 DELETE FROM "Panier" WHERE ID=0
7295 DELETE FROM "Panier" WHERE ID=3
7296 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
7297 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
7298 COMMIT
7299 INSERT INTO "Facture" VALUES(1,'2025-04-29')
7300 DELETE FROM "Panier" WHERE ID=1
7301 DELETE FROM "Panier" WHERE ID=4
7302 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
7303 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
7304 COMMIT
7305 INSERT INTO "Facture" VALUES(2,'2025-04-29')
7306 DELETE FROM "Panier" WHERE ID=2
7307 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
7308 COMMIT
7309 DROP VIEW Factures IF EXISTS
7310 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
7311 DISCONNECT
7312 /*C385*/SET SCHEMA B
7313 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
7314 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
7315 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
7316 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
7317 DROP PROCEDURE insertFactureClient IF EXISTS
7318 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
7319 DROP VIEW Factures IF EXISTS
7320 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
7321 DISCONNECT
7322 /*C386*/SET SCHEMA B
7323 SET SCHEMA B
7324 DISCONNECT
7325 /*C387*/SET SCHEMA B
7326 DROP SCHEMA B CASCADE
7327 DISCONNECT
7328 /*C388*/SET SCHEMA B
7329 SET DATABASE COLLATION "French"
7330 SET DATABASE DEFAULT TABLE TYPE CACHED
7331 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
7332 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
7333 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
7334 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
7335 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
7336 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
7337 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
7338 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
7339 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
7340 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
7341 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
7342 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
7343 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
7344 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
7345 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
7346 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
7347 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
7348 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
7349 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
7350 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
7351 DISCONNECT
7352 /*C389*/SET SCHEMA B
7353 SET SCHEMA B
7354 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
7355 COMMIT
7356 INSERT INTO "Lieu" VALUES(1,'Gentioux')
7357 COMMIT
7358 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
7359 COMMIT
7360 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
7361 COMMIT
7362 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
7363 COMMIT
7364 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
7365 COMMIT
7366 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
7367 COMMIT
7368 INSERT INTO "Lieu" VALUES(7,'Tarnac')
7369 COMMIT
7370 INSERT INTO "Lieu" VALUES(8,'Felletin')
7371 COMMIT
7372 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
7373 COMMIT
7374 INSERT INTO "Facture" VALUES(0,'2025-04-29')
7375 COMMIT
7376 INSERT INTO "Facture" VALUES(1,'2025-04-29')
7377 COMMIT
7378 INSERT INTO "Facture" VALUES(2,'2025-04-29')
7379 COMMIT
7380 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
7381 COMMIT
7382 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
7383 COMMIT
7384 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
7385 COMMIT
7386 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
7387 COMMIT
7388 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
7389 COMMIT
7390 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
7391 COMMIT
7392 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
7393 COMMIT
7394 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
7395 COMMIT
7396 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
7397 COMMIT
7398 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
7399 COMMIT
7400 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
7401 COMMIT
7402 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
7403 COMMIT
7404 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
7405 COMMIT
7406 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
7407 COMMIT
7408 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
7409 COMMIT
7410 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
7411 COMMIT
7412 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
7413 COMMIT
7414 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
7415 COMMIT
7416 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
7417 COMMIT
7418 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
7419 COMMIT
7420 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
7421 COMMIT
7422 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
7423 COMMIT
7424 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
7425 COMMIT
7426 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
7427 COMMIT
7428 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
7429 COMMIT
7430 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
7431 COMMIT
7432 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
7433 COMMIT
7434 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
7435 COMMIT
7436 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
7437 COMMIT
7438 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
7439 COMMIT
7440 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
7441 COMMIT
7442 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
7443 COMMIT
7444 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
7445 COMMIT
7446 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
7447 COMMIT
7448 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
7449 COMMIT
7450 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
7451 COMMIT
7452 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
7453 COMMIT
7454 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
7455 COMMIT
7456 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
7457 COMMIT
7458 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
7459 COMMIT
7460 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
7461 COMMIT
7462 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
7463 COMMIT
7464 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
7465 COMMIT
7466 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
7467 COMMIT
7468 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
7469 COMMIT
7470 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
7471 COMMIT
7472 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
7473 COMMIT
7474 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
7475 COMMIT
7476 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
7477 COMMIT
7478 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
7479 COMMIT
7480 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
7481 COMMIT
7482 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
7483 COMMIT
7484 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
7485 COMMIT
7486 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
7487 COMMIT
7488 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
7489 COMMIT
7490 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
7491 COMMIT
7492 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
7493 COMMIT
7494 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
7495 COMMIT
7496 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
7497 COMMIT
7498 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
7499 COMMIT
7500 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
7501 COMMIT
7502 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
7503 COMMIT
7504 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
7505 COMMIT
7506 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
7507 COMMIT
7508 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
7509 COMMIT
7510 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
7511 COMMIT
7512 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
7513 COMMIT
7514 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
7515 COMMIT
7516 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
7517 COMMIT
7518 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
7519 COMMIT
7520 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
7521 COMMIT
7522 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
7523 COMMIT
7524 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
7525 COMMIT
7526 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
7527 COMMIT
7528 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
7529 COMMIT
7530 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
7531 COMMIT
7532 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
7533 COMMIT
7534 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
7535 COMMIT
7536 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
7537 COMMIT
7538 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
7539 COMMIT
7540 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
7541 COMMIT
7542 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
7543 COMMIT
7544 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
7545 COMMIT
7546 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
7547 COMMIT
7548 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
7549 COMMIT
7550 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
7551 COMMIT
7552 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
7553 COMMIT
7554 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
7555 COMMIT
7556 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
7557 COMMIT
7558 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
7559 COMMIT
7560 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
7561 COMMIT
7562 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
7563 COMMIT
7564 DISCONNECT
7565 /*C390*/SET SCHEMA B
7566 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
7567 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
7568 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
7569 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
7570 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
7571 INSERT INTO "Vente" VALUES(0,10,1.000,0)
7572 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
7573 INSERT INTO "Vente" VALUES(1,14,2.000,1)
7574 INSERT INTO "Vente" VALUES(2,11,1.000,0)
7575 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
7576 INSERT INTO "Vente" VALUES(3,16,4.000,2)
7577 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
7578 INSERT INTO "Vente" VALUES(4,10,1.000,3)
7579 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
7580 INSERT INTO "Vente" VALUES(5,14,2.000,4)
7581 INSERT INTO "Vente" VALUES(6,11,1.000,3)
7582 COMMIT
7583 DROP PROCEDURE insertFactureClient IF EXISTS
7584 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
7585 INSERT INTO "Facture" VALUES(3,'2025-04-29')
7586 DELETE FROM "Panier" WHERE ID=0
7587 DELETE FROM "Panier" WHERE ID=3
7588 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,3)
7589 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,3)
7590 COMMIT
7591 INSERT INTO "Facture" VALUES(4,'2025-04-29')
7592 DELETE FROM "Panier" WHERE ID=1
7593 DELETE FROM "Panier" WHERE ID=4
7594 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,4)
7595 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,4)
7596 COMMIT
7597 INSERT INTO "Facture" VALUES(5,'2025-04-29')
7598 DELETE FROM "Panier" WHERE ID=2
7599 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,5)
7600 COMMIT
7601 DROP VIEW Factures IF EXISTS
7602 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
7603 DISCONNECT
7604 /*C391*/SET SCHEMA B
7605 DROP SCHEMA B CASCADE
7606 DISCONNECT
7607 /*C392*/SET SCHEMA B
7608 SET DATABASE COLLATION "French"
7609 SET DATABASE DEFAULT TABLE TYPE CACHED
7610 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
7611 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
7612 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
7613 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
7614 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
7615 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
7616 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
7617 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
7618 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
7619 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
7620 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
7621 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
7622 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
7623 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
7624 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
7625 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
7626 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
7627 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
7628 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
7629 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
7630 DISCONNECT
7631 /*C393*/SET SCHEMA B
7632 SET SCHEMA B
7633 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
7634 COMMIT
7635 INSERT INTO "Lieu" VALUES(1,'Gentioux')
7636 COMMIT
7637 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
7638 COMMIT
7639 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
7640 COMMIT
7641 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
7642 COMMIT
7643 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
7644 COMMIT
7645 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
7646 COMMIT
7647 INSERT INTO "Lieu" VALUES(7,'Tarnac')
7648 COMMIT
7649 INSERT INTO "Lieu" VALUES(8,'Felletin')
7650 COMMIT
7651 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
7652 COMMIT
7653 INSERT INTO "Facture" VALUES(0,'2025-04-29')
7654 COMMIT
7655 INSERT INTO "Facture" VALUES(1,'2025-04-29')
7656 COMMIT
7657 INSERT INTO "Facture" VALUES(2,'2025-04-29')
7658 COMMIT
7659 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
7660 COMMIT
7661 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
7662 COMMIT
7663 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
7664 COMMIT
7665 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
7666 COMMIT
7667 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
7668 COMMIT
7669 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
7670 COMMIT
7671 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
7672 COMMIT
7673 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
7674 COMMIT
7675 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
7676 COMMIT
7677 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
7678 COMMIT
7679 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
7680 COMMIT
7681 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
7682 COMMIT
7683 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
7684 COMMIT
7685 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
7686 COMMIT
7687 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
7688 COMMIT
7689 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
7690 COMMIT
7691 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
7692 COMMIT
7693 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
7694 COMMIT
7695 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
7696 COMMIT
7697 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
7698 COMMIT
7699 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
7700 COMMIT
7701 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
7702 COMMIT
7703 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
7704 COMMIT
7705 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
7706 COMMIT
7707 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
7708 COMMIT
7709 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
7710 COMMIT
7711 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
7712 COMMIT
7713 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
7714 COMMIT
7715 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
7716 COMMIT
7717 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
7718 COMMIT
7719 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
7720 COMMIT
7721 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
7722 COMMIT
7723 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
7724 COMMIT
7725 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
7726 COMMIT
7727 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
7728 COMMIT
7729 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
7730 COMMIT
7731 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
7732 COMMIT
7733 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
7734 COMMIT
7735 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
7736 COMMIT
7737 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
7738 COMMIT
7739 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
7740 COMMIT
7741 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
7742 COMMIT
7743 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
7744 COMMIT
7745 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
7746 COMMIT
7747 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
7748 COMMIT
7749 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
7750 COMMIT
7751 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
7752 COMMIT
7753 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
7754 COMMIT
7755 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
7756 COMMIT
7757 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
7758 COMMIT
7759 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
7760 COMMIT
7761 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
7762 COMMIT
7763 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
7764 COMMIT
7765 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
7766 COMMIT
7767 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
7768 COMMIT
7769 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
7770 COMMIT
7771 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
7772 COMMIT
7773 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
7774 COMMIT
7775 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
7776 COMMIT
7777 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
7778 COMMIT
7779 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
7780 COMMIT
7781 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
7782 COMMIT
7783 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
7784 COMMIT
7785 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
7786 COMMIT
7787 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
7788 COMMIT
7789 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
7790 COMMIT
7791 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
7792 COMMIT
7793 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
7794 COMMIT
7795 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
7796 COMMIT
7797 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
7798 COMMIT
7799 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
7800 COMMIT
7801 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
7802 COMMIT
7803 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
7804 COMMIT
7805 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
7806 COMMIT
7807 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
7808 COMMIT
7809 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
7810 COMMIT
7811 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
7812 COMMIT
7813 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
7814 COMMIT
7815 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
7816 COMMIT
7817 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
7818 COMMIT
7819 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
7820 COMMIT
7821 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
7822 COMMIT
7823 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
7824 COMMIT
7825 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
7826 COMMIT
7827 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
7828 COMMIT
7829 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
7830 COMMIT
7831 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
7832 COMMIT
7833 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
7834 COMMIT
7835 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
7836 COMMIT
7837 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
7838 COMMIT
7839 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
7840 COMMIT
7841 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
7842 COMMIT
7843 DISCONNECT
7844 /*C394*/SET SCHEMA B
7845 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
7846 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
7847 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
7848 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
7849 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
7850 INSERT INTO "Vente" VALUES(0,10,1.000,0)
7851 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
7852 INSERT INTO "Vente" VALUES(1,14,2.000,1)
7853 INSERT INTO "Vente" VALUES(2,11,1.000,0)
7854 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
7855 INSERT INTO "Vente" VALUES(3,16,4.000,2)
7856 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
7857 INSERT INTO "Vente" VALUES(4,10,1.000,3)
7858 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
7859 INSERT INTO "Vente" VALUES(5,14,2.000,4)
7860 INSERT INTO "Vente" VALUES(6,11,1.000,3)
7861 COMMIT
7862 DROP PROCEDURE insertFactureClient IF EXISTS
7863 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
7864 INSERT INTO "Facture" VALUES(3,'2025-04-29')
7865 DELETE FROM "Panier" WHERE ID=0
7866 DELETE FROM "Panier" WHERE ID=3
7867 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,3)
7868 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,3)
7869 COMMIT
7870 INSERT INTO "Facture" VALUES(4,'2025-04-29')
7871 DELETE FROM "Panier" WHERE ID=1
7872 DELETE FROM "Panier" WHERE ID=4
7873 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,4)
7874 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,4)
7875 COMMIT
7876 INSERT INTO "Facture" VALUES(5,'2025-04-29')
7877 DELETE FROM "Panier" WHERE ID=2
7878 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,5)
7879 COMMIT
7880 DROP VIEW Factures IF EXISTS
7881 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
7882 DISCONNECT
7883 /*C395*/SET SCHEMA B
7884 DROP SCHEMA B CASCADE
7885 DISCONNECT
7886 /*C396*/SET SCHEMA B
7887 SET DATABASE COLLATION "French"
7888 SET DATABASE DEFAULT TABLE TYPE CACHED
7889 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
7890 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
7891 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
7892 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
7893 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
7894 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
7895 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
7896 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
7897 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
7898 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
7899 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
7900 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
7901 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
7902 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
7903 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
7904 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
7905 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
7906 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
7907 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
7908 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
7909 DISCONNECT
7910 /*C397*/SET SCHEMA B
7911 SET SCHEMA B
7912 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
7913 COMMIT
7914 INSERT INTO "Lieu" VALUES(1,'Gentioux')
7915 COMMIT
7916 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
7917 COMMIT
7918 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
7919 COMMIT
7920 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
7921 COMMIT
7922 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
7923 COMMIT
7924 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
7925 COMMIT
7926 INSERT INTO "Lieu" VALUES(7,'Tarnac')
7927 COMMIT
7928 INSERT INTO "Lieu" VALUES(8,'Felletin')
7929 COMMIT
7930 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
7931 COMMIT
7932 INSERT INTO "Facture" VALUES(0,'2025-04-29')
7933 COMMIT
7934 INSERT INTO "Facture" VALUES(1,'2025-04-29')
7935 COMMIT
7936 INSERT INTO "Facture" VALUES(2,'2025-04-29')
7937 COMMIT
7938 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
7939 COMMIT
7940 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
7941 COMMIT
7942 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
7943 COMMIT
7944 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
7945 COMMIT
7946 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
7947 COMMIT
7948 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
7949 COMMIT
7950 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
7951 COMMIT
7952 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
7953 COMMIT
7954 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
7955 COMMIT
7956 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
7957 COMMIT
7958 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
7959 COMMIT
7960 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
7961 COMMIT
7962 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
7963 COMMIT
7964 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
7965 COMMIT
7966 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
7967 COMMIT
7968 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
7969 COMMIT
7970 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
7971 COMMIT
7972 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
7973 COMMIT
7974 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
7975 COMMIT
7976 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
7977 COMMIT
7978 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
7979 COMMIT
7980 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
7981 COMMIT
7982 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
7983 COMMIT
7984 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
7985 COMMIT
7986 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
7987 COMMIT
7988 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
7989 COMMIT
7990 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
7991 COMMIT
7992 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
7993 COMMIT
7994 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
7995 COMMIT
7996 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
7997 COMMIT
7998 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
7999 COMMIT
8000 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
8001 COMMIT
8002 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
8003 COMMIT
8004 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
8005 COMMIT
8006 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
8007 COMMIT
8008 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
8009 COMMIT
8010 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
8011 COMMIT
8012 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
8013 COMMIT
8014 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
8015 COMMIT
8016 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
8017 COMMIT
8018 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
8019 COMMIT
8020 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
8021 COMMIT
8022 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
8023 COMMIT
8024 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
8025 COMMIT
8026 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
8027 COMMIT
8028 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
8029 COMMIT
8030 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
8031 COMMIT
8032 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
8033 COMMIT
8034 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
8035 COMMIT
8036 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
8037 COMMIT
8038 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
8039 COMMIT
8040 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
8041 COMMIT
8042 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
8043 COMMIT
8044 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
8045 COMMIT
8046 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
8047 COMMIT
8048 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
8049 COMMIT
8050 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
8051 COMMIT
8052 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
8053 COMMIT
8054 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
8055 COMMIT
8056 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
8057 COMMIT
8058 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
8059 COMMIT
8060 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
8061 COMMIT
8062 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
8063 COMMIT
8064 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
8065 COMMIT
8066 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
8067 COMMIT
8068 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
8069 COMMIT
8070 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
8071 COMMIT
8072 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
8073 COMMIT
8074 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
8075 COMMIT
8076 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
8077 COMMIT
8078 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
8079 COMMIT
8080 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
8081 COMMIT
8082 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
8083 COMMIT
8084 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
8085 COMMIT
8086 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
8087 COMMIT
8088 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
8089 COMMIT
8090 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
8091 COMMIT
8092 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
8093 COMMIT
8094 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
8095 COMMIT
8096 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
8097 COMMIT
8098 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
8099 COMMIT
8100 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
8101 COMMIT
8102 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
8103 COMMIT
8104 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
8105 COMMIT
8106 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
8107 COMMIT
8108 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
8109 COMMIT
8110 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
8111 COMMIT
8112 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
8113 COMMIT
8114 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
8115 COMMIT
8116 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
8117 COMMIT
8118 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
8119 COMMIT
8120 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
8121 COMMIT
8122 DISCONNECT
8123 /*C398*/SET SCHEMA B
8124 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8125 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8126 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8127 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8128 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
8129 INSERT INTO "Vente" VALUES(1,10,1.000,0)
8130 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
8131 INSERT INTO "Vente" VALUES(2,14,2.000,1)
8132 INSERT INTO "Vente" VALUES(3,11,1.000,0)
8133 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
8134 INSERT INTO "Vente" VALUES(4,16,4.000,2)
8135 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
8136 INSERT INTO "Vente" VALUES(5,10,1.000,3)
8137 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
8138 INSERT INTO "Vente" VALUES(6,14,2.000,4)
8139 INSERT INTO "Vente" VALUES(7,11,1.000,3)
8140 COMMIT
8141 DROP PROCEDURE insertFactureClient IF EXISTS
8142 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8143 INSERT INTO "Facture" VALUES(3,'2025-04-29')
8144 DELETE FROM "Panier" WHERE ID=0
8145 DELETE FROM "Panier" WHERE ID=3
8146 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,3)
8147 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,3)
8148 COMMIT
8149 INSERT INTO "Facture" VALUES(4,'2025-04-29')
8150 DELETE FROM "Panier" WHERE ID=1
8151 DELETE FROM "Panier" WHERE ID=4
8152 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,4)
8153 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,4)
8154 COMMIT
8155 INSERT INTO "Facture" VALUES(5,'2025-04-29')
8156 DELETE FROM "Panier" WHERE ID=2
8157 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,5)
8158 COMMIT
8159 DROP VIEW Factures IF EXISTS
8160 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8161 DISCONNECT
8162 /*C399*/SET SCHEMA B
8163 DROP SCHEMA B CASCADE
8164 DISCONNECT
8165 /*C400*/SET SCHEMA B
8166 SET DATABASE COLLATION "French"
8167 SET DATABASE DEFAULT TABLE TYPE CACHED
8168 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
8169 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
8170 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
8171 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
8172 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
8173 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
8174 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
8175 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
8176 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
8177 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
8178 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
8179 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
8180 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
8181 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
8182 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
8183 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
8184 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
8185 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
8186 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
8187 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
8188 DISCONNECT
8189 /*C401*/SET SCHEMA B
8190 SET SCHEMA B
8191 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
8192 COMMIT
8193 INSERT INTO "Lieu" VALUES(1,'Gentioux')
8194 COMMIT
8195 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
8196 COMMIT
8197 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
8198 COMMIT
8199 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
8200 COMMIT
8201 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
8202 COMMIT
8203 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
8204 COMMIT
8205 INSERT INTO "Lieu" VALUES(7,'Tarnac')
8206 COMMIT
8207 INSERT INTO "Lieu" VALUES(8,'Felletin')
8208 COMMIT
8209 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
8210 COMMIT
8211 INSERT INTO "Facture" VALUES(0,'2025-04-29')
8212 COMMIT
8213 INSERT INTO "Facture" VALUES(1,'2025-04-29')
8214 COMMIT
8215 INSERT INTO "Facture" VALUES(2,'2025-04-29')
8216 COMMIT
8217 DISCONNECT
8218 /*C402*/SET SCHEMA B
8219 DROP SCHEMA B CASCADE
8220 DISCONNECT
8221 /*C403*/SET SCHEMA B
8222 SET DATABASE COLLATION "French"
8223 SET DATABASE DEFAULT TABLE TYPE CACHED
8224 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
8225 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
8226 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
8227 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
8228 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
8229 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
8230 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
8231 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
8232 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
8233 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
8234 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
8235 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
8236 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
8237 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
8238 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
8239 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
8240 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
8241 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
8242 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
8243 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
8244 DISCONNECT
8245 /*C404*/SET SCHEMA B
8246 SET SCHEMA B
8247 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
8248 COMMIT
8249 INSERT INTO "Lieu" VALUES(1,'Gentioux')
8250 COMMIT
8251 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
8252 COMMIT
8253 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
8254 COMMIT
8255 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
8256 COMMIT
8257 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
8258 COMMIT
8259 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
8260 COMMIT
8261 INSERT INTO "Lieu" VALUES(7,'Tarnac')
8262 COMMIT
8263 INSERT INTO "Lieu" VALUES(8,'Felletin')
8264 COMMIT
8265 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
8266 COMMIT
8267 INSERT INTO "Facture" VALUES(0,'2025-04-29')
8268 COMMIT
8269 INSERT INTO "Facture" VALUES(1,'2025-04-29')
8270 COMMIT
8271 INSERT INTO "Facture" VALUES(2,'2025-04-29')
8272 COMMIT
8273 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
8274 COMMIT
8275 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
8276 COMMIT
8277 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
8278 COMMIT
8279 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
8280 COMMIT
8281 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
8282 COMMIT
8283 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
8284 COMMIT
8285 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
8286 COMMIT
8287 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
8288 COMMIT
8289 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
8290 COMMIT
8291 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
8292 COMMIT
8293 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
8294 COMMIT
8295 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
8296 COMMIT
8297 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
8298 COMMIT
8299 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
8300 COMMIT
8301 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
8302 COMMIT
8303 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
8304 COMMIT
8305 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
8306 COMMIT
8307 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
8308 COMMIT
8309 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
8310 COMMIT
8311 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
8312 COMMIT
8313 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
8314 COMMIT
8315 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
8316 COMMIT
8317 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
8318 COMMIT
8319 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
8320 COMMIT
8321 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
8322 COMMIT
8323 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
8324 COMMIT
8325 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
8326 COMMIT
8327 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
8328 COMMIT
8329 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
8330 COMMIT
8331 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
8332 COMMIT
8333 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
8334 COMMIT
8335 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
8336 COMMIT
8337 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
8338 COMMIT
8339 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
8340 COMMIT
8341 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
8342 COMMIT
8343 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
8344 COMMIT
8345 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
8346 COMMIT
8347 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
8348 COMMIT
8349 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
8350 COMMIT
8351 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
8352 COMMIT
8353 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
8354 COMMIT
8355 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
8356 COMMIT
8357 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
8358 COMMIT
8359 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
8360 COMMIT
8361 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
8362 COMMIT
8363 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
8364 COMMIT
8365 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
8366 COMMIT
8367 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
8368 COMMIT
8369 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
8370 COMMIT
8371 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
8372 COMMIT
8373 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
8374 COMMIT
8375 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
8376 COMMIT
8377 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
8378 COMMIT
8379 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
8380 COMMIT
8381 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
8382 COMMIT
8383 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
8384 COMMIT
8385 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
8386 COMMIT
8387 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
8388 COMMIT
8389 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
8390 COMMIT
8391 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
8392 COMMIT
8393 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
8394 COMMIT
8395 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
8396 COMMIT
8397 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
8398 COMMIT
8399 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
8400 COMMIT
8401 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
8402 COMMIT
8403 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
8404 COMMIT
8405 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
8406 COMMIT
8407 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
8408 COMMIT
8409 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
8410 COMMIT
8411 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
8412 COMMIT
8413 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
8414 COMMIT
8415 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
8416 COMMIT
8417 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
8418 COMMIT
8419 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
8420 COMMIT
8421 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
8422 COMMIT
8423 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
8424 COMMIT
8425 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
8426 COMMIT
8427 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
8428 COMMIT
8429 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
8430 COMMIT
8431 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
8432 COMMIT
8433 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
8434 COMMIT
8435 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
8436 COMMIT
8437 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
8438 COMMIT
8439 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
8440 COMMIT
8441 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
8442 COMMIT
8443 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
8444 COMMIT
8445 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
8446 COMMIT
8447 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
8448 COMMIT
8449 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
8450 COMMIT
8451 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
8452 COMMIT
8453 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
8454 COMMIT
8455 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
8456 COMMIT
8457 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
8458 COMMIT
8459 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
8460 COMMIT
8461 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
8462 COMMIT
8463 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
8464 COMMIT
8465 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
8466 COMMIT
8467 INSERT INTO "Vente" VALUES(0,10,1.000,0)
8468 COMMIT
8469 INSERT INTO "Vente" VALUES(1,14,2.000,1)
8470 COMMIT
8471 INSERT INTO "Vente" VALUES(2,11,3.000,0)
8472 COMMIT
8473 INSERT INTO "Vente" VALUES(3,16,4.000,2)
8474 COMMIT
8475 INSERT INTO "Vente" VALUES(4,10,1.000,3)
8476 COMMIT
8477 INSERT INTO "Vente" VALUES(5,14,2.000,4)
8478 COMMIT
8479 INSERT INTO "Vente" VALUES(6,11,1.000,3)
8480 COMMIT
8481 DISCONNECT
8482 /*C405*/SET SCHEMA B
8483 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8484 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8485 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8486 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8487 DROP PROCEDURE insertFactureClient IF EXISTS
8488 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8489 DROP VIEW Factures IF EXISTS
8490 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8491 DISCONNECT
8492 /*C406*/SET SCHEMA B
8493 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8494 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8495 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8496 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8497 DROP PROCEDURE insertFactureClient IF EXISTS
8498 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8499 DROP VIEW Factures IF EXISTS
8500 DISCONNECT
8501 /*C407*/SET SCHEMA B
8502 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8503 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8504 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8505 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8506 DROP PROCEDURE insertFactureClient IF EXISTS
8507 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8508 DROP VIEW Factures IF EXISTS
8509 DISCONNECT
8510 /*C408*/SET SCHEMA B
8511 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8512 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8513 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8514 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8515 DROP PROCEDURE insertFactureClient IF EXISTS
8516 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8517 DROP VIEW Factures IF EXISTS
8518 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8519 DISCONNECT
8520 /*C409*/SET SCHEMA B
8521 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8522 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8523 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8524 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8525 DROP PROCEDURE insertFactureClient IF EXISTS
8526 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8527 DROP VIEW Factures IF EXISTS
8528 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8529 DISCONNECT
8530 /*C410*/SET SCHEMA B
8531 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8532 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8533 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8534 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8535 DROP PROCEDURE insertFactureClient IF EXISTS
8536 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8537 DROP VIEW Factures IF EXISTS
8538 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8539 DISCONNECT
8540 /*C411*/SET SCHEMA B
8541 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8542 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8543 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8544 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8545 DROP PROCEDURE insertFactureClient IF EXISTS
8546 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8547 DROP VIEW Factures IF EXISTS
8548 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8549 DISCONNECT
8550 /*C412*/SET SCHEMA B
8551 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8552 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8553 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8554 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8555 DROP PROCEDURE insertFactureClient IF EXISTS
8556 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8557 DROP VIEW Factures IF EXISTS
8558 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8559 DISCONNECT
8560 /*C413*/SET SCHEMA B
8561 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8562 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8563 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8564 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8565 DROP PROCEDURE insertFactureClient IF EXISTS
8566 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8567 DROP VIEW Factures IF EXISTS
8568 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8569 DISCONNECT
8570 /*C414*/SET SCHEMA B
8571 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8572 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8573 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8574 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8575 DROP PROCEDURE insertFactureClient IF EXISTS
8576 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8577 DROP VIEW Factures IF EXISTS
8578 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8579 DISCONNECT
8580 /*C415*/SET SCHEMA B
8581 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8582 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8583 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8584 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8585 DROP PROCEDURE insertFactureClient IF EXISTS
8586 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8587 DROP VIEW Factures IF EXISTS
8588 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8589 DISCONNECT
8590 /*C416*/SET SCHEMA B
8591 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8592 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8593 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8594 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8595 DROP PROCEDURE insertFactureClient IF EXISTS
8596 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8597 DROP VIEW Factures IF EXISTS
8598 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8599 DISCONNECT
8600 /*C417*/SET SCHEMA B
8601 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8602 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8603 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8604 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8605 DROP PROCEDURE insertFactureClient IF EXISTS
8606 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8607 DROP VIEW Factures IF EXISTS
8608 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8609 DISCONNECT
8610 /*C418*/SET SCHEMA B
8611 DISCONNECT
8612 /*C419*/SET SCHEMA B
8613 DISCONNECT
8614 /*C420*/SET SCHEMA B
8615 DISCONNECT
8616 /*C421*/SET SCHEMA B
8617 DISCONNECT
8618 /*C422*/SET SCHEMA B
8619 DECLARE x DECIMAL ARRAY DEFAULT NULL;
8620 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8621 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8622 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8623 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8624 DROP PROCEDURE insertFactureClient IF EXISTS
8625 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8626 DROP VIEW Factures IF EXISTS
8627 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8628 DISCONNECT
8629 /*C423*/SET SCHEMA B
8630 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8631 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8632 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8633 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8634 DROP PROCEDURE insertFactureClient IF EXISTS
8635 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8636 DROP VIEW Factures IF EXISTS
8637 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8638 DECLARE x DECIMAL ARRAY DEFAULT NULL;
8639 DISCONNECT
8640 /*C424*/SET SCHEMA B
8641 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8642 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8643 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8644 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8645 DROP PROCEDURE insertFactureClient IF EXISTS
8646 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8647 DROP VIEW Factures IF EXISTS
8648 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8649 DISCONNECT
8650 /*C425*/SET SCHEMA B
8651 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8652 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8653 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8654 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8655 DROP PROCEDURE insertFactureClient IF EXISTS
8656 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8657 DROP VIEW Factures IF EXISTS
8658 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8659 DISCONNECT
8660 /*C426*/SET SCHEMA B
8661 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8662 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8663 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8664 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8665 DROP PROCEDURE insertFactureClient IF EXISTS
8666 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8667 DROP VIEW Factures IF EXISTS
8668 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8669 DISCONNECT
8670 /*C427*/SET SCHEMA B
8671 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8672 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8673 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8674 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8675 DROP PROCEDURE insertFactureClient IF EXISTS
8676 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8677 DROP VIEW Factures IF EXISTS
8678 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8679 DECLARE x DECIMAL ARRAY DEFAULT NULL;
8680 DISCONNECT
8681 /*C428*/SET SCHEMA B
8682 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8683 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8684 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8685 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8686 DROP PROCEDURE insertFactureClient IF EXISTS
8687 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8688 DROP VIEW Factures IF EXISTS
8689 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8690 DISCONNECT
8691 /*C429*/SET SCHEMA B
8692 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8693 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8694 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8695 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8696 DROP PROCEDURE insertFactureClient IF EXISTS
8697 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8698 DROP VIEW Factures IF EXISTS
8699 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8700 DISCONNECT
8701 /*C430*/SET SCHEMA B
8702 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8703 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8704 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8705 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8706 DROP PROCEDURE insertFactureClient IF EXISTS
8707 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8708 DROP VIEW Factures IF EXISTS
8709 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8710 DISCONNECT
8711 /*C431*/SET SCHEMA B
8712 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8713 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8714 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8715 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8716 DROP PROCEDURE insertFactureClient IF EXISTS
8717 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8718 DROP VIEW Factures IF EXISTS
8719 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8720 DROP TYPE DECIMAL_ARRAY IF EXISTS CASCADE
8721 CREATE TYPE DECIMAL_ARRAY AS DECIMAL ARRAY
8722 DISCONNECT
8723 /*C432*/SET SCHEMA B
8724 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8725 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8726 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8727 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8728 DROP PROCEDURE insertFactureClient IF EXISTS
8729 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8730 DROP VIEW Factures IF EXISTS
8731 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8732 DROP TYPE DECIMAL_ARRAY IF EXISTS CASCADE
8733 CREATE TYPE DECIMAL_ARRAY AS DECIMAL ARRAY
8734 DECLARE x DECIMAL_ARRAY DEFAULT NULL;
8735 DISCONNECT
8736 /*C433*/SET SCHEMA B
8737 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8738 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8739 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8740 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8741 DROP PROCEDURE insertFactureClient IF EXISTS
8742 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8743 DROP VIEW Factures IF EXISTS
8744 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8745 DISCONNECT
8746 /*C434*/SET SCHEMA B
8747 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8748 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8749 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8750 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8751 DROP PROCEDURE insertFactureClient IF EXISTS
8752 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8753 DROP VIEW Factures IF EXISTS
8754 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8755 DISCONNECT
8756 /*C435*/SET SCHEMA B
8757 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8758 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8759 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8760 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8761 DROP PROCEDURE insertFactureClient IF EXISTS
8762 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8763 DROP VIEW Factures IF EXISTS
8764 DISCONNECT
8765 /*C436*/SET SCHEMA B
8766 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8767 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8768 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8769 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8770 DROP PROCEDURE insertFactureClient IF EXISTS
8771 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8772 DROP VIEW Factures IF EXISTS
8773 DISCONNECT
8774 /*C437*/SET SCHEMA B
8775 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8776 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8777 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8778 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8779 DROP PROCEDURE insertFactureClient IF EXISTS
8780 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8781 DROP VIEW Factures IF EXISTS
8782 DISCONNECT
8783 /*C438*/SET SCHEMA B
8784 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8785 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8786 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8787 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8788 DROP PROCEDURE insertFactureClient IF EXISTS
8789 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8790 DROP VIEW Factures IF EXISTS
8791 DISCONNECT
8792 /*C439*/SET SCHEMA B
8793 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8794 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8795 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8796 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8797 DROP PROCEDURE insertFactureClient IF EXISTS
8798 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8799 DROP VIEW Factures IF EXISTS
8800 DISCONNECT
8801 /*C440*/SET SCHEMA B
8802 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8803 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8804 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8805 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8806 DROP PROCEDURE insertFactureClient IF EXISTS
8807 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8808 DROP VIEW Factures IF EXISTS
8809 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ARRAY_AGG\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8810 DISCONNECT
8811 /*C441*/SET SCHEMA B
8812 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8813 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8814 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8815 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8816 DROP PROCEDURE insertFactureClient IF EXISTS
8817 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8818 DROP VIEW Factures IF EXISTS
8819 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a GROUP_CONCAT\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9) as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8820 DISCONNECT
8821 /*C442*/SET SCHEMA B
8822 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8823 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8824 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8825 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8826 DROP PROCEDURE insertFactureClient IF EXISTS
8827 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8828 DROP VIEW Factures IF EXISTS
8829 DISCONNECT
8830 /*C443*/SET SCHEMA B
8831 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8832 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8833 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8834 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8835 DROP PROCEDURE insertFactureClient IF EXISTS
8836 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8837 DROP VIEW Factures IF EXISTS
8838 DISCONNECT
8839 /*C444*/SET SCHEMA B
8840 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8841 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8842 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8843 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8844 DROP PROCEDURE insertFactureClient IF EXISTS
8845 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8846 DROP VIEW Factures IF EXISTS
8847 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a GROUP_CONCAT\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID\u000a ORDER BY "Facture".ID\u000a
8848 DISCONNECT
8849 /*C445*/SET SCHEMA B
8850 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8851 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8852 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8853 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8854 DROP PROCEDURE insertFactureClient IF EXISTS
8855 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8856 DROP VIEW Factures IF EXISTS
8857 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a GROUP_CONCAT\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID, "Panier".date\u000a ORDER BY "Facture".ID\u000a
8858 DISCONNECT
8859 /*C446*/SET SCHEMA B
8860 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8861 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8862 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8863 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8864 DROP PROCEDURE insertFactureClient IF EXISTS
8865 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8866 DROP VIEW Factures IF EXISTS
8867 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a GROUP_CONCAT\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_total\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID, "Panier".date, "Produit".ID\u000a ORDER BY "Facture".ID\u000a
8868 DISCONNECT
8869 /*C447*/SET SCHEMA B
8870 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8871 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8872 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8873 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8874 DROP PROCEDURE insertFactureClient IF EXISTS
8875 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8876 DROP VIEW Factures IF EXISTS
8877 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a ANY_VALUE\u000a ("Facture".date) as date,\u000a ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a GROUP_CONCAT\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Panier".ID, "Panier".date, "Produit".ID\u000a ORDER BY "Facture".ID\u000a
8878 DISCONNECT
8879 /*C448*/SET SCHEMA B
8880 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8881 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8882 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8883 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8884 DROP PROCEDURE insertFactureClient IF EXISTS
8885 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8886 DROP VIEW Factures IF EXISTS
8887 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a GROUP_CONCAT\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY "Facture".ID, "Facture".date, "Client".ID, "Panier".ID, "Panier".date, "Produit".ID\u000a ORDER BY "Facture".ID\u000a
8888 DISCONNECT
8889 /*C449*/SET SCHEMA B
8890 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8891 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8892 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8893 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8894 DROP PROCEDURE insertFactureClient IF EXISTS
8895 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8896 DROP VIEW Factures IF EXISTS
8897 DISCONNECT
8898 /*C450*/SET SCHEMA B
8899 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8900 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8901 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8902 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8903 DROP PROCEDURE insertFactureClient IF EXISTS
8904 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8905 DROP VIEW Factures IF EXISTS
8906 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a ARRAY_AGG\u000a ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a GROUP_CONCAT\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a --, "Produit".ID\u000a ORDER BY "Facture".ID\u000a
8907 DISCONNECT
8908 /*C451*/SET SCHEMA B
8909 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8910 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8911 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8912 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8913 DROP PROCEDURE insertFactureClient IF EXISTS
8914 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8915 DROP VIEW Factures IF EXISTS
8916 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a GROUP_CONCAT\u000a ("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a GROUP BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a --, "Produit".ID\u000a ORDER BY "Facture".ID\u000a
8917 DISCONNECT
8918 /*C452*/SET SCHEMA B
8919 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8920 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8921 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8922 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8923 DROP PROCEDURE insertFactureClient IF EXISTS
8924 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8925 DROP VIEW Factures IF EXISTS
8926 DISCONNECT
8927 /*C453*/SET SCHEMA B
8928 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8929 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8930 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8931 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8932 DROP PROCEDURE insertFactureClient IF EXISTS
8933 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8934 DROP VIEW Factures IF EXISTS
8935 DISCONNECT
8936 /*C454*/SET SCHEMA B
8937 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8938 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8939 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8940 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8941 DROP PROCEDURE insertFactureClient IF EXISTS
8942 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8943 DROP VIEW Factures IF EXISTS
8944 DISCONNECT
8945 /*C455*/SET SCHEMA B
8946 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8947 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8948 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8949 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8950 DROP PROCEDURE insertFactureClient IF EXISTS
8951 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8952 DROP VIEW Factures IF EXISTS
8953 DISCONNECT
8954 /*C456*/SET SCHEMA B
8955 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8956 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8957 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8958 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8959 DROP PROCEDURE insertFactureClient IF EXISTS
8960 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8961 DROP VIEW Factures IF EXISTS
8962 DISCONNECT
8963 /*C457*/SET SCHEMA B
8964 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8965 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8966 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8967 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8968 DROP PROCEDURE insertFactureClient IF EXISTS
8969 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8970 DROP VIEW Factures IF EXISTS
8971 DISCONNECT
8972 /*C458*/SET SCHEMA B
8973 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8974 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8975 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8976 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8977 DROP PROCEDURE insertFactureClient IF EXISTS
8978 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8979 DROP VIEW Factures IF EXISTS
8980 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a ("Produit".ID) as produits\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a --, "Facture".date\u000a --, "Client".ID\u000a --, "Panier".ID\u000a --, "Panier".date\u000a --, "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
8981 DISCONNECT
8982 /*C459*/SET SCHEMA B
8983 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8984 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8985 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8986 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8987 DROP PROCEDURE insertFactureClient IF EXISTS
8988 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8989 DROP VIEW Factures IF EXISTS
8990 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a ("Produit".ID) as produits\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a --, "Client".ID\u000a --, "Panier".ID\u000a --, "Panier".date\u000a --, "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
8991 DISCONNECT
8992 /*C460*/SET SCHEMA B
8993 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
8994 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
8995 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
8996 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
8997 DROP PROCEDURE insertFactureClient IF EXISTS
8998 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
8999 DROP VIEW Factures IF EXISTS
9000 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a ("Produit".ID) as produits\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a --, "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9001 DISCONNECT
9002 /*C461*/SET SCHEMA B
9003 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9004 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9005 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9006 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9007 DROP PROCEDURE insertFactureClient IF EXISTS
9008 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9009 DROP VIEW Factures IF EXISTS
9010 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a ("Produit".ID) as produits\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9011 DISCONNECT
9012 /*C462*/SET SCHEMA B
9013 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9014 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9015 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9016 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9017 DROP PROCEDURE insertFactureClient IF EXISTS
9018 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9019 DROP VIEW Factures IF EXISTS
9020 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a ("Produit".ID) as produits,\u000a ("Vente".quantit\u00e9) as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9021 DISCONNECT
9022 /*C463*/SET SCHEMA B
9023 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9024 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9025 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9026 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9027 DROP PROCEDURE insertFactureClient IF EXISTS
9028 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9029 DROP VIEW Factures IF EXISTS
9030 CREATE VIEW Factures AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produits,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9031 DISCONNECT
9032 /*C464*/SET SCHEMA B
9033 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9034 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9035 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9036 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9037 DROP PROCEDURE insertFactureClient IF EXISTS
9038 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9039 DROP VIEW "Factures" IF EXISTS
9040 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produits,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9041 DISCONNECT
9042 /*C465*/SET SCHEMA B
9043 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9044 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9045 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9046 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9047 DROP PROCEDURE insertFactureClient IF EXISTS
9048 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9049 DROP VIEW "Factures" IF EXISTS
9050 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produits,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9051 DISCONNECT
9052 /*C466*/SET SCHEMA B
9053 SET SCHEMA B
9054 DISCONNECT
9055 /*C467*/SET SCHEMA B
9056 DROP SCHEMA B CASCADE
9057 DISCONNECT
9058 /*C468*/SET SCHEMA B
9059 SET DATABASE COLLATION "French"
9060 SET DATABASE DEFAULT TABLE TYPE CACHED
9061 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
9062 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
9063 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
9064 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
9065 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
9066 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
9067 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
9068 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
9069 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
9070 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
9071 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
9072 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
9073 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
9074 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
9075 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
9076 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
9077 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
9078 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
9079 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
9080 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
9081 DISCONNECT
9082 /*C469*/SET SCHEMA B
9083 SET SCHEMA B
9084 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
9085 COMMIT
9086 INSERT INTO "Lieu" VALUES(1,'Gentioux')
9087 COMMIT
9088 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
9089 COMMIT
9090 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
9091 COMMIT
9092 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
9093 COMMIT
9094 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
9095 COMMIT
9096 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
9097 COMMIT
9098 INSERT INTO "Lieu" VALUES(7,'Tarnac')
9099 COMMIT
9100 INSERT INTO "Lieu" VALUES(8,'Felletin')
9101 COMMIT
9102 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
9103 COMMIT
9104 INSERT INTO "Facture" VALUES(0,'2025-04-29')
9105 COMMIT
9106 INSERT INTO "Facture" VALUES(1,'2025-04-29')
9107 COMMIT
9108 INSERT INTO "Facture" VALUES(2,'2025-04-29')
9109 COMMIT
9110 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
9111 COMMIT
9112 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
9113 COMMIT
9114 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
9115 COMMIT
9116 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
9117 COMMIT
9118 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
9119 COMMIT
9120 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
9121 COMMIT
9122 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
9123 COMMIT
9124 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
9125 COMMIT
9126 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
9127 COMMIT
9128 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
9129 COMMIT
9130 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
9131 COMMIT
9132 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
9133 COMMIT
9134 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
9135 COMMIT
9136 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
9137 COMMIT
9138 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
9139 COMMIT
9140 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
9141 COMMIT
9142 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
9143 COMMIT
9144 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
9145 COMMIT
9146 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
9147 COMMIT
9148 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
9149 COMMIT
9150 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
9151 COMMIT
9152 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
9153 COMMIT
9154 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
9155 COMMIT
9156 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
9157 COMMIT
9158 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
9159 COMMIT
9160 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
9161 COMMIT
9162 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
9163 COMMIT
9164 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
9165 COMMIT
9166 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
9167 COMMIT
9168 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
9169 COMMIT
9170 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
9171 COMMIT
9172 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
9173 COMMIT
9174 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
9175 COMMIT
9176 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
9177 COMMIT
9178 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
9179 COMMIT
9180 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
9181 COMMIT
9182 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
9183 COMMIT
9184 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
9185 COMMIT
9186 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
9187 COMMIT
9188 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
9189 COMMIT
9190 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
9191 COMMIT
9192 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
9193 COMMIT
9194 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
9195 COMMIT
9196 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
9197 COMMIT
9198 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
9199 COMMIT
9200 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
9201 COMMIT
9202 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
9203 COMMIT
9204 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
9205 COMMIT
9206 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
9207 COMMIT
9208 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
9209 COMMIT
9210 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
9211 COMMIT
9212 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
9213 COMMIT
9214 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
9215 COMMIT
9216 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
9217 COMMIT
9218 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
9219 COMMIT
9220 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
9221 COMMIT
9222 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
9223 COMMIT
9224 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
9225 COMMIT
9226 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
9227 COMMIT
9228 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
9229 COMMIT
9230 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
9231 COMMIT
9232 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
9233 COMMIT
9234 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
9235 COMMIT
9236 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
9237 COMMIT
9238 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
9239 COMMIT
9240 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
9241 COMMIT
9242 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
9243 COMMIT
9244 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
9245 COMMIT
9246 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
9247 COMMIT
9248 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
9249 COMMIT
9250 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
9251 COMMIT
9252 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
9253 COMMIT
9254 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
9255 COMMIT
9256 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
9257 COMMIT
9258 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
9259 COMMIT
9260 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
9261 COMMIT
9262 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
9263 COMMIT
9264 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
9265 COMMIT
9266 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
9267 COMMIT
9268 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
9269 COMMIT
9270 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
9271 COMMIT
9272 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
9273 COMMIT
9274 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
9275 COMMIT
9276 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
9277 COMMIT
9278 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
9279 COMMIT
9280 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
9281 COMMIT
9282 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
9283 COMMIT
9284 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
9285 COMMIT
9286 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
9287 COMMIT
9288 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
9289 COMMIT
9290 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
9291 COMMIT
9292 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
9293 COMMIT
9294 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
9295 COMMIT
9296 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
9297 COMMIT
9298 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
9299 COMMIT
9300 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
9301 COMMIT
9302 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
9303 COMMIT
9304 INSERT INTO "Vente" VALUES(0,10,1.000,0)
9305 COMMIT
9306 INSERT INTO "Vente" VALUES(1,14,2.000,1)
9307 COMMIT
9308 INSERT INTO "Vente" VALUES(2,11,3.000,0)
9309 COMMIT
9310 INSERT INTO "Vente" VALUES(3,16,4.000,2)
9311 COMMIT
9312 INSERT INTO "Vente" VALUES(4,10,1.000,3)
9313 COMMIT
9314 INSERT INTO "Vente" VALUES(5,14,2.000,4)
9315 COMMIT
9316 INSERT INTO "Vente" VALUES(6,11,1.000,3)
9317 COMMIT
9318 DISCONNECT
9319 /*C361*/SET SCHEMA B
9320 DISCONNECT
9321 /*C471*/SET SCHEMA B
9322 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9323 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9324 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9325 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9326 DROP PROCEDURE insertFactureClient IF EXISTS
9327 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9328 DROP VIEW "Factures" IF EXISTS
9329 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as paniers,\u000a --ANY_VALUE\u000a ("Panier".date) as paniers_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produits,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9330 DISCONNECT
9331 /*C472*/SET SCHEMA B
9332 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9333 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9334 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9335 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9336 DROP PROCEDURE insertFactureClient IF EXISTS
9337 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9338 DROP VIEW "Factures" IF EXISTS
9339 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produits,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9340 DISCONNECT
9341 /*C470*/SET SCHEMA B
9342 DISCONNECT
9343 /*C474*/SET SCHEMA B
9344 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9345 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9346 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9347 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9348 DROP PROCEDURE insertFactureClient IF EXISTS
9349 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient)) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9350 DROP VIEW "Factures" IF EXISTS
9351 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9352 DISCONNECT
9353 /*C473*/SET SCHEMA B
9354 DISCONNECT
9355 /*C476*/SET SCHEMA B
9356 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9357 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9358 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9359 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9360 DROP PROCEDURE insertFactureClient IF EXISTS
9361 DISCONNECT
9362 /*C477*/SET SCHEMA B
9363 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9364 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9365 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9366 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9367 DROP PROCEDURE insertFactureClient IF EXISTS
9368 DISCONNECT
9369 /*C478*/SET SCHEMA B
9370 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9371 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9372 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9373 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9374 DROP PROCEDURE insertFactureClient IF EXISTS
9375 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Client".facturable\u000a )) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9376 DROP VIEW "Factures" IF EXISTS
9377 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9378 DISCONNECT
9379 /*C479*/SET SCHEMA B
9380 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9381 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9382 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9383 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9384 DROP PROCEDURE insertFactureClient IF EXISTS
9385 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND Not "Client".facturable\u000a )) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9386 DROP VIEW "Factures" IF EXISTS
9387 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9388 DISCONNECT
9389 /*C480*/SET SCHEMA B
9390 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9391 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9392 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9393 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9394 DROP PROCEDURE insertFactureClient IF EXISTS
9395 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Client".facturable\u000a )) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9396 DROP VIEW "Factures" IF EXISTS
9397 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9398 DISCONNECT
9399 /*C481*/SET SCHEMA B
9400 DROP SCHEMA B CASCADE
9401 DISCONNECT
9402 /*C482*/SET SCHEMA B
9403 SET DATABASE COLLATION "French"
9404 SET DATABASE DEFAULT TABLE TYPE CACHED
9405 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
9406 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
9407 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
9408 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
9409 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
9410 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
9411 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
9412 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
9413 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
9414 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
9415 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
9416 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
9417 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
9418 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
9419 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
9420 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
9421 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
9422 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
9423 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
9424 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
9425 DISCONNECT
9426 /*C483*/SET SCHEMA B
9427 SET SCHEMA B
9428 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
9429 COMMIT
9430 INSERT INTO "Lieu" VALUES(1,'Gentioux')
9431 COMMIT
9432 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
9433 COMMIT
9434 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
9435 COMMIT
9436 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
9437 COMMIT
9438 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
9439 COMMIT
9440 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
9441 COMMIT
9442 INSERT INTO "Lieu" VALUES(7,'Tarnac')
9443 COMMIT
9444 INSERT INTO "Lieu" VALUES(8,'Felletin')
9445 COMMIT
9446 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
9447 COMMIT
9448 INSERT INTO "Facture" VALUES(0,'2025-04-29')
9449 COMMIT
9450 INSERT INTO "Facture" VALUES(1,'2025-04-29')
9451 COMMIT
9452 INSERT INTO "Facture" VALUES(2,'2025-04-29')
9453 COMMIT
9454 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
9455 COMMIT
9456 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
9457 COMMIT
9458 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
9459 COMMIT
9460 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
9461 COMMIT
9462 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
9463 COMMIT
9464 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
9465 COMMIT
9466 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
9467 COMMIT
9468 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
9469 COMMIT
9470 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
9471 COMMIT
9472 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
9473 COMMIT
9474 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
9475 COMMIT
9476 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
9477 COMMIT
9478 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
9479 COMMIT
9480 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
9481 COMMIT
9482 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
9483 COMMIT
9484 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
9485 COMMIT
9486 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
9487 COMMIT
9488 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
9489 COMMIT
9490 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
9491 COMMIT
9492 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
9493 COMMIT
9494 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
9495 COMMIT
9496 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
9497 COMMIT
9498 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
9499 COMMIT
9500 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
9501 COMMIT
9502 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
9503 COMMIT
9504 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
9505 COMMIT
9506 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
9507 COMMIT
9508 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
9509 COMMIT
9510 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
9511 COMMIT
9512 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
9513 COMMIT
9514 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
9515 COMMIT
9516 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
9517 COMMIT
9518 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
9519 COMMIT
9520 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
9521 COMMIT
9522 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
9523 COMMIT
9524 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
9525 COMMIT
9526 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
9527 COMMIT
9528 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
9529 COMMIT
9530 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
9531 COMMIT
9532 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
9533 COMMIT
9534 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
9535 COMMIT
9536 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
9537 COMMIT
9538 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
9539 COMMIT
9540 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
9541 COMMIT
9542 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
9543 COMMIT
9544 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
9545 COMMIT
9546 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
9547 COMMIT
9548 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
9549 COMMIT
9550 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
9551 COMMIT
9552 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
9553 COMMIT
9554 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
9555 COMMIT
9556 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
9557 COMMIT
9558 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
9559 COMMIT
9560 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
9561 COMMIT
9562 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
9563 COMMIT
9564 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
9565 COMMIT
9566 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
9567 COMMIT
9568 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
9569 COMMIT
9570 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
9571 COMMIT
9572 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
9573 COMMIT
9574 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
9575 COMMIT
9576 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
9577 COMMIT
9578 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
9579 COMMIT
9580 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
9581 COMMIT
9582 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
9583 COMMIT
9584 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
9585 COMMIT
9586 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
9587 COMMIT
9588 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
9589 COMMIT
9590 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
9591 COMMIT
9592 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
9593 COMMIT
9594 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
9595 COMMIT
9596 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
9597 COMMIT
9598 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
9599 COMMIT
9600 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
9601 COMMIT
9602 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
9603 COMMIT
9604 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
9605 COMMIT
9606 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
9607 COMMIT
9608 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
9609 COMMIT
9610 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
9611 COMMIT
9612 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
9613 COMMIT
9614 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
9615 COMMIT
9616 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
9617 COMMIT
9618 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
9619 COMMIT
9620 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
9621 COMMIT
9622 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
9623 COMMIT
9624 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
9625 COMMIT
9626 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
9627 COMMIT
9628 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
9629 COMMIT
9630 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
9631 COMMIT
9632 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
9633 COMMIT
9634 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
9635 COMMIT
9636 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
9637 COMMIT
9638 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
9639 COMMIT
9640 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
9641 COMMIT
9642 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
9643 COMMIT
9644 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
9645 COMMIT
9646 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
9647 COMMIT
9648 INSERT INTO "Vente" VALUES(0,10,1.000,0)
9649 COMMIT
9650 INSERT INTO "Vente" VALUES(1,14,2.000,1)
9651 COMMIT
9652 INSERT INTO "Vente" VALUES(2,11,3.000,0)
9653 COMMIT
9654 INSERT INTO "Vente" VALUES(3,16,4.000,2)
9655 COMMIT
9656 INSERT INTO "Vente" VALUES(4,10,1.000,3)
9657 COMMIT
9658 INSERT INTO "Vente" VALUES(5,14,2.000,4)
9659 COMMIT
9660 INSERT INTO "Vente" VALUES(6,11,1.000,3)
9661 COMMIT
9662 DISCONNECT
9663 /*C484*/SET SCHEMA B
9664 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9665 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9666 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9667 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9668 DROP PROCEDURE insertFactureClient IF EXISTS
9669 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Client".facturable\u000a )) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9670 DROP VIEW "Factures" IF EXISTS
9671 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9672 DISCONNECT
9673 /*C485*/SET SCHEMA B
9674 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9675 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9676 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9677 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9678 DROP PROCEDURE insertFactureClient IF EXISTS
9679 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND NOT "Client".facturable\u000a )) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9680 DROP VIEW "Factures" IF EXISTS
9681 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9682 DISCONNECT
9683 /*C486*/SET SCHEMA B
9684 DROP SCHEMA B CASCADE
9685 DISCONNECT
9686 /*C487*/SET SCHEMA B
9687 SET DATABASE COLLATION "French"
9688 SET DATABASE DEFAULT TABLE TYPE CACHED
9689 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
9690 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
9691 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
9692 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
9693 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
9694 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
9695 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
9696 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
9697 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
9698 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
9699 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
9700 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
9701 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
9702 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
9703 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
9704 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
9705 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
9706 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
9707 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
9708 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
9709 DISCONNECT
9710 /*C488*/SET SCHEMA B
9711 SET SCHEMA B
9712 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
9713 COMMIT
9714 INSERT INTO "Lieu" VALUES(1,'Gentioux')
9715 COMMIT
9716 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
9717 COMMIT
9718 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
9719 COMMIT
9720 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
9721 COMMIT
9722 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
9723 COMMIT
9724 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
9725 COMMIT
9726 INSERT INTO "Lieu" VALUES(7,'Tarnac')
9727 COMMIT
9728 INSERT INTO "Lieu" VALUES(8,'Felletin')
9729 COMMIT
9730 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
9731 COMMIT
9732 INSERT INTO "Facture" VALUES(0,'2025-04-29')
9733 COMMIT
9734 INSERT INTO "Facture" VALUES(1,'2025-04-29')
9735 COMMIT
9736 INSERT INTO "Facture" VALUES(2,'2025-04-29')
9737 COMMIT
9738 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
9739 COMMIT
9740 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
9741 COMMIT
9742 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
9743 COMMIT
9744 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
9745 COMMIT
9746 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
9747 COMMIT
9748 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
9749 COMMIT
9750 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
9751 COMMIT
9752 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
9753 COMMIT
9754 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
9755 COMMIT
9756 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
9757 COMMIT
9758 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
9759 COMMIT
9760 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
9761 COMMIT
9762 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
9763 COMMIT
9764 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
9765 COMMIT
9766 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
9767 COMMIT
9768 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
9769 COMMIT
9770 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
9771 COMMIT
9772 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
9773 COMMIT
9774 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
9775 COMMIT
9776 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
9777 COMMIT
9778 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
9779 COMMIT
9780 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
9781 COMMIT
9782 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
9783 COMMIT
9784 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
9785 COMMIT
9786 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
9787 COMMIT
9788 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
9789 COMMIT
9790 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
9791 COMMIT
9792 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
9793 COMMIT
9794 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
9795 COMMIT
9796 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
9797 COMMIT
9798 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
9799 COMMIT
9800 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
9801 COMMIT
9802 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
9803 COMMIT
9804 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
9805 COMMIT
9806 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
9807 COMMIT
9808 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
9809 COMMIT
9810 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
9811 COMMIT
9812 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
9813 COMMIT
9814 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
9815 COMMIT
9816 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
9817 COMMIT
9818 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
9819 COMMIT
9820 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
9821 COMMIT
9822 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
9823 COMMIT
9824 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
9825 COMMIT
9826 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
9827 COMMIT
9828 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
9829 COMMIT
9830 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
9831 COMMIT
9832 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
9833 COMMIT
9834 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
9835 COMMIT
9836 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
9837 COMMIT
9838 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
9839 COMMIT
9840 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
9841 COMMIT
9842 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
9843 COMMIT
9844 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
9845 COMMIT
9846 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
9847 COMMIT
9848 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
9849 COMMIT
9850 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
9851 COMMIT
9852 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
9853 COMMIT
9854 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
9855 COMMIT
9856 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
9857 COMMIT
9858 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
9859 COMMIT
9860 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
9861 COMMIT
9862 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
9863 COMMIT
9864 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
9865 COMMIT
9866 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
9867 COMMIT
9868 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
9869 COMMIT
9870 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
9871 COMMIT
9872 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
9873 COMMIT
9874 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
9875 COMMIT
9876 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
9877 COMMIT
9878 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
9879 COMMIT
9880 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
9881 COMMIT
9882 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
9883 COMMIT
9884 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
9885 COMMIT
9886 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
9887 COMMIT
9888 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
9889 COMMIT
9890 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
9891 COMMIT
9892 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
9893 COMMIT
9894 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
9895 COMMIT
9896 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
9897 COMMIT
9898 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
9899 COMMIT
9900 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
9901 COMMIT
9902 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
9903 COMMIT
9904 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
9905 COMMIT
9906 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
9907 COMMIT
9908 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
9909 COMMIT
9910 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
9911 COMMIT
9912 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
9913 COMMIT
9914 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
9915 COMMIT
9916 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
9917 COMMIT
9918 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
9919 COMMIT
9920 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
9921 COMMIT
9922 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
9923 COMMIT
9924 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
9925 COMMIT
9926 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
9927 COMMIT
9928 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
9929 COMMIT
9930 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
9931 COMMIT
9932 INSERT INTO "Vente" VALUES(0,10,1.000,0)
9933 COMMIT
9934 INSERT INTO "Vente" VALUES(1,14,2.000,1)
9935 COMMIT
9936 INSERT INTO "Vente" VALUES(2,11,3.000,0)
9937 COMMIT
9938 INSERT INTO "Vente" VALUES(3,16,4.000,2)
9939 COMMIT
9940 INSERT INTO "Vente" VALUES(4,10,1.000,3)
9941 COMMIT
9942 INSERT INTO "Vente" VALUES(5,14,2.000,4)
9943 COMMIT
9944 INSERT INTO "Vente" VALUES(6,11,1.000,3)
9945 COMMIT
9946 DISCONNECT
9947 /*C489*/SET SCHEMA B
9948 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
9949 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
9950 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
9951 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
9952 DROP PROCEDURE insertFactureClient IF EXISTS
9953 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND NOT "Client".facturable\u000a )) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
9954 DROP VIEW "Factures" IF EXISTS
9955 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
9956 DISCONNECT
9957 /*C490*/SET SCHEMA B
9958 DROP SCHEMA B CASCADE
9959 DISCONNECT
9960 /*C491*/SET SCHEMA B
9961 SET DATABASE COLLATION "French"
9962 SET DATABASE DEFAULT TABLE TYPE CACHED
9963 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
9964 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
9965 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
9966 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
9967 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
9968 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
9969 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
9970 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
9971 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
9972 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
9973 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
9974 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
9975 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
9976 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
9977 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
9978 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
9979 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
9980 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
9981 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
9982 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
9983 DISCONNECT
9984 /*C492*/SET SCHEMA B
9985 SET SCHEMA B
9986 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
9987 COMMIT
9988 INSERT INTO "Lieu" VALUES(1,'Gentioux')
9989 COMMIT
9990 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
9991 COMMIT
9992 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
9993 COMMIT
9994 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
9995 COMMIT
9996 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
9997 COMMIT
9998 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
9999 COMMIT
10000 INSERT INTO "Lieu" VALUES(7,'Tarnac')
10001 COMMIT
10002 INSERT INTO "Lieu" VALUES(8,'Felletin')
10003 COMMIT
10004 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
10005 COMMIT
10006 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
10007 COMMIT
10008 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
10009 COMMIT
10010 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
10011 COMMIT
10012 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
10013 COMMIT
10014 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
10015 COMMIT
10016 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
10017 COMMIT
10018 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
10019 COMMIT
10020 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
10021 COMMIT
10022 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
10023 COMMIT
10024 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
10025 COMMIT
10026 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
10027 COMMIT
10028 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
10029 COMMIT
10030 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
10031 COMMIT
10032 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
10033 COMMIT
10034 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
10035 COMMIT
10036 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
10037 COMMIT
10038 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
10039 COMMIT
10040 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
10041 COMMIT
10042 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
10043 COMMIT
10044 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
10045 COMMIT
10046 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
10047 COMMIT
10048 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
10049 COMMIT
10050 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
10051 COMMIT
10052 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
10053 COMMIT
10054 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
10055 COMMIT
10056 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
10057 COMMIT
10058 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
10059 COMMIT
10060 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
10061 COMMIT
10062 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
10063 COMMIT
10064 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
10065 COMMIT
10066 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
10067 COMMIT
10068 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
10069 COMMIT
10070 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
10071 COMMIT
10072 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
10073 COMMIT
10074 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
10075 COMMIT
10076 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
10077 COMMIT
10078 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
10079 COMMIT
10080 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
10081 COMMIT
10082 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
10083 COMMIT
10084 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
10085 COMMIT
10086 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
10087 COMMIT
10088 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
10089 COMMIT
10090 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
10091 COMMIT
10092 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
10093 COMMIT
10094 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
10095 COMMIT
10096 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
10097 COMMIT
10098 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
10099 COMMIT
10100 DISCONNECT
10101 /*C493*/SET SCHEMA B
10102 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
10103 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
10104 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
10105 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
10106 DROP PROCEDURE insertFactureClient IF EXISTS
10107 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND NOT "Client".facturable\u000a )) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
10108 DROP VIEW "Factures" IF EXISTS
10109 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
10110 DISCONNECT
10111 /*C494*/SET SCHEMA B
10112 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
10113 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
10114 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
10115 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
10116 DROP PROCEDURE insertFactureClient IF EXISTS
10117 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Client".facturable\u000a )) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
10118 DROP VIEW "Factures" IF EXISTS
10119 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
10120 DISCONNECT
10121 /*C495*/SET SCHEMA B
10122 DROP SCHEMA B CASCADE
10123 DISCONNECT
10124 /*C496*/SET SCHEMA B
10125 SET DATABASE COLLATION "French"
10126 SET DATABASE DEFAULT TABLE TYPE CACHED
10127 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
10128 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
10129 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
10130 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
10131 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
10132 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
10133 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
10134 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
10135 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
10136 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
10137 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
10138 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
10139 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
10140 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
10141 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
10142 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
10143 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
10144 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
10145 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
10146 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
10147 DISCONNECT
10148 /*C497*/SET SCHEMA B
10149 SET SCHEMA B
10150 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
10151 COMMIT
10152 INSERT INTO "Lieu" VALUES(1,'Gentioux')
10153 COMMIT
10154 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
10155 COMMIT
10156 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
10157 COMMIT
10158 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
10159 COMMIT
10160 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
10161 COMMIT
10162 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
10163 COMMIT
10164 INSERT INTO "Lieu" VALUES(7,'Tarnac')
10165 COMMIT
10166 INSERT INTO "Lieu" VALUES(8,'Felletin')
10167 COMMIT
10168 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
10169 COMMIT
10170 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
10171 COMMIT
10172 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
10173 COMMIT
10174 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
10175 COMMIT
10176 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
10177 COMMIT
10178 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
10179 COMMIT
10180 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
10181 COMMIT
10182 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
10183 COMMIT
10184 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
10185 COMMIT
10186 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
10187 COMMIT
10188 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
10189 COMMIT
10190 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
10191 COMMIT
10192 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
10193 COMMIT
10194 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
10195 COMMIT
10196 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
10197 COMMIT
10198 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
10199 COMMIT
10200 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
10201 COMMIT
10202 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
10203 COMMIT
10204 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
10205 COMMIT
10206 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
10207 COMMIT
10208 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
10209 COMMIT
10210 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
10211 COMMIT
10212 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
10213 COMMIT
10214 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
10215 COMMIT
10216 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
10217 COMMIT
10218 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
10219 COMMIT
10220 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
10221 COMMIT
10222 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
10223 COMMIT
10224 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
10225 COMMIT
10226 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
10227 COMMIT
10228 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
10229 COMMIT
10230 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
10231 COMMIT
10232 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
10233 COMMIT
10234 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
10235 COMMIT
10236 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
10237 COMMIT
10238 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
10239 COMMIT
10240 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
10241 COMMIT
10242 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
10243 COMMIT
10244 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
10245 COMMIT
10246 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
10247 COMMIT
10248 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
10249 COMMIT
10250 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
10251 COMMIT
10252 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
10253 COMMIT
10254 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
10255 COMMIT
10256 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
10257 COMMIT
10258 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
10259 COMMIT
10260 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
10261 COMMIT
10262 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
10263 COMMIT
10264 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
10265 COMMIT
10266 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
10267 COMMIT
10268 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
10269 COMMIT
10270 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
10271 COMMIT
10272 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
10273 COMMIT
10274 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
10275 COMMIT
10276 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
10277 COMMIT
10278 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
10279 COMMIT
10280 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
10281 COMMIT
10282 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
10283 COMMIT
10284 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
10285 COMMIT
10286 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
10287 COMMIT
10288 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
10289 COMMIT
10290 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
10291 COMMIT
10292 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
10293 COMMIT
10294 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
10295 COMMIT
10296 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
10297 COMMIT
10298 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
10299 COMMIT
10300 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
10301 COMMIT
10302 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
10303 COMMIT
10304 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
10305 COMMIT
10306 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
10307 COMMIT
10308 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
10309 COMMIT
10310 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
10311 COMMIT
10312 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
10313 COMMIT
10314 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
10315 COMMIT
10316 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
10317 COMMIT
10318 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
10319 COMMIT
10320 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
10321 COMMIT
10322 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
10323 COMMIT
10324 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
10325 COMMIT
10326 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
10327 COMMIT
10328 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
10329 COMMIT
10330 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
10331 COMMIT
10332 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
10333 COMMIT
10334 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
10335 COMMIT
10336 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
10337 COMMIT
10338 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
10339 COMMIT
10340 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
10341 COMMIT
10342 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
10343 COMMIT
10344 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
10345 COMMIT
10346 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
10347 COMMIT
10348 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
10349 COMMIT
10350 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
10351 COMMIT
10352 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
10353 COMMIT
10354 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
10355 COMMIT
10356 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
10357 COMMIT
10358 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
10359 COMMIT
10360 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
10361 COMMIT
10362 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
10363 COMMIT
10364 INSERT INTO "Vente" VALUES(0,10,1.000,0)
10365 COMMIT
10366 INSERT INTO "Vente" VALUES(1,14,2.000,1)
10367 COMMIT
10368 INSERT INTO "Vente" VALUES(2,11,3.000,0)
10369 COMMIT
10370 INSERT INTO "Vente" VALUES(3,16,4.000,2)
10371 COMMIT
10372 INSERT INTO "Vente" VALUES(4,10,1.000,3)
10373 COMMIT
10374 INSERT INTO "Vente" VALUES(5,14,2.000,4)
10375 COMMIT
10376 INSERT INTO "Vente" VALUES(6,11,1.000,3)
10377 COMMIT
10378 DISCONNECT
10379 /*C498*/SET SCHEMA B
10380 DROP SCHEMA B CASCADE
10381 DISCONNECT
10382 /*C499*/SET SCHEMA B
10383 SET DATABASE COLLATION "French"
10384 SET DATABASE DEFAULT TABLE TYPE CACHED
10385 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
10386 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
10387 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
10388 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
10389 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
10390 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
10391 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
10392 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
10393 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
10394 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
10395 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
10396 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
10397 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
10398 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
10399 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
10400 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
10401 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
10402 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
10403 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
10404 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
10405 DISCONNECT
10406 /*C500*/SET SCHEMA B
10407 SET SCHEMA B
10408 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
10409 COMMIT
10410 INSERT INTO "Lieu" VALUES(1,'Gentioux')
10411 COMMIT
10412 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
10413 COMMIT
10414 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
10415 COMMIT
10416 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
10417 COMMIT
10418 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
10419 COMMIT
10420 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
10421 COMMIT
10422 INSERT INTO "Lieu" VALUES(7,'Tarnac')
10423 COMMIT
10424 INSERT INTO "Lieu" VALUES(8,'Felletin')
10425 COMMIT
10426 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
10427 COMMIT
10428 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
10429 COMMIT
10430 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
10431 COMMIT
10432 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
10433 COMMIT
10434 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
10435 COMMIT
10436 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
10437 COMMIT
10438 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
10439 COMMIT
10440 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
10441 COMMIT
10442 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
10443 COMMIT
10444 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
10445 COMMIT
10446 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
10447 COMMIT
10448 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
10449 COMMIT
10450 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
10451 COMMIT
10452 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
10453 COMMIT
10454 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
10455 COMMIT
10456 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
10457 COMMIT
10458 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
10459 COMMIT
10460 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
10461 COMMIT
10462 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
10463 COMMIT
10464 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
10465 COMMIT
10466 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
10467 COMMIT
10468 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
10469 COMMIT
10470 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
10471 COMMIT
10472 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
10473 COMMIT
10474 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
10475 COMMIT
10476 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
10477 COMMIT
10478 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
10479 COMMIT
10480 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
10481 COMMIT
10482 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
10483 COMMIT
10484 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
10485 COMMIT
10486 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
10487 COMMIT
10488 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
10489 COMMIT
10490 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
10491 COMMIT
10492 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
10493 COMMIT
10494 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
10495 COMMIT
10496 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
10497 COMMIT
10498 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
10499 COMMIT
10500 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
10501 COMMIT
10502 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
10503 COMMIT
10504 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
10505 COMMIT
10506 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
10507 COMMIT
10508 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
10509 COMMIT
10510 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
10511 COMMIT
10512 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
10513 COMMIT
10514 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
10515 COMMIT
10516 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
10517 COMMIT
10518 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
10519 COMMIT
10520 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
10521 COMMIT
10522 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
10523 COMMIT
10524 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
10525 COMMIT
10526 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
10527 COMMIT
10528 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
10529 COMMIT
10530 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
10531 COMMIT
10532 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
10533 COMMIT
10534 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
10535 COMMIT
10536 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
10537 COMMIT
10538 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
10539 COMMIT
10540 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
10541 COMMIT
10542 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
10543 COMMIT
10544 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
10545 COMMIT
10546 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
10547 COMMIT
10548 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
10549 COMMIT
10550 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
10551 COMMIT
10552 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
10553 COMMIT
10554 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
10555 COMMIT
10556 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
10557 COMMIT
10558 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
10559 COMMIT
10560 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
10561 COMMIT
10562 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
10563 COMMIT
10564 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
10565 COMMIT
10566 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
10567 COMMIT
10568 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
10569 COMMIT
10570 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
10571 COMMIT
10572 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
10573 COMMIT
10574 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
10575 COMMIT
10576 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
10577 COMMIT
10578 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
10579 COMMIT
10580 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
10581 COMMIT
10582 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
10583 COMMIT
10584 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
10585 COMMIT
10586 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
10587 COMMIT
10588 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
10589 COMMIT
10590 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
10591 COMMIT
10592 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
10593 COMMIT
10594 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
10595 COMMIT
10596 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
10597 COMMIT
10598 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
10599 COMMIT
10600 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
10601 COMMIT
10602 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
10603 COMMIT
10604 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
10605 COMMIT
10606 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
10607 COMMIT
10608 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
10609 COMMIT
10610 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
10611 COMMIT
10612 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
10613 COMMIT
10614 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
10615 COMMIT
10616 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
10617 COMMIT
10618 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
10619 COMMIT
10620 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
10621 COMMIT
10622 INSERT INTO "Vente" VALUES(0,10,1.000,0)
10623 COMMIT
10624 INSERT INTO "Vente" VALUES(1,14,2.000,1)
10625 COMMIT
10626 INSERT INTO "Vente" VALUES(2,11,3.000,0)
10627 COMMIT
10628 INSERT INTO "Vente" VALUES(3,16,4.000,2)
10629 COMMIT
10630 INSERT INTO "Vente" VALUES(4,10,1.000,3)
10631 COMMIT
10632 INSERT INTO "Vente" VALUES(5,14,2.000,4)
10633 COMMIT
10634 INSERT INTO "Vente" VALUES(6,11,1.000,3)
10635 COMMIT
10636 DISCONNECT
10637 /*C501*/SET SCHEMA B
10638 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
10639 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
10640 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
10641 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
10642 DROP PROCEDURE insertFactureClient IF EXISTS
10643 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Client".facturable\u000a )) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
10644 INSERT INTO "Facture" VALUES(0,'2025-04-30')
10645 DELETE FROM "Panier" WHERE ID=0
10646 DELETE FROM "Panier" WHERE ID=3
10647 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
10648 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
10649 COMMIT
10650 INSERT INTO "Facture" VALUES(1,'2025-04-30')
10651 DELETE FROM "Panier" WHERE ID=1
10652 DELETE FROM "Panier" WHERE ID=4
10653 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
10654 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
10655 COMMIT
10656 INSERT INTO "Facture" VALUES(2,'2025-04-30')
10657 DELETE FROM "Panier" WHERE ID=2
10658 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
10659 COMMIT
10660 DROP VIEW "Factures" IF EXISTS
10661 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
10662 DISCONNECT
10663 /*C502*/SET SCHEMA B
10664 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
10665 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
10666 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
10667 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
10668 DROP PROCEDURE insertFactureClient IF EXISTS
10669 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND NOT "Client".facturable\u000a )) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
10670 DROP VIEW "Factures" IF EXISTS
10671 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
10672 DISCONNECT
10673 /*C503*/SET SCHEMA B
10674 DROP SCHEMA B CASCADE
10675 DISCONNECT
10676 /*C504*/SET SCHEMA B
10677 SET DATABASE COLLATION "French"
10678 SET DATABASE DEFAULT TABLE TYPE CACHED
10679 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
10680 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
10681 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
10682 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
10683 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
10684 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
10685 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
10686 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
10687 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
10688 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
10689 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
10690 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
10691 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
10692 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
10693 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
10694 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
10695 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
10696 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
10697 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
10698 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
10699 DISCONNECT
10700 /*C505*/SET SCHEMA B
10701 SET SCHEMA B
10702 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
10703 COMMIT
10704 INSERT INTO "Lieu" VALUES(1,'Gentioux')
10705 COMMIT
10706 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
10707 COMMIT
10708 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
10709 COMMIT
10710 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
10711 COMMIT
10712 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
10713 COMMIT
10714 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
10715 COMMIT
10716 INSERT INTO "Lieu" VALUES(7,'Tarnac')
10717 COMMIT
10718 INSERT INTO "Lieu" VALUES(8,'Felletin')
10719 COMMIT
10720 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
10721 COMMIT
10722 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
10723 COMMIT
10724 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
10725 COMMIT
10726 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
10727 COMMIT
10728 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
10729 COMMIT
10730 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
10731 COMMIT
10732 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
10733 COMMIT
10734 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
10735 COMMIT
10736 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
10737 COMMIT
10738 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
10739 COMMIT
10740 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
10741 COMMIT
10742 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
10743 COMMIT
10744 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
10745 COMMIT
10746 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
10747 COMMIT
10748 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
10749 COMMIT
10750 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
10751 COMMIT
10752 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
10753 COMMIT
10754 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
10755 COMMIT
10756 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
10757 COMMIT
10758 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
10759 COMMIT
10760 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
10761 COMMIT
10762 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
10763 COMMIT
10764 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
10765 COMMIT
10766 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
10767 COMMIT
10768 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
10769 COMMIT
10770 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
10771 COMMIT
10772 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
10773 COMMIT
10774 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
10775 COMMIT
10776 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
10777 COMMIT
10778 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
10779 COMMIT
10780 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
10781 COMMIT
10782 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
10783 COMMIT
10784 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
10785 COMMIT
10786 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
10787 COMMIT
10788 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
10789 COMMIT
10790 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
10791 COMMIT
10792 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
10793 COMMIT
10794 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
10795 COMMIT
10796 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
10797 COMMIT
10798 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
10799 COMMIT
10800 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
10801 COMMIT
10802 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
10803 COMMIT
10804 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
10805 COMMIT
10806 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
10807 COMMIT
10808 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
10809 COMMIT
10810 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
10811 COMMIT
10812 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
10813 COMMIT
10814 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
10815 COMMIT
10816 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
10817 COMMIT
10818 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
10819 COMMIT
10820 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
10821 COMMIT
10822 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
10823 COMMIT
10824 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
10825 COMMIT
10826 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
10827 COMMIT
10828 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
10829 COMMIT
10830 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
10831 COMMIT
10832 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
10833 COMMIT
10834 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
10835 COMMIT
10836 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
10837 COMMIT
10838 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
10839 COMMIT
10840 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
10841 COMMIT
10842 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
10843 COMMIT
10844 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
10845 COMMIT
10846 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
10847 COMMIT
10848 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
10849 COMMIT
10850 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
10851 COMMIT
10852 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
10853 COMMIT
10854 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
10855 COMMIT
10856 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
10857 COMMIT
10858 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
10859 COMMIT
10860 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
10861 COMMIT
10862 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
10863 COMMIT
10864 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
10865 COMMIT
10866 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
10867 COMMIT
10868 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
10869 COMMIT
10870 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
10871 COMMIT
10872 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
10873 COMMIT
10874 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
10875 COMMIT
10876 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
10877 COMMIT
10878 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
10879 COMMIT
10880 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
10881 COMMIT
10882 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
10883 COMMIT
10884 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
10885 COMMIT
10886 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
10887 COMMIT
10888 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
10889 COMMIT
10890 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
10891 COMMIT
10892 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
10893 COMMIT
10894 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
10895 COMMIT
10896 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
10897 COMMIT
10898 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
10899 COMMIT
10900 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
10901 COMMIT
10902 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
10903 COMMIT
10904 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
10905 COMMIT
10906 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
10907 COMMIT
10908 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
10909 COMMIT
10910 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
10911 COMMIT
10912 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
10913 COMMIT
10914 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
10915 COMMIT
10916 INSERT INTO "Vente" VALUES(0,10,1.000,0)
10917 COMMIT
10918 INSERT INTO "Vente" VALUES(1,14,2.000,1)
10919 COMMIT
10920 INSERT INTO "Vente" VALUES(2,11,3.000,0)
10921 COMMIT
10922 INSERT INTO "Vente" VALUES(3,16,4.000,2)
10923 COMMIT
10924 INSERT INTO "Vente" VALUES(4,10,1.000,3)
10925 COMMIT
10926 INSERT INTO "Vente" VALUES(5,14,2.000,4)
10927 COMMIT
10928 INSERT INTO "Vente" VALUES(6,11,1.000,3)
10929 COMMIT
10930 DISCONNECT
10931 /*C506*/SET SCHEMA B
10932 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
10933 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
10934 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
10935 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
10936 DROP PROCEDURE insertFactureClient IF EXISTS
10937 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND NOT "Client".facturable\u000a )) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
10938 DROP VIEW "Factures" IF EXISTS
10939 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
10940 DISCONNECT
10941 /*C507*/SET SCHEMA B
10942 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
10943 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
10944 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
10945 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
10946 DROP PROCEDURE insertFactureClient IF EXISTS
10947 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Client".facturable\u000a )) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
10948 INSERT INTO "Facture" VALUES(0,'2025-04-30')
10949 DELETE FROM "Panier" WHERE ID=0
10950 DELETE FROM "Panier" WHERE ID=3
10951 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
10952 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
10953 COMMIT
10954 INSERT INTO "Facture" VALUES(1,'2025-04-30')
10955 DELETE FROM "Panier" WHERE ID=1
10956 DELETE FROM "Panier" WHERE ID=4
10957 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
10958 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
10959 COMMIT
10960 INSERT INTO "Facture" VALUES(2,'2025-04-30')
10961 DELETE FROM "Panier" WHERE ID=2
10962 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
10963 COMMIT
10964 DROP VIEW "Factures" IF EXISTS
10965 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
10966 DISCONNECT
10967 /*C508*/SET SCHEMA B
10968 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
10969 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
10970 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
10971 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
10972 DROP PROCEDURE insertFactureClient IF EXISTS
10973 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Client".facturable\u000a )) > 0\u000a THEN\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
10974 DROP VIEW "Factures" IF EXISTS
10975 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
10976 DISCONNECT
10977 /*C509*/SET SCHEMA B
10978 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
10979 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
10980 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
10981 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
10982 DROP PROCEDURE insertFactureClient IF EXISTS
10983 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Client".facturable\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans les paniers\u000a -- qu'elle couvre.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
10984 DROP VIEW "Factures" IF EXISTS
10985 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
10986 DISCONNECT
10987 /*C510*/SET SCHEMA B
10988 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
10989 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
10990 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
10991 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
10992 DROP PROCEDURE insertFactureClient IF EXISTS
10993 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Client".facturable\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
10994 DROP VIEW "Factures" IF EXISTS
10995 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
10996 DISCONNECT
10997 /*C511*/SET SCHEMA B
10998 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
10999 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
11000 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
11001 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
11002 DROP PROCEDURE insertFactureClient IF EXISTS
11003 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Client".facturable\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a -- CorrectnessNote: en l'\u00e9tat\u000a -- cela concerne aussi les paniers\u000a -- lorsque `client` \u00e9tait non `facturable`,\u000a -- autrement dit il vaut mieux ne pas changer `facturable`.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
11004 DROP VIEW "Factures" IF EXISTS
11005 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
11006 DISCONNECT
11007 /*C512*/SET SCHEMA B
11008 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
11009 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
11010 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
11011 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
11012 DROP PROCEDURE insertFactureClient IF EXISTS
11013 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers non-factur\u00e9s\u000a -- et que le client est facturable.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier", "Client"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Client".facturable\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a -- CorrectnessNote: en l'\u00e9tat\u000a -- cela concerne aussi les paniers\u000a -- lorsque `client` \u00e9tait non `facturable`,\u000a -- autrement dit il vaut mieux ne pas changer `facturable`\u000a -- pour ne pas qu'un `client` paye deux fois.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
11014 DROP VIEW "Factures" IF EXISTS
11015 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
11016 DISCONNECT
11017 /*C513*/SET SCHEMA B
11018 DISCONNECT
11019 /*C514*/SET SCHEMA B
11020 DISCONNECT
11021 /*C515*/SET SCHEMA B
11022 DISCONNECT
11023 /*C516*/SET SCHEMA B
11024 DISCONNECT
11025 /*C517*/SET SCHEMA B
11026 DISCONNECT
11027 /*C518*/SET SCHEMA B
11028 DISCONNECT
11029 /*C519*/SET SCHEMA B
11030 DISCONNECT
11031 /*C520*/SET SCHEMA B
11032 DISCONNECT
11033 /*C521*/SET SCHEMA B
11034 DROP SCHEMA B CASCADE
11035 DISCONNECT
11036 /*C522*/SET SCHEMA B
11037 SET DATABASE COLLATION "French"
11038 SET DATABASE DEFAULT TABLE TYPE CACHED
11039 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
11040 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
11041 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
11042 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
11043 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
11044 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
11045 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
11046 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
11047 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
11048 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
11049 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
11050 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
11051 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
11052 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
11053 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
11054 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
11055 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
11056 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
11057 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
11058 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
11059 DISCONNECT
11060 /*C523*/SET SCHEMA B
11061 SET SCHEMA B
11062 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
11063 COMMIT
11064 INSERT INTO "Lieu" VALUES(1,'Gentioux')
11065 COMMIT
11066 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
11067 COMMIT
11068 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
11069 COMMIT
11070 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
11071 COMMIT
11072 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
11073 COMMIT
11074 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
11075 COMMIT
11076 INSERT INTO "Lieu" VALUES(7,'Tarnac')
11077 COMMIT
11078 INSERT INTO "Lieu" VALUES(8,'Felletin')
11079 COMMIT
11080 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
11081 COMMIT
11082 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
11083 COMMIT
11084 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
11085 COMMIT
11086 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
11087 COMMIT
11088 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
11089 COMMIT
11090 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
11091 COMMIT
11092 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
11093 COMMIT
11094 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
11095 COMMIT
11096 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
11097 COMMIT
11098 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
11099 COMMIT
11100 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
11101 COMMIT
11102 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
11103 COMMIT
11104 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
11105 COMMIT
11106 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
11107 COMMIT
11108 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
11109 COMMIT
11110 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
11111 COMMIT
11112 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
11113 COMMIT
11114 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
11115 COMMIT
11116 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
11117 COMMIT
11118 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
11119 COMMIT
11120 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
11121 COMMIT
11122 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
11123 COMMIT
11124 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
11125 COMMIT
11126 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
11127 COMMIT
11128 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
11129 COMMIT
11130 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
11131 COMMIT
11132 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
11133 COMMIT
11134 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
11135 COMMIT
11136 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
11137 COMMIT
11138 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
11139 COMMIT
11140 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
11141 COMMIT
11142 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
11143 COMMIT
11144 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
11145 COMMIT
11146 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
11147 COMMIT
11148 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
11149 COMMIT
11150 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
11151 COMMIT
11152 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
11153 COMMIT
11154 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
11155 COMMIT
11156 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
11157 COMMIT
11158 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
11159 COMMIT
11160 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
11161 COMMIT
11162 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
11163 COMMIT
11164 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
11165 COMMIT
11166 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
11167 COMMIT
11168 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
11169 COMMIT
11170 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
11171 COMMIT
11172 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
11173 COMMIT
11174 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
11175 COMMIT
11176 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
11177 COMMIT
11178 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
11179 COMMIT
11180 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
11181 COMMIT
11182 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
11183 COMMIT
11184 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
11185 COMMIT
11186 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
11187 COMMIT
11188 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
11189 COMMIT
11190 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
11191 COMMIT
11192 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
11193 COMMIT
11194 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
11195 COMMIT
11196 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
11197 COMMIT
11198 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
11199 COMMIT
11200 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
11201 COMMIT
11202 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
11203 COMMIT
11204 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
11205 COMMIT
11206 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
11207 COMMIT
11208 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
11209 COMMIT
11210 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
11211 COMMIT
11212 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
11213 COMMIT
11214 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
11215 COMMIT
11216 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
11217 COMMIT
11218 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
11219 COMMIT
11220 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
11221 COMMIT
11222 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
11223 COMMIT
11224 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
11225 COMMIT
11226 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
11227 COMMIT
11228 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
11229 COMMIT
11230 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
11231 COMMIT
11232 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
11233 COMMIT
11234 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
11235 COMMIT
11236 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
11237 COMMIT
11238 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
11239 COMMIT
11240 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
11241 COMMIT
11242 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
11243 COMMIT
11244 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
11245 COMMIT
11246 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
11247 COMMIT
11248 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
11249 COMMIT
11250 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
11251 COMMIT
11252 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
11253 COMMIT
11254 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
11255 COMMIT
11256 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
11257 COMMIT
11258 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
11259 COMMIT
11260 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
11261 COMMIT
11262 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
11263 COMMIT
11264 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
11265 COMMIT
11266 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
11267 COMMIT
11268 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
11269 COMMIT
11270 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
11271 COMMIT
11272 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
11273 COMMIT
11274 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
11275 COMMIT
11276 INSERT INTO "Vente" VALUES(0,10,1.000,0)
11277 COMMIT
11278 INSERT INTO "Vente" VALUES(1,14,2.000,1)
11279 COMMIT
11280 INSERT INTO "Vente" VALUES(2,11,3.000,0)
11281 COMMIT
11282 INSERT INTO "Vente" VALUES(3,16,4.000,2)
11283 COMMIT
11284 INSERT INTO "Vente" VALUES(4,10,1.000,3)
11285 COMMIT
11286 INSERT INTO "Vente" VALUES(5,14,2.000,4)
11287 COMMIT
11288 INSERT INTO "Vente" VALUES(6,11,1.000,3)
11289 COMMIT
11290 DISCONNECT
11291 /*C524*/SET SCHEMA B
11292 DISCONNECT
11293 /*C525*/SET SCHEMA B
11294 DROP SCHEMA B CASCADE
11295 DISCONNECT
11296 /*C526*/SET SCHEMA B
11297 SET DATABASE COLLATION "French"
11298 SET DATABASE DEFAULT TABLE TYPE CACHED
11299 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
11300 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
11301 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
11302 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
11303 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
11304 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
11305 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
11306 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
11307 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
11308 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
11309 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
11310 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
11311 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
11312 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
11313 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
11314 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
11315 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
11316 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
11317 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
11318 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
11319 DISCONNECT
11320 /*C527*/SET SCHEMA B
11321 SET SCHEMA B
11322 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
11323 COMMIT
11324 INSERT INTO "Lieu" VALUES(1,'Gentioux')
11325 COMMIT
11326 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
11327 COMMIT
11328 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
11329 COMMIT
11330 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
11331 COMMIT
11332 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
11333 COMMIT
11334 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
11335 COMMIT
11336 INSERT INTO "Lieu" VALUES(7,'Tarnac')
11337 COMMIT
11338 INSERT INTO "Lieu" VALUES(8,'Felletin')
11339 COMMIT
11340 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
11341 COMMIT
11342 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
11343 COMMIT
11344 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
11345 COMMIT
11346 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
11347 COMMIT
11348 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
11349 COMMIT
11350 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
11351 COMMIT
11352 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
11353 COMMIT
11354 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
11355 COMMIT
11356 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
11357 COMMIT
11358 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
11359 COMMIT
11360 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
11361 COMMIT
11362 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
11363 COMMIT
11364 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
11365 COMMIT
11366 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
11367 COMMIT
11368 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
11369 COMMIT
11370 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
11371 COMMIT
11372 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
11373 COMMIT
11374 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
11375 COMMIT
11376 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
11377 COMMIT
11378 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
11379 COMMIT
11380 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
11381 COMMIT
11382 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
11383 COMMIT
11384 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
11385 COMMIT
11386 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
11387 COMMIT
11388 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
11389 COMMIT
11390 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
11391 COMMIT
11392 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
11393 COMMIT
11394 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
11395 COMMIT
11396 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
11397 COMMIT
11398 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
11399 COMMIT
11400 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
11401 COMMIT
11402 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
11403 COMMIT
11404 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
11405 COMMIT
11406 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
11407 COMMIT
11408 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
11409 COMMIT
11410 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
11411 COMMIT
11412 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
11413 COMMIT
11414 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
11415 COMMIT
11416 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
11417 COMMIT
11418 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
11419 COMMIT
11420 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
11421 COMMIT
11422 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
11423 COMMIT
11424 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
11425 COMMIT
11426 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
11427 COMMIT
11428 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
11429 COMMIT
11430 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
11431 COMMIT
11432 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
11433 COMMIT
11434 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
11435 COMMIT
11436 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,NULL)
11437 COMMIT
11438 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,NULL)
11439 COMMIT
11440 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,NULL)
11441 COMMIT
11442 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,NULL)
11443 COMMIT
11444 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
11445 COMMIT
11446 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
11447 COMMIT
11448 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
11449 COMMIT
11450 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
11451 COMMIT
11452 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
11453 COMMIT
11454 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
11455 COMMIT
11456 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
11457 COMMIT
11458 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
11459 COMMIT
11460 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
11461 COMMIT
11462 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
11463 COMMIT
11464 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
11465 COMMIT
11466 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
11467 COMMIT
11468 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
11469 COMMIT
11470 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
11471 COMMIT
11472 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
11473 COMMIT
11474 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
11475 COMMIT
11476 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
11477 COMMIT
11478 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
11479 COMMIT
11480 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
11481 COMMIT
11482 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
11483 COMMIT
11484 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
11485 COMMIT
11486 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
11487 COMMIT
11488 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
11489 COMMIT
11490 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
11491 COMMIT
11492 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
11493 COMMIT
11494 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
11495 COMMIT
11496 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
11497 COMMIT
11498 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
11499 COMMIT
11500 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
11501 COMMIT
11502 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
11503 COMMIT
11504 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
11505 COMMIT
11506 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
11507 COMMIT
11508 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
11509 COMMIT
11510 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
11511 COMMIT
11512 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
11513 COMMIT
11514 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
11515 COMMIT
11516 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
11517 COMMIT
11518 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
11519 COMMIT
11520 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
11521 COMMIT
11522 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
11523 COMMIT
11524 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
11525 COMMIT
11526 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
11527 COMMIT
11528 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
11529 COMMIT
11530 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
11531 COMMIT
11532 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
11533 COMMIT
11534 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
11535 COMMIT
11536 INSERT INTO "Vente" VALUES(0,10,1.000,0)
11537 COMMIT
11538 INSERT INTO "Vente" VALUES(1,14,2.000,1)
11539 COMMIT
11540 INSERT INTO "Vente" VALUES(2,11,3.000,0)
11541 COMMIT
11542 INSERT INTO "Vente" VALUES(3,16,4.000,2)
11543 COMMIT
11544 INSERT INTO "Vente" VALUES(4,10,1.000,3)
11545 COMMIT
11546 INSERT INTO "Vente" VALUES(5,14,2.000,4)
11547 COMMIT
11548 INSERT INTO "Vente" VALUES(6,11,1.000,3)
11549 COMMIT
11550 DISCONNECT
11551 /*C528*/SET SCHEMA B
11552 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
11553 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a SET venteFacturable = SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
11554 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
11555 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
11556 DROP PROCEDURE insertFactureClient IF EXISTS
11557 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Panier".facturable\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
11558 INSERT INTO "Facture" VALUES(0,'2025-04-30')
11559 DELETE FROM "Panier" WHERE ID=0
11560 DELETE FROM "Panier" WHERE ID=3
11561 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,0)
11562 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,0)
11563 COMMIT
11564 INSERT INTO "Facture" VALUES(1,'2025-04-30')
11565 DELETE FROM "Panier" WHERE ID=1
11566 DELETE FROM "Panier" WHERE ID=4
11567 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,1)
11568 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,1)
11569 COMMIT
11570 INSERT INTO "Facture" VALUES(2,'2025-04-30')
11571 DELETE FROM "Panier" WHERE ID=2
11572 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,2)
11573 COMMIT
11574 DROP VIEW "Factures" IF EXISTS
11575 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
11576 DISCONNECT
11577 /*C529*/SET SCHEMA B
11578 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
11579 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a SET venteFacturable = SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, not venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
11580 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
11581 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
11582 DROP PROCEDURE insertFactureClient IF EXISTS
11583 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Panier".facturable\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
11584 DROP VIEW "Factures" IF EXISTS
11585 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
11586 DISCONNECT
11587 /*C530*/SET SCHEMA B
11588 DROP SCHEMA B CASCADE
11589 DISCONNECT
11590 /*C531*/SET SCHEMA B
11591 SET DATABASE COLLATION "French"
11592 SET DATABASE DEFAULT TABLE TYPE CACHED
11593 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
11594 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
11595 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
11596 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
11597 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
11598 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
11599 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
11600 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
11601 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
11602 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
11603 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
11604 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
11605 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
11606 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
11607 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
11608 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
11609 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
11610 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
11611 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
11612 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
11613 DISCONNECT
11614 /*C532*/SET SCHEMA B
11615 SET SCHEMA B
11616 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
11617 COMMIT
11618 INSERT INTO "Lieu" VALUES(1,'Gentioux')
11619 COMMIT
11620 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
11621 COMMIT
11622 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
11623 COMMIT
11624 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
11625 COMMIT
11626 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
11627 COMMIT
11628 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
11629 COMMIT
11630 INSERT INTO "Lieu" VALUES(7,'Tarnac')
11631 COMMIT
11632 INSERT INTO "Lieu" VALUES(8,'Felletin')
11633 COMMIT
11634 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
11635 COMMIT
11636 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
11637 COMMIT
11638 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
11639 COMMIT
11640 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
11641 COMMIT
11642 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
11643 COMMIT
11644 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
11645 COMMIT
11646 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
11647 COMMIT
11648 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
11649 COMMIT
11650 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
11651 COMMIT
11652 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
11653 COMMIT
11654 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
11655 COMMIT
11656 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
11657 COMMIT
11658 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
11659 COMMIT
11660 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
11661 COMMIT
11662 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
11663 COMMIT
11664 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
11665 COMMIT
11666 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
11667 COMMIT
11668 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
11669 COMMIT
11670 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
11671 COMMIT
11672 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
11673 COMMIT
11674 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
11675 COMMIT
11676 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
11677 COMMIT
11678 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
11679 COMMIT
11680 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
11681 COMMIT
11682 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
11683 COMMIT
11684 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
11685 COMMIT
11686 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
11687 COMMIT
11688 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
11689 COMMIT
11690 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
11691 COMMIT
11692 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
11693 COMMIT
11694 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
11695 COMMIT
11696 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
11697 COMMIT
11698 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
11699 COMMIT
11700 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
11701 COMMIT
11702 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
11703 COMMIT
11704 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
11705 COMMIT
11706 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
11707 COMMIT
11708 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
11709 COMMIT
11710 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
11711 COMMIT
11712 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
11713 COMMIT
11714 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
11715 COMMIT
11716 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
11717 COMMIT
11718 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
11719 COMMIT
11720 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
11721 COMMIT
11722 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
11723 COMMIT
11724 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
11725 COMMIT
11726 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
11727 COMMIT
11728 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
11729 COMMIT
11730 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,NULL)
11731 COMMIT
11732 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,NULL)
11733 COMMIT
11734 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,NULL)
11735 COMMIT
11736 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,NULL)
11737 COMMIT
11738 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
11739 COMMIT
11740 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
11741 COMMIT
11742 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
11743 COMMIT
11744 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
11745 COMMIT
11746 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
11747 COMMIT
11748 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
11749 COMMIT
11750 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
11751 COMMIT
11752 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
11753 COMMIT
11754 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
11755 COMMIT
11756 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
11757 COMMIT
11758 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
11759 COMMIT
11760 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
11761 COMMIT
11762 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
11763 COMMIT
11764 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
11765 COMMIT
11766 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
11767 COMMIT
11768 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
11769 COMMIT
11770 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
11771 COMMIT
11772 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
11773 COMMIT
11774 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
11775 COMMIT
11776 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
11777 COMMIT
11778 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
11779 COMMIT
11780 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
11781 COMMIT
11782 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
11783 COMMIT
11784 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
11785 COMMIT
11786 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
11787 COMMIT
11788 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
11789 COMMIT
11790 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
11791 COMMIT
11792 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
11793 COMMIT
11794 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
11795 COMMIT
11796 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
11797 COMMIT
11798 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
11799 COMMIT
11800 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
11801 COMMIT
11802 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
11803 COMMIT
11804 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
11805 COMMIT
11806 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
11807 COMMIT
11808 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
11809 COMMIT
11810 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
11811 COMMIT
11812 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
11813 COMMIT
11814 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
11815 COMMIT
11816 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
11817 COMMIT
11818 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
11819 COMMIT
11820 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
11821 COMMIT
11822 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
11823 COMMIT
11824 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
11825 COMMIT
11826 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
11827 COMMIT
11828 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
11829 COMMIT
11830 INSERT INTO "Vente" VALUES(0,10,1.000,0)
11831 COMMIT
11832 INSERT INTO "Vente" VALUES(1,14,2.000,1)
11833 COMMIT
11834 INSERT INTO "Vente" VALUES(2,11,3.000,0)
11835 COMMIT
11836 INSERT INTO "Vente" VALUES(3,16,4.000,2)
11837 COMMIT
11838 INSERT INTO "Vente" VALUES(4,10,1.000,3)
11839 COMMIT
11840 INSERT INTO "Vente" VALUES(5,14,2.000,4)
11841 COMMIT
11842 INSERT INTO "Vente" VALUES(6,11,1.000,3)
11843 COMMIT
11844 DISCONNECT
11845 /*C533*/SET SCHEMA B
11846 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
11847 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a SET venteFacturable = SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, not venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
11848 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
11849 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
11850 DROP PROCEDURE insertFactureClient IF EXISTS
11851 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND "Panier".facturable\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
11852 INSERT INTO "Facture" VALUES(0,'2025-04-30')
11853 DELETE FROM "Panier" WHERE ID=0
11854 DELETE FROM "Panier" WHERE ID=3
11855 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,0)
11856 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,0)
11857 COMMIT
11858 INSERT INTO "Facture" VALUES(1,'2025-04-30')
11859 DELETE FROM "Panier" WHERE ID=1
11860 DELETE FROM "Panier" WHERE ID=4
11861 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,1)
11862 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,1)
11863 COMMIT
11864 INSERT INTO "Facture" VALUES(2,'2025-04-30')
11865 DELETE FROM "Panier" WHERE ID=2
11866 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,2)
11867 COMMIT
11868 DROP VIEW "Factures" IF EXISTS
11869 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
11870 DISCONNECT
11871 /*C534*/SET SCHEMA B
11872 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
11873 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a SET venteFacturable = SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, not venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
11874 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
11875 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
11876 DROP PROCEDURE insertFactureClient IF EXISTS
11877 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND facturable\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
11878 DROP VIEW "Factures" IF EXISTS
11879 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
11880 DISCONNECT
11881 /*C535*/SET SCHEMA B
11882 DROP SCHEMA B CASCADE
11883 DISCONNECT
11884 /*C536*/SET SCHEMA B
11885 SET DATABASE COLLATION "French"
11886 SET DATABASE DEFAULT TABLE TYPE CACHED
11887 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
11888 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
11889 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
11890 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
11891 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
11892 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
11893 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
11894 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
11895 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
11896 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
11897 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
11898 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
11899 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
11900 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
11901 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
11902 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
11903 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
11904 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
11905 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
11906 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
11907 DISCONNECT
11908 /*C537*/SET SCHEMA B
11909 SET SCHEMA B
11910 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
11911 COMMIT
11912 INSERT INTO "Lieu" VALUES(1,'Gentioux')
11913 COMMIT
11914 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
11915 COMMIT
11916 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
11917 COMMIT
11918 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
11919 COMMIT
11920 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
11921 COMMIT
11922 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
11923 COMMIT
11924 INSERT INTO "Lieu" VALUES(7,'Tarnac')
11925 COMMIT
11926 INSERT INTO "Lieu" VALUES(8,'Felletin')
11927 COMMIT
11928 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
11929 COMMIT
11930 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
11931 COMMIT
11932 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
11933 COMMIT
11934 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
11935 COMMIT
11936 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
11937 COMMIT
11938 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
11939 COMMIT
11940 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
11941 COMMIT
11942 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
11943 COMMIT
11944 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
11945 COMMIT
11946 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
11947 COMMIT
11948 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
11949 COMMIT
11950 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
11951 COMMIT
11952 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
11953 COMMIT
11954 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
11955 COMMIT
11956 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
11957 COMMIT
11958 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
11959 COMMIT
11960 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
11961 COMMIT
11962 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
11963 COMMIT
11964 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
11965 COMMIT
11966 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
11967 COMMIT
11968 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
11969 COMMIT
11970 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
11971 COMMIT
11972 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
11973 COMMIT
11974 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
11975 COMMIT
11976 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
11977 COMMIT
11978 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
11979 COMMIT
11980 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
11981 COMMIT
11982 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
11983 COMMIT
11984 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
11985 COMMIT
11986 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
11987 COMMIT
11988 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
11989 COMMIT
11990 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
11991 COMMIT
11992 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
11993 COMMIT
11994 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
11995 COMMIT
11996 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
11997 COMMIT
11998 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
11999 COMMIT
12000 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
12001 COMMIT
12002 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
12003 COMMIT
12004 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
12005 COMMIT
12006 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
12007 COMMIT
12008 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
12009 COMMIT
12010 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
12011 COMMIT
12012 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
12013 COMMIT
12014 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
12015 COMMIT
12016 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
12017 COMMIT
12018 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
12019 COMMIT
12020 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
12021 COMMIT
12022 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
12023 COMMIT
12024 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,NULL)
12025 COMMIT
12026 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,NULL)
12027 COMMIT
12028 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,NULL)
12029 COMMIT
12030 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,NULL)
12031 COMMIT
12032 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
12033 COMMIT
12034 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
12035 COMMIT
12036 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
12037 COMMIT
12038 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
12039 COMMIT
12040 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
12041 COMMIT
12042 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
12043 COMMIT
12044 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
12045 COMMIT
12046 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
12047 COMMIT
12048 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
12049 COMMIT
12050 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
12051 COMMIT
12052 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
12053 COMMIT
12054 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
12055 COMMIT
12056 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
12057 COMMIT
12058 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
12059 COMMIT
12060 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
12061 COMMIT
12062 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
12063 COMMIT
12064 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
12065 COMMIT
12066 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
12067 COMMIT
12068 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
12069 COMMIT
12070 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
12071 COMMIT
12072 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
12073 COMMIT
12074 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
12075 COMMIT
12076 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
12077 COMMIT
12078 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
12079 COMMIT
12080 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
12081 COMMIT
12082 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
12083 COMMIT
12084 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
12085 COMMIT
12086 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
12087 COMMIT
12088 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
12089 COMMIT
12090 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
12091 COMMIT
12092 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
12093 COMMIT
12094 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
12095 COMMIT
12096 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
12097 COMMIT
12098 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
12099 COMMIT
12100 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
12101 COMMIT
12102 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
12103 COMMIT
12104 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
12105 COMMIT
12106 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
12107 COMMIT
12108 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
12109 COMMIT
12110 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
12111 COMMIT
12112 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
12113 COMMIT
12114 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
12115 COMMIT
12116 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
12117 COMMIT
12118 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
12119 COMMIT
12120 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
12121 COMMIT
12122 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
12123 COMMIT
12124 INSERT INTO "Vente" VALUES(0,10,1.000,0)
12125 COMMIT
12126 INSERT INTO "Vente" VALUES(1,14,2.000,1)
12127 COMMIT
12128 INSERT INTO "Vente" VALUES(2,11,3.000,0)
12129 COMMIT
12130 INSERT INTO "Vente" VALUES(3,16,4.000,2)
12131 COMMIT
12132 INSERT INTO "Vente" VALUES(4,10,1.000,3)
12133 COMMIT
12134 INSERT INTO "Vente" VALUES(5,14,2.000,4)
12135 COMMIT
12136 INSERT INTO "Vente" VALUES(6,11,1.000,3)
12137 COMMIT
12138 DISCONNECT
12139 /*C538*/SET SCHEMA B
12140 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
12141 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a SET venteFacturable = SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, not venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
12142 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
12143 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
12144 DROP PROCEDURE insertFactureClient IF EXISTS
12145 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a AND facturable\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
12146 INSERT INTO "Facture" VALUES(0,'2025-04-30')
12147 DELETE FROM "Panier" WHERE ID=0
12148 DELETE FROM "Panier" WHERE ID=3
12149 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,0)
12150 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,0)
12151 COMMIT
12152 INSERT INTO "Facture" VALUES(1,'2025-04-30')
12153 DELETE FROM "Panier" WHERE ID=1
12154 DELETE FROM "Panier" WHERE ID=4
12155 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,1)
12156 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,1)
12157 COMMIT
12158 INSERT INTO "Facture" VALUES(2,'2025-04-30')
12159 DELETE FROM "Panier" WHERE ID=2
12160 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,2)
12161 COMMIT
12162 DROP VIEW "Factures" IF EXISTS
12163 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
12164 DISCONNECT
12165 /*C539*/SET SCHEMA B
12166 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
12167 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a SET venteFacturable = SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, not venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
12168 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
12169 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
12170 DROP PROCEDURE insertFactureClient IF EXISTS
12171 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
12172 DROP VIEW "Factures" IF EXISTS
12173 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
12174 DISCONNECT
12175 /*C540*/SET SCHEMA B
12176 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
12177 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a SET venteFacturable = SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, not venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
12178 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
12179 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
12180 DROP PROCEDURE insertFactureClient IF EXISTS
12181 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
12182 DROP VIEW "Factures" IF EXISTS
12183 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
12184 DISCONNECT
12185 /*C541*/SET SCHEMA B
12186 DROP SCHEMA B CASCADE
12187 DISCONNECT
12188 /*C542*/SET SCHEMA B
12189 SET DATABASE COLLATION "French"
12190 SET DATABASE DEFAULT TABLE TYPE CACHED
12191 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
12192 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
12193 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
12194 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
12195 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
12196 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
12197 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
12198 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
12199 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
12200 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
12201 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
12202 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
12203 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facturable BOOLEAN DEFAULT FALSE NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
12204 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
12205 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
12206 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
12207 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
12208 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
12209 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
12210 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
12211 DISCONNECT
12212 /*C543*/SET SCHEMA B
12213 SET SCHEMA B
12214 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
12215 COMMIT
12216 INSERT INTO "Lieu" VALUES(1,'Gentioux')
12217 COMMIT
12218 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
12219 COMMIT
12220 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
12221 COMMIT
12222 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
12223 COMMIT
12224 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
12225 COMMIT
12226 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
12227 COMMIT
12228 INSERT INTO "Lieu" VALUES(7,'Tarnac')
12229 COMMIT
12230 INSERT INTO "Lieu" VALUES(8,'Felletin')
12231 COMMIT
12232 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
12233 COMMIT
12234 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
12235 COMMIT
12236 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
12237 COMMIT
12238 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
12239 COMMIT
12240 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
12241 COMMIT
12242 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
12243 COMMIT
12244 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
12245 COMMIT
12246 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
12247 COMMIT
12248 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
12249 COMMIT
12250 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
12251 COMMIT
12252 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
12253 COMMIT
12254 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
12255 COMMIT
12256 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
12257 COMMIT
12258 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
12259 COMMIT
12260 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
12261 COMMIT
12262 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
12263 COMMIT
12264 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
12265 COMMIT
12266 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
12267 COMMIT
12268 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
12269 COMMIT
12270 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
12271 COMMIT
12272 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
12273 COMMIT
12274 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
12275 COMMIT
12276 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
12277 COMMIT
12278 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
12279 COMMIT
12280 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
12281 COMMIT
12282 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
12283 COMMIT
12284 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
12285 COMMIT
12286 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
12287 COMMIT
12288 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
12289 COMMIT
12290 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
12291 COMMIT
12292 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
12293 COMMIT
12294 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
12295 COMMIT
12296 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
12297 COMMIT
12298 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
12299 COMMIT
12300 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
12301 COMMIT
12302 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
12303 COMMIT
12304 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
12305 COMMIT
12306 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
12307 COMMIT
12308 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
12309 COMMIT
12310 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
12311 COMMIT
12312 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
12313 COMMIT
12314 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
12315 COMMIT
12316 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
12317 COMMIT
12318 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
12319 COMMIT
12320 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
12321 COMMIT
12322 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
12323 COMMIT
12324 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
12325 COMMIT
12326 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
12327 COMMIT
12328 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,FALSE,NULL)
12329 COMMIT
12330 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,FALSE,NULL)
12331 COMMIT
12332 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,FALSE,NULL)
12333 COMMIT
12334 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,FALSE,NULL)
12335 COMMIT
12336 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,FALSE,NULL)
12337 COMMIT
12338 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
12339 COMMIT
12340 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
12341 COMMIT
12342 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
12343 COMMIT
12344 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
12345 COMMIT
12346 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
12347 COMMIT
12348 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
12349 COMMIT
12350 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
12351 COMMIT
12352 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
12353 COMMIT
12354 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
12355 COMMIT
12356 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
12357 COMMIT
12358 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
12359 COMMIT
12360 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
12361 COMMIT
12362 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
12363 COMMIT
12364 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
12365 COMMIT
12366 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
12367 COMMIT
12368 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
12369 COMMIT
12370 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
12371 COMMIT
12372 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
12373 COMMIT
12374 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
12375 COMMIT
12376 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
12377 COMMIT
12378 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
12379 COMMIT
12380 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
12381 COMMIT
12382 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
12383 COMMIT
12384 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
12385 COMMIT
12386 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
12387 COMMIT
12388 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
12389 COMMIT
12390 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
12391 COMMIT
12392 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
12393 COMMIT
12394 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
12395 COMMIT
12396 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
12397 COMMIT
12398 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
12399 COMMIT
12400 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
12401 COMMIT
12402 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
12403 COMMIT
12404 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
12405 COMMIT
12406 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
12407 COMMIT
12408 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
12409 COMMIT
12410 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
12411 COMMIT
12412 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
12413 COMMIT
12414 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
12415 COMMIT
12416 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
12417 COMMIT
12418 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
12419 COMMIT
12420 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
12421 COMMIT
12422 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
12423 COMMIT
12424 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
12425 COMMIT
12426 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
12427 COMMIT
12428 INSERT INTO "Vente" VALUES(0,10,1.000,0)
12429 COMMIT
12430 INSERT INTO "Vente" VALUES(1,14,2.000,1)
12431 COMMIT
12432 INSERT INTO "Vente" VALUES(2,11,3.000,0)
12433 COMMIT
12434 INSERT INTO "Vente" VALUES(3,16,4.000,2)
12435 COMMIT
12436 INSERT INTO "Vente" VALUES(4,10,1.000,3)
12437 COMMIT
12438 INSERT INTO "Vente" VALUES(5,14,2.000,4)
12439 COMMIT
12440 INSERT INTO "Vente" VALUES(6,11,1.000,3)
12441 COMMIT
12442 DISCONNECT
12443 /*C544*/SET SCHEMA B
12444 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
12445 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a SET venteFacturable = SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, not venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
12446 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
12447 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
12448 DROP PROCEDURE insertFactureClient IF EXISTS
12449 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
12450 DROP VIEW "Factures" IF EXISTS
12451 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
12452 DISCONNECT
12453 /*C545*/SET SCHEMA B
12454 DROP SCHEMA B CASCADE
12455 DISCONNECT
12456 /*C546*/SET SCHEMA B
12457 SET DATABASE COLLATION "French"
12458 SET DATABASE DEFAULT TABLE TYPE CACHED
12459 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
12460 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
12461 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
12462 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
12463 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
12464 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
12465 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
12466 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
12467 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
12468 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
12469 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
12470 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
12471 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facturable BOOLEAN DEFAULT FALSE NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
12472 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
12473 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
12474 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
12475 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
12476 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
12477 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
12478 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
12479 DISCONNECT
12480 /*C547*/SET SCHEMA B
12481 SET SCHEMA B
12482 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
12483 COMMIT
12484 INSERT INTO "Lieu" VALUES(1,'Gentioux')
12485 COMMIT
12486 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
12487 COMMIT
12488 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
12489 COMMIT
12490 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
12491 COMMIT
12492 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
12493 COMMIT
12494 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
12495 COMMIT
12496 INSERT INTO "Lieu" VALUES(7,'Tarnac')
12497 COMMIT
12498 INSERT INTO "Lieu" VALUES(8,'Felletin')
12499 COMMIT
12500 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
12501 COMMIT
12502 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
12503 COMMIT
12504 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
12505 COMMIT
12506 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
12507 COMMIT
12508 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
12509 COMMIT
12510 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
12511 COMMIT
12512 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
12513 COMMIT
12514 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
12515 COMMIT
12516 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
12517 COMMIT
12518 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
12519 COMMIT
12520 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
12521 COMMIT
12522 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
12523 COMMIT
12524 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
12525 COMMIT
12526 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
12527 COMMIT
12528 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
12529 COMMIT
12530 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
12531 COMMIT
12532 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
12533 COMMIT
12534 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
12535 COMMIT
12536 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
12537 COMMIT
12538 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
12539 COMMIT
12540 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
12541 COMMIT
12542 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
12543 COMMIT
12544 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
12545 COMMIT
12546 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
12547 COMMIT
12548 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
12549 COMMIT
12550 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
12551 COMMIT
12552 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
12553 COMMIT
12554 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
12555 COMMIT
12556 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
12557 COMMIT
12558 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
12559 COMMIT
12560 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
12561 COMMIT
12562 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
12563 COMMIT
12564 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
12565 COMMIT
12566 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
12567 COMMIT
12568 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
12569 COMMIT
12570 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
12571 COMMIT
12572 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
12573 COMMIT
12574 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
12575 COMMIT
12576 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
12577 COMMIT
12578 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
12579 COMMIT
12580 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
12581 COMMIT
12582 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
12583 COMMIT
12584 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
12585 COMMIT
12586 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
12587 COMMIT
12588 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
12589 COMMIT
12590 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
12591 COMMIT
12592 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
12593 COMMIT
12594 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
12595 COMMIT
12596 DISCONNECT
12597 /*C548*/SET SCHEMA B
12598 DROP SCHEMA B CASCADE
12599 DISCONNECT
12600 /*C549*/SET SCHEMA B
12601 SET DATABASE COLLATION "French"
12602 SET DATABASE DEFAULT TABLE TYPE CACHED
12603 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
12604 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
12605 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
12606 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
12607 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
12608 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
12609 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
12610 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
12611 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
12612 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
12613 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
12614 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
12615 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facturable BOOLEAN DEFAULT FALSE NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
12616 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
12617 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
12618 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
12619 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
12620 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
12621 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
12622 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
12623 DISCONNECT
12624 /*C550*/SET SCHEMA B
12625 SET SCHEMA B
12626 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
12627 COMMIT
12628 INSERT INTO "Lieu" VALUES(1,'Gentioux')
12629 COMMIT
12630 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
12631 COMMIT
12632 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
12633 COMMIT
12634 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
12635 COMMIT
12636 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
12637 COMMIT
12638 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
12639 COMMIT
12640 INSERT INTO "Lieu" VALUES(7,'Tarnac')
12641 COMMIT
12642 INSERT INTO "Lieu" VALUES(8,'Felletin')
12643 COMMIT
12644 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
12645 COMMIT
12646 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
12647 COMMIT
12648 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
12649 COMMIT
12650 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
12651 COMMIT
12652 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
12653 COMMIT
12654 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
12655 COMMIT
12656 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
12657 COMMIT
12658 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
12659 COMMIT
12660 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
12661 COMMIT
12662 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
12663 COMMIT
12664 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
12665 COMMIT
12666 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
12667 COMMIT
12668 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
12669 COMMIT
12670 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
12671 COMMIT
12672 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
12673 COMMIT
12674 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
12675 COMMIT
12676 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
12677 COMMIT
12678 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
12679 COMMIT
12680 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
12681 COMMIT
12682 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
12683 COMMIT
12684 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
12685 COMMIT
12686 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
12687 COMMIT
12688 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
12689 COMMIT
12690 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
12691 COMMIT
12692 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
12693 COMMIT
12694 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
12695 COMMIT
12696 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
12697 COMMIT
12698 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
12699 COMMIT
12700 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
12701 COMMIT
12702 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
12703 COMMIT
12704 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
12705 COMMIT
12706 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
12707 COMMIT
12708 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
12709 COMMIT
12710 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
12711 COMMIT
12712 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
12713 COMMIT
12714 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
12715 COMMIT
12716 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
12717 COMMIT
12718 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
12719 COMMIT
12720 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
12721 COMMIT
12722 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
12723 COMMIT
12724 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
12725 COMMIT
12726 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
12727 COMMIT
12728 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
12729 COMMIT
12730 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
12731 COMMIT
12732 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
12733 COMMIT
12734 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
12735 COMMIT
12736 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
12737 COMMIT
12738 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
12739 COMMIT
12740 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
12741 COMMIT
12742 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
12743 COMMIT
12744 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
12745 COMMIT
12746 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
12747 COMMIT
12748 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
12749 COMMIT
12750 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
12751 COMMIT
12752 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
12753 COMMIT
12754 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
12755 COMMIT
12756 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
12757 COMMIT
12758 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
12759 COMMIT
12760 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
12761 COMMIT
12762 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
12763 COMMIT
12764 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
12765 COMMIT
12766 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
12767 COMMIT
12768 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
12769 COMMIT
12770 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
12771 COMMIT
12772 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
12773 COMMIT
12774 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
12775 COMMIT
12776 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
12777 COMMIT
12778 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
12779 COMMIT
12780 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
12781 COMMIT
12782 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
12783 COMMIT
12784 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
12785 COMMIT
12786 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
12787 COMMIT
12788 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
12789 COMMIT
12790 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
12791 COMMIT
12792 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
12793 COMMIT
12794 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
12795 COMMIT
12796 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
12797 COMMIT
12798 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
12799 COMMIT
12800 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
12801 COMMIT
12802 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
12803 COMMIT
12804 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
12805 COMMIT
12806 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
12807 COMMIT
12808 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
12809 COMMIT
12810 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
12811 COMMIT
12812 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
12813 COMMIT
12814 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
12815 COMMIT
12816 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
12817 COMMIT
12818 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
12819 COMMIT
12820 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
12821 COMMIT
12822 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
12823 COMMIT
12824 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
12825 COMMIT
12826 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
12827 COMMIT
12828 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
12829 COMMIT
12830 DISCONNECT
12831 /*C551*/SET SCHEMA B
12832 DROP SCHEMA B CASCADE
12833 DISCONNECT
12834 /*C552*/SET SCHEMA B
12835 SET DATABASE COLLATION "French"
12836 SET DATABASE DEFAULT TABLE TYPE CACHED
12837 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
12838 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
12839 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
12840 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
12841 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
12842 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
12843 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
12844 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
12845 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
12846 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
12847 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
12848 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
12849 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facturable BOOLEAN DEFAULT FALSE NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
12850 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
12851 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
12852 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
12853 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
12854 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
12855 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
12856 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
12857 DISCONNECT
12858 /*C553*/SET SCHEMA B
12859 SET SCHEMA B
12860 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
12861 COMMIT
12862 INSERT INTO "Lieu" VALUES(1,'Gentioux')
12863 COMMIT
12864 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
12865 COMMIT
12866 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
12867 COMMIT
12868 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
12869 COMMIT
12870 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
12871 COMMIT
12872 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
12873 COMMIT
12874 INSERT INTO "Lieu" VALUES(7,'Tarnac')
12875 COMMIT
12876 INSERT INTO "Lieu" VALUES(8,'Felletin')
12877 COMMIT
12878 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
12879 COMMIT
12880 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
12881 COMMIT
12882 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
12883 COMMIT
12884 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
12885 COMMIT
12886 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
12887 COMMIT
12888 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
12889 COMMIT
12890 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
12891 COMMIT
12892 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
12893 COMMIT
12894 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
12895 COMMIT
12896 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
12897 COMMIT
12898 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
12899 COMMIT
12900 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
12901 COMMIT
12902 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
12903 COMMIT
12904 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
12905 COMMIT
12906 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
12907 COMMIT
12908 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
12909 COMMIT
12910 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
12911 COMMIT
12912 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
12913 COMMIT
12914 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
12915 COMMIT
12916 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
12917 COMMIT
12918 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
12919 COMMIT
12920 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
12921 COMMIT
12922 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
12923 COMMIT
12924 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
12925 COMMIT
12926 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
12927 COMMIT
12928 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
12929 COMMIT
12930 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
12931 COMMIT
12932 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
12933 COMMIT
12934 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
12935 COMMIT
12936 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
12937 COMMIT
12938 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
12939 COMMIT
12940 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
12941 COMMIT
12942 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
12943 COMMIT
12944 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
12945 COMMIT
12946 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
12947 COMMIT
12948 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
12949 COMMIT
12950 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
12951 COMMIT
12952 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
12953 COMMIT
12954 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
12955 COMMIT
12956 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
12957 COMMIT
12958 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
12959 COMMIT
12960 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
12961 COMMIT
12962 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
12963 COMMIT
12964 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
12965 COMMIT
12966 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
12967 COMMIT
12968 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
12969 COMMIT
12970 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
12971 COMMIT
12972 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
12973 COMMIT
12974 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,FALSE,NULL)
12975 COMMIT
12976 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,FALSE,NULL)
12977 COMMIT
12978 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,FALSE,NULL)
12979 COMMIT
12980 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,FALSE,NULL)
12981 COMMIT
12982 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,FALSE,NULL)
12983 COMMIT
12984 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
12985 COMMIT
12986 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
12987 COMMIT
12988 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
12989 COMMIT
12990 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
12991 COMMIT
12992 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
12993 COMMIT
12994 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
12995 COMMIT
12996 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
12997 COMMIT
12998 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
12999 COMMIT
13000 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
13001 COMMIT
13002 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
13003 COMMIT
13004 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
13005 COMMIT
13006 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
13007 COMMIT
13008 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
13009 COMMIT
13010 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
13011 COMMIT
13012 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
13013 COMMIT
13014 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
13015 COMMIT
13016 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
13017 COMMIT
13018 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
13019 COMMIT
13020 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
13021 COMMIT
13022 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
13023 COMMIT
13024 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
13025 COMMIT
13026 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
13027 COMMIT
13028 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
13029 COMMIT
13030 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
13031 COMMIT
13032 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
13033 COMMIT
13034 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
13035 COMMIT
13036 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
13037 COMMIT
13038 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
13039 COMMIT
13040 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
13041 COMMIT
13042 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
13043 COMMIT
13044 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
13045 COMMIT
13046 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
13047 COMMIT
13048 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
13049 COMMIT
13050 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
13051 COMMIT
13052 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
13053 COMMIT
13054 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
13055 COMMIT
13056 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
13057 COMMIT
13058 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
13059 COMMIT
13060 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
13061 COMMIT
13062 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
13063 COMMIT
13064 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
13065 COMMIT
13066 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
13067 COMMIT
13068 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
13069 COMMIT
13070 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
13071 COMMIT
13072 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
13073 COMMIT
13074 INSERT INTO "Vente" VALUES(0,10,1.000,0)
13075 COMMIT
13076 INSERT INTO "Vente" VALUES(1,14,2.000,1)
13077 COMMIT
13078 INSERT INTO "Vente" VALUES(2,11,3.000,0)
13079 COMMIT
13080 INSERT INTO "Vente" VALUES(3,16,4.000,2)
13081 COMMIT
13082 INSERT INTO "Vente" VALUES(4,10,1.000,3)
13083 COMMIT
13084 INSERT INTO "Vente" VALUES(5,14,2.000,4)
13085 COMMIT
13086 INSERT INTO "Vente" VALUES(6,11,1.000,3)
13087 COMMIT
13088 DISCONNECT
13089 /*C554*/SET SCHEMA B
13090 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13091 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a SET venteFacturable = SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, not venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13092 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13093 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13094 DROP PROCEDURE insertFactureClient IF EXISTS
13095 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13096 DROP VIEW "Factures" IF EXISTS
13097 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13098 DISCONNECT
13099 /*C555*/SET SCHEMA B
13100 DROP SCHEMA B CASCADE
13101 DISCONNECT
13102 /*C556*/SET SCHEMA B
13103 SET DATABASE COLLATION "French"
13104 SET DATABASE DEFAULT TABLE TYPE CACHED
13105 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
13106 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
13107 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
13108 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
13109 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
13110 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
13111 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
13112 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
13113 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
13114 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
13115 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
13116 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
13117 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facturable BOOLEAN DEFAULT FALSE NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
13118 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
13119 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
13120 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
13121 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
13122 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
13123 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
13124 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
13125 DISCONNECT
13126 /*C557*/SET SCHEMA B
13127 SET SCHEMA B
13128 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
13129 COMMIT
13130 INSERT INTO "Lieu" VALUES(1,'Gentioux')
13131 COMMIT
13132 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
13133 COMMIT
13134 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
13135 COMMIT
13136 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
13137 COMMIT
13138 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
13139 COMMIT
13140 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
13141 COMMIT
13142 INSERT INTO "Lieu" VALUES(7,'Tarnac')
13143 COMMIT
13144 INSERT INTO "Lieu" VALUES(8,'Felletin')
13145 COMMIT
13146 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
13147 COMMIT
13148 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
13149 COMMIT
13150 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
13151 COMMIT
13152 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
13153 COMMIT
13154 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
13155 COMMIT
13156 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
13157 COMMIT
13158 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
13159 COMMIT
13160 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
13161 COMMIT
13162 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
13163 COMMIT
13164 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
13165 COMMIT
13166 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
13167 COMMIT
13168 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
13169 COMMIT
13170 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
13171 COMMIT
13172 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
13173 COMMIT
13174 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
13175 COMMIT
13176 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
13177 COMMIT
13178 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
13179 COMMIT
13180 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
13181 COMMIT
13182 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
13183 COMMIT
13184 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
13185 COMMIT
13186 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
13187 COMMIT
13188 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
13189 COMMIT
13190 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
13191 COMMIT
13192 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
13193 COMMIT
13194 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
13195 COMMIT
13196 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
13197 COMMIT
13198 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
13199 COMMIT
13200 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
13201 COMMIT
13202 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
13203 COMMIT
13204 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
13205 COMMIT
13206 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
13207 COMMIT
13208 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
13209 COMMIT
13210 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
13211 COMMIT
13212 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
13213 COMMIT
13214 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
13215 COMMIT
13216 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
13217 COMMIT
13218 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
13219 COMMIT
13220 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
13221 COMMIT
13222 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
13223 COMMIT
13224 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
13225 COMMIT
13226 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
13227 COMMIT
13228 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
13229 COMMIT
13230 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
13231 COMMIT
13232 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
13233 COMMIT
13234 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
13235 COMMIT
13236 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
13237 COMMIT
13238 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
13239 COMMIT
13240 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
13241 COMMIT
13242 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,FALSE,NULL)
13243 COMMIT
13244 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,FALSE,NULL)
13245 COMMIT
13246 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,FALSE,NULL)
13247 COMMIT
13248 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,FALSE,NULL)
13249 COMMIT
13250 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
13251 COMMIT
13252 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
13253 COMMIT
13254 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
13255 COMMIT
13256 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
13257 COMMIT
13258 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
13259 COMMIT
13260 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
13261 COMMIT
13262 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
13263 COMMIT
13264 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
13265 COMMIT
13266 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
13267 COMMIT
13268 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
13269 COMMIT
13270 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
13271 COMMIT
13272 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
13273 COMMIT
13274 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
13275 COMMIT
13276 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
13277 COMMIT
13278 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
13279 COMMIT
13280 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
13281 COMMIT
13282 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
13283 COMMIT
13284 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
13285 COMMIT
13286 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
13287 COMMIT
13288 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
13289 COMMIT
13290 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
13291 COMMIT
13292 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
13293 COMMIT
13294 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
13295 COMMIT
13296 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
13297 COMMIT
13298 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
13299 COMMIT
13300 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
13301 COMMIT
13302 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
13303 COMMIT
13304 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
13305 COMMIT
13306 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
13307 COMMIT
13308 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
13309 COMMIT
13310 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
13311 COMMIT
13312 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
13313 COMMIT
13314 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
13315 COMMIT
13316 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
13317 COMMIT
13318 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
13319 COMMIT
13320 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
13321 COMMIT
13322 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
13323 COMMIT
13324 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
13325 COMMIT
13326 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
13327 COMMIT
13328 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
13329 COMMIT
13330 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
13331 COMMIT
13332 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
13333 COMMIT
13334 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
13335 COMMIT
13336 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
13337 COMMIT
13338 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
13339 COMMIT
13340 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
13341 COMMIT
13342 INSERT INTO "Vente" VALUES(0,10,1.000,0)
13343 COMMIT
13344 INSERT INTO "Vente" VALUES(1,14,2.000,1)
13345 COMMIT
13346 INSERT INTO "Vente" VALUES(2,11,3.000,0)
13347 COMMIT
13348 INSERT INTO "Vente" VALUES(3,16,4.000,2)
13349 COMMIT
13350 INSERT INTO "Vente" VALUES(4,10,1.000,3)
13351 COMMIT
13352 INSERT INTO "Vente" VALUES(5,14,2.000,4)
13353 COMMIT
13354 INSERT INTO "Vente" VALUES(6,11,1.000,3)
13355 COMMIT
13356 DISCONNECT
13357 /*C558*/SET SCHEMA B
13358 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13359 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a SET venteFacturable = SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, not venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13360 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13361 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13362 DROP PROCEDURE insertFactureClient IF EXISTS
13363 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13364 INSERT INTO "Facture" VALUES(0,'2025-04-30')
13365 DELETE FROM "Panier" WHERE ID=1
13366 DELETE FROM "Panier" WHERE ID=4
13367 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,FALSE,0)
13368 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,0)
13369 COMMIT
13370 DROP VIEW "Factures" IF EXISTS
13371 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13372 DISCONNECT
13373 /*C559*/SET SCHEMA B
13374 DISCONNECT
13375 /*C560*/SET SCHEMA B
13376 DISCONNECT
13377 /*C561*/SET SCHEMA B
13378 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13379 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13380 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13381 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13382 DROP PROCEDURE insertFactureClient IF EXISTS
13383 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13384 DROP VIEW "Factures" IF EXISTS
13385 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13386 DISCONNECT
13387 /*C562*/SET SCHEMA B
13388 SET SCHEMA B
13389 DISCONNECT
13390 /*C563*/SET SCHEMA B
13391 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13392 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13393 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13394 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13395 DROP PROCEDURE insertFactureClient IF EXISTS
13396 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13397 DROP VIEW "Factures" IF EXISTS
13398 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13399 DISCONNECT
13400 /*C564*/SET SCHEMA B
13401 DROP SCHEMA B CASCADE
13402 DISCONNECT
13403 /*C565*/SET SCHEMA B
13404 SET DATABASE COLLATION "French"
13405 SET DATABASE DEFAULT TABLE TYPE CACHED
13406 CREATE CACHED TABLE "Produit"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , unit\u00e9 VARCHAR(100)\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , conditionnement VARCHAR(100)\u000a , CONSTRAINT "PK_Produit" PRIMARY KEY(ID)\u000a , CONSTRAINT "La combinaison (nom, quantit\u00e9, conditionnement) d'un produit doit \u00eatre unique"\u000a UNIQUE (nom, quantit\u00e9, conditionnement)\u000a )
13407 DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
13408 CREATE FUNCTION choisirUnProduit()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' ('\u000a || RTRIM(RTRIM(TO_CHAR(quantit\u00e9),'0'),'.')\u000a || nvl(unit\u00e9,'')\u000a || ')'\u000a AS nom_complet\u000a , ID\u000a FROM "Produit"\u000a );\u000a END
13409 CREATE CACHED TABLE "Ingr\u00e9dient"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , conso INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID)\u000a , CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a , CONSTRAINT "FK_Ingr\u00e9dient_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Ingr\u00e9dient_conso"\u000a FOREIGN KEY(conso)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
13410 CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
13411 CREATE CACHED TABLE "Lieu"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)\u000a )
13412 CREATE CACHED TABLE "Client"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , t\u00e9l VARCHAR(100) DEFAULT NULL\u000a , m\u00e9l VARCHAR(100) DEFAULT NULL\u000a , facturable BOOLEAN DEFAULT TRUE NOT NULL\u000a , CONSTRAINT "PK_Client" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Client_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
13413 DROP FUNCTION choisirUnClient IF EXISTS CASCADE
13414 CREATE FUNCTION choisirUnClient()\u000a RETURNS TABLE(nom_complet VARCHAR(100), ID INTEGER)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT nom || ' (' || "Lieu".nom || ')' AS nom_complet\u000a , ID\u000a FROM "Client"\u000a JOIN "Lieu" ON "Lieu".ID = "Client".lieu\u000a );\u000a END
13415 CREATE CACHED TABLE "P\u00e9riode"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , nom VARCHAR(100) NOT NULL\u000a , CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)\u000a )
13416 CREATE CACHED TABLE "Abonnement"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , client INTEGER NOT NULL\u000a , lieu INTEGER\u000a , p\u00e9riode INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Abonnement_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON DELETE CASCADE\u000a , CONSTRAINT "FK_Abonnement_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_p\u00e9riode"\u000a FOREIGN KEY(p\u00e9riode)\u000a REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Abonnement_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a )
13417 CREATE CACHED TABLE "Facture"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , CONSTRAINT "PK_Facture" PRIMARY KEY(ID)\u000a )
13418 CREATE CACHED TABLE "Panier"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , client INTEGER NOT NULL\u000a , facturable BOOLEAN DEFAULT FALSE NOT NULL\u000a , facture INTEGER\u000a , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Panier_facture"\u000a FOREIGN KEY(facture)\u000a REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Panier_client"\u000a FOREIGN KEY(client)\u000a REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE\u000a )
13419 CREATE CACHED TABLE "Vente"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , panier INTEGER NOT NULL\u000a , CONSTRAINT "PK_Vente" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Vente_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Vente_panier"\u000a FOREIGN KEY(panier)\u000a REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, panier) d'une vente doit \u00eatre unique"\u000a UNIQUE (produit, panier)\u000a )
13420 CREATE CACHED TABLE "Stock"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , lieu INTEGER NOT NULL\u000a , produit INTEGER NOT NULL\u000a , quantit\u00e9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL\u000a , CONSTRAINT "PK_Stock" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Stock_lieu"\u000a FOREIGN KEY(lieu)\u000a REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "FK_Stock_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a )
13421 CREATE CACHED TABLE "Prix"\u000a ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL\u000a , date DATE DEFAULT CURRENT_DATE NOT NULL\u000a , produit INTEGER NOT NULL\u000a , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL\u000a , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)\u000a , CONSTRAINT "FK_Prix_produit"\u000a FOREIGN KEY(produit)\u000a REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE\u000a , CONSTRAINT "La combinaison (produit, date) d'un prix doit \u00eatre unique"\u000a UNIQUE (produit, date)\u000a )
13422 DROP FUNCTION produit_maxdate IF EXISTS CASCADE
13423 CREATE FUNCTION produit_maxdate(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, max_date DATE)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT "Produit".ID as produit\u000a , MAX( date ) as max_date\u000a FROM "Prix"\u000a JOIN "Produit" ON "Produit".ID = "Prix".produit\u000a WHERE date <= at_date\u000a GROUP BY "Produit".ID\u000a );\u000a END
13424 DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
13425 CREATE FUNCTION prix_\u00e0_date(IN at_date DATE)\u000a RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)\u000a READS SQL DATA\u000a BEGIN ATOMIC\u000a RETURN TABLE\u000a (SELECT produit, date, euros\u000a FROM TABLE (produit_maxdate(at_date)) as P\u000a JOIN "Prix" ON "Prix".produit = P.produit\u000a AND "Prix".date = P.max_date\u000a );\u000a END
13426 DISCONNECT
13427 /*C566*/SET SCHEMA B
13428 SET SCHEMA B
13429 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
13430 COMMIT
13431 INSERT INTO "Lieu" VALUES(1,'Gentioux')
13432 COMMIT
13433 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
13434 COMMIT
13435 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
13436 COMMIT
13437 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
13438 COMMIT
13439 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
13440 COMMIT
13441 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
13442 COMMIT
13443 INSERT INTO "Lieu" VALUES(7,'Tarnac')
13444 COMMIT
13445 INSERT INTO "Lieu" VALUES(8,'Felletin')
13446 COMMIT
13447 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
13448 COMMIT
13449 INSERT INTO "Facture" VALUES(0,'2025-04-30')
13450 COMMIT
13451 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
13452 COMMIT
13453 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
13454 COMMIT
13455 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
13456 COMMIT
13457 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
13458 COMMIT
13459 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
13460 COMMIT
13461 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
13462 COMMIT
13463 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
13464 COMMIT
13465 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
13466 COMMIT
13467 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
13468 COMMIT
13469 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
13470 COMMIT
13471 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
13472 COMMIT
13473 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
13474 COMMIT
13475 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
13476 COMMIT
13477 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
13478 COMMIT
13479 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
13480 COMMIT
13481 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
13482 COMMIT
13483 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
13484 COMMIT
13485 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
13486 COMMIT
13487 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
13488 COMMIT
13489 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
13490 COMMIT
13491 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
13492 COMMIT
13493 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
13494 COMMIT
13495 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
13496 COMMIT
13497 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
13498 COMMIT
13499 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
13500 COMMIT
13501 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
13502 COMMIT
13503 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
13504 COMMIT
13505 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
13506 COMMIT
13507 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
13508 COMMIT
13509 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
13510 COMMIT
13511 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
13512 COMMIT
13513 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
13514 COMMIT
13515 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
13516 COMMIT
13517 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
13518 COMMIT
13519 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
13520 COMMIT
13521 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
13522 COMMIT
13523 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
13524 COMMIT
13525 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
13526 COMMIT
13527 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
13528 COMMIT
13529 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
13530 COMMIT
13531 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
13532 COMMIT
13533 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
13534 COMMIT
13535 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
13536 COMMIT
13537 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
13538 COMMIT
13539 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
13540 COMMIT
13541 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
13542 COMMIT
13543 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
13544 COMMIT
13545 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,NULL)
13546 COMMIT
13547 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,NULL)
13548 COMMIT
13549 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,NULL)
13550 COMMIT
13551 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,NULL)
13552 COMMIT
13553 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
13554 COMMIT
13555 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
13556 COMMIT
13557 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
13558 COMMIT
13559 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
13560 COMMIT
13561 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
13562 COMMIT
13563 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
13564 COMMIT
13565 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
13566 COMMIT
13567 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
13568 COMMIT
13569 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
13570 COMMIT
13571 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
13572 COMMIT
13573 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
13574 COMMIT
13575 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
13576 COMMIT
13577 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
13578 COMMIT
13579 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
13580 COMMIT
13581 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
13582 COMMIT
13583 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
13584 COMMIT
13585 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
13586 COMMIT
13587 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
13588 COMMIT
13589 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
13590 COMMIT
13591 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
13592 COMMIT
13593 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
13594 COMMIT
13595 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
13596 COMMIT
13597 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
13598 COMMIT
13599 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
13600 COMMIT
13601 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
13602 COMMIT
13603 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
13604 COMMIT
13605 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
13606 COMMIT
13607 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
13608 COMMIT
13609 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
13610 COMMIT
13611 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
13612 COMMIT
13613 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
13614 COMMIT
13615 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
13616 COMMIT
13617 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
13618 COMMIT
13619 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
13620 COMMIT
13621 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
13622 COMMIT
13623 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
13624 COMMIT
13625 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
13626 COMMIT
13627 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
13628 COMMIT
13629 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
13630 COMMIT
13631 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
13632 COMMIT
13633 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
13634 COMMIT
13635 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
13636 COMMIT
13637 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
13638 COMMIT
13639 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
13640 COMMIT
13641 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
13642 COMMIT
13643 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
13644 COMMIT
13645 INSERT INTO "Vente" VALUES(0,10,1.000,0)
13646 COMMIT
13647 INSERT INTO "Vente" VALUES(1,14,2.000,1)
13648 COMMIT
13649 INSERT INTO "Vente" VALUES(2,11,3.000,0)
13650 COMMIT
13651 INSERT INTO "Vente" VALUES(3,16,4.000,2)
13652 COMMIT
13653 INSERT INTO "Vente" VALUES(4,10,1.000,3)
13654 COMMIT
13655 INSERT INTO "Vente" VALUES(5,14,2.000,4)
13656 COMMIT
13657 INSERT INTO "Vente" VALUES(6,11,1.000,3)
13658 COMMIT
13659 DISCONNECT
13660 /*C567*/SET SCHEMA B
13661 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13662 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13663 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13664 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13665 DROP PROCEDURE insertFactureClient IF EXISTS
13666 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13667 INSERT INTO "Facture" VALUES(1,'2025-04-30')
13668 DELETE FROM "Panier" WHERE ID=0
13669 DELETE FROM "Panier" WHERE ID=3
13670 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,1)
13671 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,1)
13672 COMMIT
13673 INSERT INTO "Facture" VALUES(2,'2025-04-30')
13674 DELETE FROM "Panier" WHERE ID=1
13675 DELETE FROM "Panier" WHERE ID=4
13676 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,2)
13677 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,2)
13678 COMMIT
13679 INSERT INTO "Facture" VALUES(3,'2025-04-30')
13680 DELETE FROM "Panier" WHERE ID=2
13681 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,3)
13682 COMMIT
13683 DROP VIEW "Factures" IF EXISTS
13684 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13685 DISCONNECT
13686 /*C568*/SET SCHEMA B
13687 SET SCHEMA B
13688 DISCONNECT
13689 /*C569*/SET SCHEMA B
13690 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13691 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13692 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13693 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13694 DROP PROCEDURE insertFactureClient IF EXISTS
13695 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13696 DROP VIEW "Factures" IF EXISTS
13697 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13698 DISCONNECT
13699 /*C570*/SET SCHEMA B
13700 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13701 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13702 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13703 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13704 DROP PROCEDURE insertFactureClient IF EXISTS
13705 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13706 DROP VIEW "Factures" IF EXISTS
13707 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13708 DISCONNECT
13709 /*C571*/SET SCHEMA B
13710 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13711 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13712 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13713 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13714 DROP PROCEDURE insertFactureClient IF EXISTS
13715 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13716 DROP VIEW "Factures" IF EXISTS
13717 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13718 DISCONNECT
13719 /*C572*/SET SCHEMA B
13720 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13721 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13722 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13723 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13724 DROP PROCEDURE insertFactureClient IF EXISTS
13725 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13726 DROP VIEW "Factures" IF EXISTS
13727 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13728 DISCONNECT
13729 /*C573*/SET SCHEMA B
13730 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13731 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13732 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13733 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13734 DROP PROCEDURE insertFactureClient IF EXISTS
13735 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13736 DROP VIEW "Factures" IF EXISTS
13737 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13738 DISCONNECT
13739 /*C574*/SET SCHEMA B
13740 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13741 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13742 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13743 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13744 DROP PROCEDURE insertFactureClient IF EXISTS
13745 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13746 DROP VIEW "Factures" IF EXISTS
13747 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13748 DISCONNECT
13749 /*C575*/SET SCHEMA B
13750 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13751 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13752 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13753 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13754 DROP PROCEDURE insertFactureClient IF EXISTS
13755 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13756 DROP VIEW "Factures" IF EXISTS
13757 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13758 DISCONNECT
13759 /*C576*/SET SCHEMA B
13760 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13761 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13762 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13763 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13764 DROP PROCEDURE insertFactureClient IF EXISTS
13765 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13766 DROP VIEW "Factures" IF EXISTS
13767 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13768 DISCONNECT
13769 /*C577*/SET SCHEMA B
13770 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13771 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13772 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13773 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13774 DROP PROCEDURE insertFactureClient IF EXISTS
13775 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13776 DROP VIEW "Factures" IF EXISTS
13777 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13778 DISCONNECT
13779 /*C578*/SET SCHEMA B
13780 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13781 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13782 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13783 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13784 DROP PROCEDURE insertFactureClient IF EXISTS
13785 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13786 DROP VIEW "Factures" IF EXISTS
13787 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13788 DISCONNECT
13789 /*C579*/SET SCHEMA B
13790 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13791 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13792 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13793 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13794 DROP PROCEDURE insertFactureClient IF EXISTS
13795 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13796 DROP VIEW "Factures" IF EXISTS
13797 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13798 DISCONNECT
13799 /*C580*/SET SCHEMA B
13800 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13801 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13802 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13803 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13804 DROP PROCEDURE insertFactureClient IF EXISTS
13805 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13806 DROP VIEW "Factures" IF EXISTS
13807 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13808 DISCONNECT
13809 /*C581*/SET SCHEMA B
13810 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13811 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13812 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13813 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13814 DROP PROCEDURE insertFactureClient IF EXISTS
13815 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13816 DROP VIEW "Factures" IF EXISTS
13817 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13818 DISCONNECT
13819 /*C582*/SET SCHEMA B
13820 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13821 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13822 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13823 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13824 DROP PROCEDURE insertFactureClient IF EXISTS
13825 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13826 DROP VIEW "Factures" IF EXISTS
13827 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13828 DISCONNECT
13829 /*C583*/SET SCHEMA B
13830 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13831 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13832 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13833 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13834 DROP PROCEDURE insertFactureClient IF EXISTS
13835 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13836 DROP VIEW "Factures" IF EXISTS
13837 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13838 DISCONNECT
13839 /*C584*/SET SCHEMA B
13840 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13841 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13842 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13843 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13844 DROP PROCEDURE insertFactureClient IF EXISTS
13845 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13846 DROP VIEW "Factures" IF EXISTS
13847 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13848 DISCONNECT
13849 /*C585*/SET SCHEMA B
13850 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13851 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13852 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13853 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13854 DROP PROCEDURE insertFactureClient IF EXISTS
13855 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13856 DROP VIEW "Factures" IF EXISTS
13857 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13858 DISCONNECT
13859 /*C586*/SET SCHEMA B
13860 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13861 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13862 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13863 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13864 DROP PROCEDURE insertFactureClient IF EXISTS
13865 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13866 DROP VIEW "Factures" IF EXISTS
13867 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13868 DISCONNECT
13869 /*C587*/SET SCHEMA B
13870 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13871 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13872 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13873 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13874 DROP PROCEDURE insertFactureClient IF EXISTS
13875 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13876 DROP VIEW "Factures" IF EXISTS
13877 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13878 DISCONNECT
13879 /*C588*/SET SCHEMA B
13880 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13881 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13882 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13883 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13884 DROP PROCEDURE insertFactureClient IF EXISTS
13885 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13886 DROP VIEW "Factures" IF EXISTS
13887 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13888 DISCONNECT
13889 /*C589*/SET SCHEMA B
13890 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13891 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13892 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13893 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13894 DROP PROCEDURE insertFactureClient IF EXISTS
13895 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13896 DROP VIEW "Factures" IF EXISTS
13897 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13898 DISCONNECT
13899 /*C590*/SET SCHEMA B
13900 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13901 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13902 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13903 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13904 DROP PROCEDURE insertFactureClient IF EXISTS
13905 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13906 DROP VIEW "Factures" IF EXISTS
13907 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13908 DISCONNECT
13909 /*C591*/SET SCHEMA B
13910 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13911 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13912 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13913 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13914 DROP PROCEDURE insertFactureClient IF EXISTS
13915 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13916 DROP VIEW "Factures" IF EXISTS
13917 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13918 DISCONNECT
13919 /*C592*/SET SCHEMA B
13920 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13921 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13922 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13923 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13924 DROP PROCEDURE insertFactureClient IF EXISTS
13925 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13926 DROP VIEW "Factures" IF EXISTS
13927 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13928 DISCONNECT
13929 /*C593*/SET SCHEMA B
13930 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13931 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13932 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13933 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13934 DROP PROCEDURE insertFactureClient IF EXISTS
13935 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13936 DROP VIEW "Factures" IF EXISTS
13937 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13938 DISCONNECT
13939 /*C594*/SET SCHEMA B
13940 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13941 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13942 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13943 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13944 DROP PROCEDURE insertFactureClient IF EXISTS
13945 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13946 DROP VIEW "Factures" IF EXISTS
13947 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13948 DISCONNECT
13949 /*C595*/SET SCHEMA B
13950 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13951 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13952 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13953 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13954 DROP PROCEDURE insertFactureClient IF EXISTS
13955 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13956 DROP VIEW "Factures" IF EXISTS
13957 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13958 DISCONNECT
13959 /*C596*/SET SCHEMA B
13960 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13961 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13962 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13963 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13964 DROP PROCEDURE insertFactureClient IF EXISTS
13965 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13966 DROP VIEW "Factures" IF EXISTS
13967 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13968 DISCONNECT
13969 /*C597*/SET SCHEMA B
13970 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13971 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13972 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13973 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13974 DROP PROCEDURE insertFactureClient IF EXISTS
13975 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13976 DROP VIEW "Factures" IF EXISTS
13977 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13978 DISCONNECT
13979 /*C598*/SET SCHEMA B
13980 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13981 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13982 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13983 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13984 DROP PROCEDURE insertFactureClient IF EXISTS
13985 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13986 DROP VIEW "Factures" IF EXISTS
13987 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13988 DISCONNECT
13989 /*C599*/SET SCHEMA B
13990 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
13991 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
13992 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
13993 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
13994 DROP PROCEDURE insertFactureClient IF EXISTS
13995 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
13996 DROP VIEW "Factures" IF EXISTS
13997 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
13998 DISCONNECT
13999 /*C600*/SET SCHEMA B
14000 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14001 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14002 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14003 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14004 DROP PROCEDURE insertFactureClient IF EXISTS
14005 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14006 DROP VIEW "Factures" IF EXISTS
14007 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14008 DISCONNECT
14009 /*C601*/SET SCHEMA B
14010 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14011 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14012 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14013 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14014 DROP PROCEDURE insertFactureClient IF EXISTS
14015 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14016 DROP VIEW "Factures" IF EXISTS
14017 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14018 DISCONNECT
14019 /*C602*/SET SCHEMA B
14020 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14021 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14022 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14023 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14024 DROP PROCEDURE insertFactureClient IF EXISTS
14025 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14026 DROP VIEW "Factures" IF EXISTS
14027 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14028 DISCONNECT
14029 /*C603*/SET SCHEMA B
14030 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14031 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14032 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14033 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14034 DROP PROCEDURE insertFactureClient IF EXISTS
14035 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14036 DROP VIEW "Factures" IF EXISTS
14037 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14038 DISCONNECT
14039 /*C604*/SET SCHEMA B
14040 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14041 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14042 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14043 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14044 DROP PROCEDURE insertFactureClient IF EXISTS
14045 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14046 DROP VIEW "Factures" IF EXISTS
14047 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14048 DISCONNECT
14049 /*C605*/SET SCHEMA B
14050 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14051 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14052 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14053 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14054 DROP PROCEDURE insertFactureClient IF EXISTS
14055 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14056 DROP VIEW "Factures" IF EXISTS
14057 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14058 DISCONNECT
14059 /*C606*/SET SCHEMA B
14060 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14061 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14062 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14063 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14064 DROP PROCEDURE insertFactureClient IF EXISTS
14065 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14066 DROP VIEW "Factures" IF EXISTS
14067 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14068 DISCONNECT
14069 /*C607*/SET SCHEMA B
14070 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14071 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14072 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14073 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14074 DROP PROCEDURE insertFactureClient IF EXISTS
14075 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14076 DROP VIEW "Factures" IF EXISTS
14077 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14078 DISCONNECT
14079 /*C608*/SET SCHEMA B
14080 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14081 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14082 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14083 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14084 DROP PROCEDURE insertFactureClient IF EXISTS
14085 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14086 DROP VIEW "Factures" IF EXISTS
14087 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14088 DISCONNECT
14089 /*C609*/SET SCHEMA B
14090 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14091 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14092 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14093 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14094 DROP PROCEDURE insertFactureClient IF EXISTS
14095 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14096 DROP VIEW "Factures" IF EXISTS
14097 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14098 DISCONNECT
14099 /*C610*/SET SCHEMA B
14100 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14101 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14102 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14103 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14104 DROP PROCEDURE insertFactureClient IF EXISTS
14105 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14106 DROP VIEW "Factures" IF EXISTS
14107 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14108 DISCONNECT
14109 /*C611*/SET SCHEMA B
14110 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14111 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14112 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14113 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14114 DROP PROCEDURE insertFactureClient IF EXISTS
14115 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14116 DROP VIEW "Factures" IF EXISTS
14117 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14118 DISCONNECT
14119 /*C612*/SET SCHEMA B
14120 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14121 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14122 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14123 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14124 DROP PROCEDURE insertFactureClient IF EXISTS
14125 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14126 DROP VIEW "Factures" IF EXISTS
14127 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14128 DISCONNECT
14129 /*C613*/SET SCHEMA B
14130 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14131 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14132 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14133 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14134 DROP PROCEDURE insertFactureClient IF EXISTS
14135 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14136 DROP VIEW "Factures" IF EXISTS
14137 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14138 DISCONNECT
14139 /*C614*/SET SCHEMA B
14140 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14141 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14142 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14143 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14144 DROP PROCEDURE insertFactureClient IF EXISTS
14145 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14146 DROP VIEW "Factures" IF EXISTS
14147 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14148 DISCONNECT
14149 /*C615*/SET SCHEMA B
14150 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14151 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14152 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14153 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14154 DROP PROCEDURE insertFactureClient IF EXISTS
14155 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14156 DROP VIEW "Factures" IF EXISTS
14157 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14158 DISCONNECT
14159 /*C616*/SET SCHEMA B
14160 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14161 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14162 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14163 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14164 DROP PROCEDURE insertFactureClient IF EXISTS
14165 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14166 DROP VIEW "Factures" IF EXISTS
14167 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14168 DISCONNECT
14169 /*C617*/SET SCHEMA B
14170 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14171 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14172 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14173 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14174 DROP PROCEDURE insertFactureClient IF EXISTS
14175 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14176 DROP VIEW "Factures" IF EXISTS
14177 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14178 DISCONNECT
14179 /*C618*/SET SCHEMA B
14180 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14181 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14182 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14183 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14184 DROP PROCEDURE insertFactureClient IF EXISTS
14185 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14186 DROP VIEW "Factures" IF EXISTS
14187 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14188 DISCONNECT
14189 /*C619*/SET SCHEMA B
14190 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14191 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14192 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14193 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14194 DROP PROCEDURE insertFactureClient IF EXISTS
14195 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14196 DROP VIEW "Factures" IF EXISTS
14197 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14198 DISCONNECT
14199 /*C620*/SET SCHEMA B
14200 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14201 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14202 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14203 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14204 DROP PROCEDURE insertFactureClient IF EXISTS
14205 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14206 DROP VIEW "Factures" IF EXISTS
14207 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14208 DISCONNECT
14209 /*C621*/SET SCHEMA B
14210 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14211 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14212 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14213 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14214 DROP PROCEDURE insertFactureClient IF EXISTS
14215 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14216 DROP VIEW "Factures" IF EXISTS
14217 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14218 DISCONNECT
14219 /*C622*/SET SCHEMA B
14220 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14221 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14222 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14223 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14224 DROP PROCEDURE insertFactureClient IF EXISTS
14225 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14226 DROP VIEW "Factures" IF EXISTS
14227 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14228 DISCONNECT
14229 /*C623*/SET SCHEMA B
14230 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14231 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14232 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14233 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14234 DROP PROCEDURE insertFactureClient IF EXISTS
14235 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14236 DROP VIEW "Factures" IF EXISTS
14237 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14238 DISCONNECT
14239 /*C624*/SET SCHEMA B
14240 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14241 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14242 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14243 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14244 DROP PROCEDURE insertFactureClient IF EXISTS
14245 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14246 DROP VIEW "Factures" IF EXISTS
14247 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14248 DISCONNECT
14249 /*C625*/SET SCHEMA B
14250 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14251 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14252 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14253 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14254 DROP PROCEDURE insertFactureClient IF EXISTS
14255 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14256 DROP VIEW "Factures" IF EXISTS
14257 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14258 DISCONNECT
14259 /*C626*/SET SCHEMA B
14260 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14261 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14262 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14263 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14264 DROP PROCEDURE insertFactureClient IF EXISTS
14265 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14266 DROP VIEW "Factures" IF EXISTS
14267 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14268 DISCONNECT
14269 /*C627*/SET SCHEMA B
14270 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14271 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14272 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14273 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14274 DROP PROCEDURE insertFactureClient IF EXISTS
14275 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14276 DROP VIEW "Factures" IF EXISTS
14277 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14278 DISCONNECT
14279 /*C628*/SET SCHEMA B
14280 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14281 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14282 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14283 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14284 DROP PROCEDURE insertFactureClient IF EXISTS
14285 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14286 DROP VIEW "Factures" IF EXISTS
14287 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "PrixDat\u00e9".euros as euros\u000a --GROUP_CONCAT\u000a --("PrixDat\u00e9".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "PrixDat\u00e9" ON "PrixDat\u00e9".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a --ORDER BY "Facture".ID\u000a
14288 DISCONNECT
14289 /*C629*/SET SCHEMA B
14290 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14291 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14292 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14293 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14294 DROP PROCEDURE insertFactureClient IF EXISTS
14295 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14296 DROP VIEW "Factures" IF EXISTS
14297 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14298 DISCONNECT
14299 /*C630*/SET SCHEMA B
14300 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14301 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14302 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14303 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14304 DROP PROCEDURE insertFactureClient IF EXISTS
14305 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14306 DROP VIEW "Factures" IF EXISTS
14307 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14308 DISCONNECT
14309 /*C631*/SET SCHEMA B
14310 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14311 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14312 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14313 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14314 DROP PROCEDURE insertFactureClient IF EXISTS
14315 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14316 DROP VIEW "Factures" IF EXISTS
14317 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14318 DISCONNECT
14319 /*C632*/SET SCHEMA B
14320 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14321 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14322 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14323 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14324 DROP PROCEDURE insertFactureClient IF EXISTS
14325 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14326 DROP VIEW "Factures" IF EXISTS
14327 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14328 DISCONNECT
14329 /*C633*/SET SCHEMA B
14330 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14331 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14332 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14333 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14334 DROP PROCEDURE insertFactureClient IF EXISTS
14335 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14336 DROP VIEW "Factures" IF EXISTS
14337 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14338 DISCONNECT
14339 /*C634*/SET SCHEMA B
14340 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14341 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14342 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14343 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14344 DROP PROCEDURE insertFactureClient IF EXISTS
14345 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14346 DROP VIEW "Factures" IF EXISTS
14347 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14348 DISCONNECT
14349 /*C635*/SET SCHEMA B
14350 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14351 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14352 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14353 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14354 DROP PROCEDURE insertFactureClient IF EXISTS
14355 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14356 DROP VIEW "Factures" IF EXISTS
14357 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14358 DISCONNECT
14359 /*C636*/SET SCHEMA B
14360 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14361 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14362 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14363 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14364 DROP PROCEDURE insertFactureClient IF EXISTS
14365 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14366 DROP VIEW "Factures" IF EXISTS
14367 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14368 DISCONNECT
14369 /*C637*/SET SCHEMA B
14370 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14371 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14372 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14373 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14374 DROP PROCEDURE insertFactureClient IF EXISTS
14375 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14376 DROP VIEW "Factures" IF EXISTS
14377 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14378 DISCONNECT
14379 /*C638*/SET SCHEMA B
14380 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14381 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14382 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14383 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14384 DROP PROCEDURE insertFactureClient IF EXISTS
14385 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14386 DROP VIEW "Factures" IF EXISTS
14387 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14388 DISCONNECT
14389 /*C639*/SET SCHEMA B
14390 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14391 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14392 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14393 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14394 DROP PROCEDURE insertFactureClient IF EXISTS
14395 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14396 DROP VIEW "Factures" IF EXISTS
14397 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14398 DISCONNECT
14399 /*C640*/SET SCHEMA B
14400 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14401 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14402 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14403 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14404 DROP PROCEDURE insertFactureClient IF EXISTS
14405 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14406 DROP VIEW "Factures" IF EXISTS
14407 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14408 DISCONNECT
14409 /*C641*/SET SCHEMA B
14410 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14411 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14412 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14413 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14414 DROP PROCEDURE insertFactureClient IF EXISTS
14415 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14416 DROP VIEW "Factures" IF EXISTS
14417 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14418 DISCONNECT
14419 /*C642*/SET SCHEMA B
14420 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14421 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14422 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14423 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14424 DROP PROCEDURE insertFactureClient IF EXISTS
14425 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14426 DROP VIEW "Factures" IF EXISTS
14427 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14428 DISCONNECT
14429 /*C643*/SET SCHEMA B
14430 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14431 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14432 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14433 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14434 DROP PROCEDURE insertFactureClient IF EXISTS
14435 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14436 DROP VIEW "Factures" IF EXISTS
14437 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14438 DISCONNECT
14439 /*C644*/SET SCHEMA B
14440 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14441 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14442 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14443 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14444 DROP PROCEDURE insertFactureClient IF EXISTS
14445 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14446 DROP VIEW "Factures" IF EXISTS
14447 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14448 DISCONNECT
14449 /*C645*/SET SCHEMA B
14450 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14451 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14452 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14453 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14454 DROP PROCEDURE insertFactureClient IF EXISTS
14455 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14456 DROP VIEW "Factures" IF EXISTS
14457 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14458 DISCONNECT
14459 /*C646*/SET SCHEMA B
14460 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14461 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14462 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14463 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14464 DROP PROCEDURE insertFactureClient IF EXISTS
14465 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14466 DROP VIEW "Factures" IF EXISTS
14467 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14468 DISCONNECT
14469 /*C647*/SET SCHEMA B
14470 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14471 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14472 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14473 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14474 DROP PROCEDURE insertFactureClient IF EXISTS
14475 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14476 DROP VIEW "Factures" IF EXISTS
14477 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14478 DISCONNECT
14479 /*C648*/SET SCHEMA B
14480 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14481 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14482 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14483 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14484 DROP PROCEDURE insertFactureClient IF EXISTS
14485 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14486 DROP VIEW "Factures" IF EXISTS
14487 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14488 DISCONNECT
14489 /*C649*/SET SCHEMA B
14490 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14491 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14492 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14493 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14494 DROP PROCEDURE insertFactureClient IF EXISTS
14495 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14496 DROP VIEW "Factures" IF EXISTS
14497 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14498 DISCONNECT
14499 /*C650*/SET SCHEMA B
14500 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14501 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14502 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14503 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14504 DROP PROCEDURE insertFactureClient IF EXISTS
14505 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14506 DROP VIEW "Factures" IF EXISTS
14507 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14508 DISCONNECT
14509 /*C651*/SET SCHEMA B
14510 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14511 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14512 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14513 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14514 DROP PROCEDURE insertFactureClient IF EXISTS
14515 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14516 DROP VIEW "Factures" IF EXISTS
14517 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14518 DISCONNECT
14519 /*C652*/SET SCHEMA B
14520 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14521 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14522 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14523 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14524 DROP PROCEDURE insertFactureClient IF EXISTS
14525 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14526 DROP VIEW "Factures" IF EXISTS
14527 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14528 DISCONNECT
14529 /*C653*/SET SCHEMA B
14530 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14531 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14532 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14533 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14534 DROP PROCEDURE insertFactureClient IF EXISTS
14535 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14536 DROP VIEW "Factures" IF EXISTS
14537 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14538 DISCONNECT
14539 /*C654*/SET SCHEMA B
14540 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14541 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14542 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14543 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14544 DROP PROCEDURE insertFactureClient IF EXISTS
14545 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14546 DROP VIEW "Factures" IF EXISTS
14547 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14548 DISCONNECT
14549 /*C655*/SET SCHEMA B
14550 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14551 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14552 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14553 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14554 DROP PROCEDURE insertFactureClient IF EXISTS
14555 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14556 DROP VIEW "Factures" IF EXISTS
14557 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14558 DISCONNECT
14559 /*C656*/SET SCHEMA B
14560 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14561 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14562 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14563 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14564 DROP PROCEDURE insertFactureClient IF EXISTS
14565 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14566 DROP VIEW "Factures" IF EXISTS
14567 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14568 DISCONNECT
14569 /*C657*/SET SCHEMA B
14570 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14571 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14572 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14573 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14574 DROP PROCEDURE insertFactureClient IF EXISTS
14575 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14576 DROP VIEW "Factures" IF EXISTS
14577 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14578 DISCONNECT
14579 /*C658*/SET SCHEMA B
14580 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14581 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14582 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14583 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14584 DROP PROCEDURE insertFactureClient IF EXISTS
14585 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14586 DROP VIEW "Factures" IF EXISTS
14587 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14588 DISCONNECT
14589 /*C659*/SET SCHEMA B
14590 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14591 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14592 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14593 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14594 DROP PROCEDURE insertFactureClient IF EXISTS
14595 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14596 DROP VIEW "Factures" IF EXISTS
14597 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14598 DISCONNECT
14599 /*C660*/SET SCHEMA B
14600 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14601 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14602 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14603 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14604 DROP PROCEDURE insertFactureClient IF EXISTS
14605 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14606 DROP VIEW "Factures" IF EXISTS
14607 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14608 DISCONNECT
14609 /*C661*/SET SCHEMA B
14610 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14611 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14612 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14613 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14614 DROP PROCEDURE insertFactureClient IF EXISTS
14615 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14616 DROP VIEW "Factures" IF EXISTS
14617 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14618 DISCONNECT
14619 /*C662*/SET SCHEMA B
14620 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14621 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14622 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14623 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14624 DROP PROCEDURE insertFactureClient IF EXISTS
14625 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14626 DROP VIEW "Factures" IF EXISTS
14627 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14628 DISCONNECT
14629 /*C663*/SET SCHEMA B
14630 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14631 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14632 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14633 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14634 DROP PROCEDURE insertFactureClient IF EXISTS
14635 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14636 DROP VIEW "Factures" IF EXISTS
14637 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14638 DISCONNECT
14639 /*C664*/SET SCHEMA B
14640 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14641 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14642 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14643 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14644 DROP PROCEDURE insertFactureClient IF EXISTS
14645 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14646 DROP VIEW "Factures" IF EXISTS
14647 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14648 DISCONNECT
14649 /*C665*/SET SCHEMA B
14650 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14651 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14652 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14653 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14654 DROP PROCEDURE insertFactureClient IF EXISTS
14655 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14656 DROP VIEW "Factures" IF EXISTS
14657 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14658 DISCONNECT
14659 /*C666*/SET SCHEMA B
14660 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14661 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14662 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14663 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14664 DROP PROCEDURE insertFactureClient IF EXISTS
14665 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14666 DROP VIEW "Factures" IF EXISTS
14667 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14668 DISCONNECT
14669 /*C667*/SET SCHEMA B
14670 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14671 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14672 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14673 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14674 DROP PROCEDURE insertFactureClient IF EXISTS
14675 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14676 DROP VIEW "Factures" IF EXISTS
14677 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14678 DISCONNECT
14679 /*C668*/SET SCHEMA B
14680 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14681 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14682 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14683 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14684 DROP PROCEDURE insertFactureClient IF EXISTS
14685 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14686 DROP VIEW "Factures" IF EXISTS
14687 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14688 DISCONNECT
14689 /*C669*/SET SCHEMA B
14690 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14691 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14692 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14693 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14694 DROP PROCEDURE insertFactureClient IF EXISTS
14695 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14696 DROP VIEW "Factures" IF EXISTS
14697 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14698 DISCONNECT
14699 /*C670*/SET SCHEMA B
14700 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14701 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14702 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14703 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14704 DROP PROCEDURE insertFactureClient IF EXISTS
14705 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14706 DROP VIEW "Factures" IF EXISTS
14707 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14708 DISCONNECT
14709 /*C671*/SET SCHEMA B
14710 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14711 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14712 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14713 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14714 DROP PROCEDURE insertFactureClient IF EXISTS
14715 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14716 DROP VIEW "Factures" IF EXISTS
14717 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14718 DISCONNECT
14719 /*C672*/SET SCHEMA B
14720 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14721 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14722 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14723 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14724 DROP PROCEDURE insertFactureClient IF EXISTS
14725 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14726 DROP VIEW "Factures" IF EXISTS
14727 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14728 DISCONNECT
14729 /*C673*/SET SCHEMA B
14730 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14731 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14732 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14733 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14734 DROP PROCEDURE insertFactureClient IF EXISTS
14735 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14736 DROP VIEW "Factures" IF EXISTS
14737 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14738 DISCONNECT
14739 /*C674*/SET SCHEMA B
14740 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14741 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14742 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14743 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14744 DROP PROCEDURE insertFactureClient IF EXISTS
14745 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14746 DROP VIEW "Factures" IF EXISTS
14747 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14748 DISCONNECT
14749 /*C675*/SET SCHEMA B
14750 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14751 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14752 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14753 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14754 DROP PROCEDURE insertFactureClient IF EXISTS
14755 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14756 DROP VIEW "Factures" IF EXISTS
14757 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14758 DISCONNECT
14759 /*C475*/SET SCHEMA B
14760 DISCONNECT
14761 /*C676*/SET SCHEMA B
14762 --TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
14763 CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteFacturable BOOLEAN DEFAULT FALSE;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID =\u000a SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a SET venteFacturable =\u000a SELECT facturable\u000a FROM "Client"\u000a WHERE "Client".ID = venteClient;\u000a INSERT INTO "Panier"(date, client, facturable)\u000a VALUES (venteDate, venteClient, venteFacturable);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
14764 DROP PROCEDURE insertVentesParAbonnement IF EXISTS
14765 CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
14766 DROP PROCEDURE insertFactureClient IF EXISTS
14767 CREATE PROCEDURE insertFactureClient(IN selClient INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE factureID INTEGER DEFAULT NULL;\u000a -- Si le client a des paniers `facturable`s sans `facture`.\u000a IF CARDINALITY(ARRAY (SELECT ID\u000a FROM "Panier"\u000a WHERE client = selClient\u000a AND facturable\u000a AND facture IS NULL\u000a )) > 0\u000a THEN\u000a -- Cr\u00e9e une nouvelle facture\u000a -- et r\u00e9f\u00e9rence celle-ci dans tous les paniers\u000a -- non-factur\u00e9s jusque l\u00e0.\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a SET factureID = IDENTITY();\u000a UPDATE "Panier"\u000a SET facture = factureID\u000a WHERE facture IS NULL\u000a AND client = selClient\u000a ;\u000a END IF;\u000a END
14768 DROP VIEW "Factures" IF EXISTS
14769 CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\u000a --ARRAY_AGG\u000a -- ("Vente".ID) as ventes,\u000a --ARRAY_AGG\u000a "Produit".ID as produit,\u000a "Vente".quantit\u00e9 as quantit\u00e9,\u000a "Prix\u00c1Date".euros as euros\u000a --GROUP_CONCAT\u000a --("Prix\u00c1Date".euros * "Vente".quantit\u00e9 SEPARATOR ', ') as prix_quantifi\u00e9\u000a FROM "Panier"\u000a JOIN "Facture" ON "Facture".ID = "Panier".facture\u000a JOIN "Client" ON "Client".ID = "Panier".client\u000a JOIN "Vente" ON "Vente".panier = "Panier".ID\u000a JOIN "Produit" ON "Produit".ID = "Vente".produit\u000a JOIN TABLE (prix_\u00e0_date("Panier".date)) AS "Prix\u00c1Date" ON "Prix\u00c1Date".produit = "Produit".ID\u000a ORDER BY\u000a "Facture".ID\u000a , "Facture".date\u000a , "Client".ID\u000a , "Panier".ID\u000a , "Panier".date\u000a , "Produit".ID\u000a
14770 DISCONNECT