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
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
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
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
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
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
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
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
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
65 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
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 )
103 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
105 INSERT INTO "Lieu" VALUES(1,'Gentioux')
107 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
109 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
111 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
113 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
115 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
117 INSERT INTO "Lieu" VALUES(7,'Tarnac')
119 INSERT INTO "Lieu" VALUES(8,'Felletin')
121 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
123 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
125 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
127 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
129 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
131 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
133 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
135 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
137 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
139 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
141 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
143 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
145 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
147 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
149 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
151 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
153 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
155 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
157 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
159 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
161 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
163 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
165 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
167 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
169 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
171 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
173 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
175 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
177 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
179 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
181 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
183 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
185 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
187 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
189 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
191 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
193 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
195 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
197 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
199 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
201 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
203 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
205 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
207 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
209 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
211 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
213 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
215 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
217 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
219 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
221 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
223 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
225 INSERT INTO "Ingr\u00e9dient" VALUES(1,0,2,1.000)
227 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
229 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
231 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
233 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
235 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
237 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
239 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
241 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
243 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
245 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
249 DROP SCHEMA B CASCADE
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 )
283 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
285 INSERT INTO "Lieu" VALUES(1,'Gentioux')
287 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
289 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
291 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
293 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
295 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
297 INSERT INTO "Lieu" VALUES(7,'Tarnac')
299 INSERT INTO "Lieu" VALUES(8,'Felletin')
301 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
303 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
305 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
307 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
309 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
311 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
313 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
315 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
317 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
319 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
321 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
323 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
325 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
327 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
329 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
331 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
333 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
335 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
337 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
339 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
341 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
343 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
345 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
347 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
349 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
351 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
353 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
355 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
357 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
359 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
361 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
363 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
365 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
367 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
369 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
371 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
373 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
375 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
377 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
379 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
381 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
383 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
385 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
387 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
389 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
391 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
393 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
395 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
397 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
399 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
401 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
403 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
405 INSERT INTO "Ingr\u00e9dient" VALUES(1,0,2,1.000)
407 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
409 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
411 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
413 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
415 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
417 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
419 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
421 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
423 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
425 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
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)
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
454 DROP SCHEMA B CASCADE
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 )
490 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
492 INSERT INTO "Lieu" VALUES(1,'Gentioux')
494 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
496 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
498 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
500 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
502 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
504 INSERT INTO "Lieu" VALUES(7,'Tarnac')
506 INSERT INTO "Lieu" VALUES(8,'Felletin')
508 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
510 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
512 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
514 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
516 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
518 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
520 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
522 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
524 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
526 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
528 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
530 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
532 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
534 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
536 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
538 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
540 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
542 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
544 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
546 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
548 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
550 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
552 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
554 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
556 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
558 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
560 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
562 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
564 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
566 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
568 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
570 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
572 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
574 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
576 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
578 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
580 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
582 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
584 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
586 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
588 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
590 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
592 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
594 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
596 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
598 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
600 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
602 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
604 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
606 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
608 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
610 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
612 INSERT INTO "Ingr\u00e9dient" VALUES(1,0,2,1.000)
614 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
616 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
618 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
620 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
622 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
624 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
626 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
628 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
630 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
632 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
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)
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
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
667 DROP SCHEMA B CASCADE
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
675 DROP SCHEMA B CASCADE
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
683 DROP SCHEMA B CASCADE
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 )
719 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
721 INSERT INTO "Lieu" VALUES(1,'Gentioux')
723 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
725 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
727 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
729 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
731 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
733 INSERT INTO "Lieu" VALUES(7,'Tarnac')
735 INSERT INTO "Lieu" VALUES(8,'Felletin')
737 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
739 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
741 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
743 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
745 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
747 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
749 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
751 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
753 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
755 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
757 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
759 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
761 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
763 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
765 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
767 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
769 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
771 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
773 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
775 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
777 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
779 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
781 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
783 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
785 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
787 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
789 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
791 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
793 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
795 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
797 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
799 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
801 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
803 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
805 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
807 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
809 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
811 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
813 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
815 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
817 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
819 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
821 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
823 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
825 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
827 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
829 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
831 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
833 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
835 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
837 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
839 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
841 INSERT INTO "Ingr\u00e9dient" VALUES(1,0,2,1.000)
843 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
845 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
847 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
849 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
851 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
853 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
855 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
857 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
859 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
861 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
866 DELETE FROM "Ingr\u00e9dient" WHERE ID=1
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)
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
897 DROP SCHEMA B CASCADE
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
931 DROP SCHEMA B CASCADE
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 )
967 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
969 INSERT INTO "Lieu" VALUES(1,'Gentioux')
971 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
973 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
975 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
977 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
979 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
981 INSERT INTO "Lieu" VALUES(7,'Tarnac')
983 INSERT INTO "Lieu" VALUES(8,'Felletin')
985 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
987 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
989 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
991 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
993 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
995 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
997 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
999 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
1001 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
1003 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
1005 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
1007 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
1009 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
1011 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
1013 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
1015 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
1017 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
1019 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
1021 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
1023 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
1025 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
1027 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
1029 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
1031 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
1033 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
1035 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
1037 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
1039 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
1041 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
1043 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
1045 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
1047 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
1049 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
1051 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
1053 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
1055 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
1057 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
1059 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
1061 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
1063 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
1065 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
1067 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
1069 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
1071 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
1073 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
1075 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
1077 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
1079 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
1081 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
1083 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
1085 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
1087 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
1089 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
1091 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
1093 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
1095 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
1097 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
1099 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
1101 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
1103 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
1105 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
1107 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
1111 DROP SCHEMA B CASCADE
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
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
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
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
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
1169 DROP SCHEMA B CASCADE
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
1193 DROP SCHEMA B CASCADE
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
1217 DROP SCHEMA B CASCADE
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
1242 DROP SCHEMA B CASCADE
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
1267 DROP SCHEMA B CASCADE
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
1292 DROP SCHEMA B CASCADE
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
1317 DROP SCHEMA B CASCADE
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 )
1343 DROP SCHEMA B CASCADE
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
1368 DROP SCHEMA B CASCADE
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
1393 DROP SCHEMA B CASCADE
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
1418 DROP SCHEMA B CASCADE
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
1443 DROP SCHEMA B CASCADE
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
1468 DROP SCHEMA B CASCADE
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
1493 DROP SCHEMA B CASCADE
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
1528 DROP SCHEMA B CASCADE
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 )
1565 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
1567 INSERT INTO "Lieu" VALUES(1,'Gentioux')
1569 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
1571 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
1573 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
1575 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
1577 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
1579 INSERT INTO "Lieu" VALUES(7,'Tarnac')
1581 INSERT INTO "Lieu" VALUES(8,'Felletin')
1583 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
1585 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
1587 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
1589 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
1591 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
1593 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
1595 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
1597 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
1599 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
1601 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
1603 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
1605 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
1607 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
1609 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
1611 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
1613 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
1615 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
1617 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
1619 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
1621 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
1623 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
1625 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
1627 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
1629 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
1631 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
1633 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
1635 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
1637 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
1639 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
1641 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
1643 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
1645 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
1647 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
1649 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
1651 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
1653 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
1655 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
1657 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
1659 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
1661 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
1663 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
1665 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
1667 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
1669 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
1671 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
1673 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
1675 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
1677 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
1679 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
1681 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
1683 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
1685 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
1687 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
1689 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
1691 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
1693 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
1695 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
1697 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
1699 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
1701 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
1703 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
1705 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
1888 /*C104*/SET SCHEMA B
1889 DROP SCHEMA B CASCADE
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
1925 /*C106*/SET SCHEMA B
1927 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
1929 INSERT INTO "Lieu" VALUES(1,'Gentioux')
1931 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
1933 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
1935 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
1937 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
1939 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
1941 INSERT INTO "Lieu" VALUES(7,'Tarnac')
1943 INSERT INTO "Lieu" VALUES(8,'Felletin')
1945 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
1947 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
1949 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
1951 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
1953 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
1955 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
1957 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
1959 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
1961 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
1963 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
1965 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
1967 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
1969 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
1971 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
1973 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
1975 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
1977 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
1979 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
1981 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
1983 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
1985 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
1987 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
1989 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
1991 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
1993 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
1995 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
1997 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
1999 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
2001 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
2003 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
2005 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
2007 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
2009 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
2011 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
2013 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
2015 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
2017 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
2019 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
2021 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
2023 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
2025 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
2027 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
2029 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
2031 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
2033 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
2035 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
2037 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
2039 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
2041 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
2043 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
2045 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
2047 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
2049 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
2051 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
2053 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
2055 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
2057 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
2059 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
2061 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
2063 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
2065 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
2067 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
2070 /*C107*/SET SCHEMA B
2071 DROP SCHEMA B CASCADE
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
2105 /*C109*/SET SCHEMA B
2106 DROP SCHEMA B CASCADE
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 )
2141 /*C111*/SET SCHEMA B
2143 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
2145 INSERT INTO "Lieu" VALUES(1,'Gentioux')
2147 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
2149 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
2151 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
2153 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
2155 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
2157 INSERT INTO "Lieu" VALUES(7,'Tarnac')
2159 INSERT INTO "Lieu" VALUES(8,'Felletin')
2161 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
2163 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
2165 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
2167 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
2169 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
2171 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
2173 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
2175 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
2177 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
2179 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
2181 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
2183 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
2185 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
2187 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
2189 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
2191 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
2193 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
2195 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
2197 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
2199 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
2201 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
2203 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
2205 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
2207 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
2209 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
2211 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
2213 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
2215 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
2217 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
2219 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
2221 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
2223 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
2225 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
2227 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
2229 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
2231 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
2233 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
2235 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
2237 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
2239 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
2241 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
2243 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
2245 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
2247 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
2249 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
2251 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
2253 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
2255 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
2257 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
2259 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
2261 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
2263 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
2265 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
2267 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
2269 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
2271 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
2273 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
2275 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
2277 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
2279 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
2281 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
2283 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
2286 /*C112*/SET SCHEMA B
2287 DROP SCHEMA B CASCADE
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 )
2320 /*C114*/SET SCHEMA B
2322 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
2324 INSERT INTO "Lieu" VALUES(1,'Gentioux')
2326 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
2328 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
2330 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
2332 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
2334 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
2336 INSERT INTO "Lieu" VALUES(7,'Tarnac')
2338 INSERT INTO "Lieu" VALUES(8,'Felletin')
2340 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
2342 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
2344 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
2346 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
2348 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
2350 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
2352 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
2354 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
2356 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
2358 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
2360 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
2362 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
2364 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
2366 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
2368 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
2370 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
2372 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
2374 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
2376 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
2378 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
2380 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
2382 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
2384 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
2386 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
2388 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
2390 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
2392 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
2394 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
2396 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
2398 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
2400 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
2402 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
2404 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
2406 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
2408 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
2410 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
2412 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
2414 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
2416 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
2418 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
2420 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
2422 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
2424 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
2426 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
2428 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
2430 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
2432 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
2434 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
2436 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
2438 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
2440 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
2442 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
2444 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
2446 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
2448 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
2450 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
2452 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
2454 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
2456 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
2458 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
2460 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
2462 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
2465 /*C115*/SET SCHEMA B
2466 DROP SCHEMA B CASCADE
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 )
2496 /*C117*/SET SCHEMA B
2498 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
2500 INSERT INTO "Lieu" VALUES(1,'Gentioux')
2502 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
2504 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
2506 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
2508 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
2510 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
2512 INSERT INTO "Lieu" VALUES(7,'Tarnac')
2514 INSERT INTO "Lieu" VALUES(8,'Felletin')
2516 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
2518 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
2520 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
2522 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
2524 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
2526 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
2528 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
2530 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
2532 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
2534 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
2536 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
2538 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
2540 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
2542 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
2544 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
2546 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
2548 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
2550 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
2552 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
2554 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
2556 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
2558 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
2560 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
2562 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
2564 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
2566 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
2568 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
2570 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
2572 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
2574 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
2576 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
2578 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
2580 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
2582 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
2584 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
2586 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
2588 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
2590 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
2592 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
2594 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
2596 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
2598 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
2600 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
2602 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
2604 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
2606 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
2608 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
2610 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
2612 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
2614 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
2616 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
2618 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
2620 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
2622 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
2624 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
2626 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
2628 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
2630 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
2632 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
2634 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
2636 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
2638 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
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)
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
2662 /*C119*/SET SCHEMA B
2663 DROP SCHEMA B CASCADE
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 )
2686 /*C121*/SET SCHEMA B
2688 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
2690 INSERT INTO "Lieu" VALUES(1,'Gentioux')
2692 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
2694 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
2696 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
2698 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
2700 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
2702 INSERT INTO "Lieu" VALUES(7,'Tarnac')
2704 INSERT INTO "Lieu" VALUES(8,'Felletin')
2706 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
2708 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
2710 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
2712 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
2714 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
2716 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
2718 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
2720 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
2722 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
2724 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
2726 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
2728 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
2730 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
2732 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
2734 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
2736 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
2738 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
2740 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
2742 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
2744 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
2746 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
2748 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
2750 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
2752 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
2754 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
2756 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
2758 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
2760 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
2762 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
2764 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
2766 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
2768 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
2770 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
2772 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
2774 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
2776 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
2778 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
2780 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
2782 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
2784 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
2786 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
2788 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
2790 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
2792 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
2794 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
2796 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
2798 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
2800 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
2802 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
2804 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
2806 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
2808 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
2810 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
2812 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
2814 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
2816 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
2818 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
2820 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
2822 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
2824 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
2826 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
2828 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
3031 /*C35*/INSERT INTO "Prix" VALUES(9,'2025-04-29',0,23.00)
3033 INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
3283 /*C177*/SET SCHEMA B
3286 /*C178*/SET SCHEMA B
3287 DROP SCHEMA B CASCADE
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 )
3310 /*C180*/SET SCHEMA B
3312 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
3314 INSERT INTO "Lieu" VALUES(1,'Gentioux')
3316 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
3318 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
3320 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
3322 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
3324 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
3326 INSERT INTO "Lieu" VALUES(7,'Tarnac')
3328 INSERT INTO "Lieu" VALUES(8,'Felletin')
3330 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
3332 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
3334 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
3336 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
3338 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
3340 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
3342 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
3344 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
3346 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
3348 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
3350 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
3352 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
3354 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
3356 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
3358 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
3360 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
3362 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
3364 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
3366 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
3368 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
3370 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
3372 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
3374 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
3376 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
3378 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
3380 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
3382 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
3384 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
3386 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
3388 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
3390 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
3392 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
3394 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
3396 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
3398 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
3400 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
3402 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
3404 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
3406 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
3408 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
3410 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
3412 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
3414 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
3416 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
3418 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
3420 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
3422 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
3424 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
3426 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
3428 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
3430 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
3432 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
3434 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
3436 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
3438 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
3440 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
3442 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
3444 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
3446 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
3448 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
3450 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
3452 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
3454 INSERT INTO "Prix" VALUES(9,'2025-04-29',0,23.00)
3457 /*C181*/SET SCHEMA B
3458 DROP SCHEMA B CASCADE
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 )
3481 /*C183*/SET SCHEMA B
3483 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
3485 INSERT INTO "Lieu" VALUES(1,'Gentioux')
3487 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
3489 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
3491 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
3493 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
3495 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
3497 INSERT INTO "Lieu" VALUES(7,'Tarnac')
3499 INSERT INTO "Lieu" VALUES(8,'Felletin')
3501 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
3503 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
3505 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
3507 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
3509 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
3511 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
3513 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
3515 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
3517 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
3519 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
3521 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
3523 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
3525 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
3527 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
3529 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
3531 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
3533 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
3535 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
3537 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
3539 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
3541 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
3543 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
3545 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
3547 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
3549 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
3551 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
3553 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
3555 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
3557 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
3559 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
3561 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
3563 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
3565 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
3567 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
3569 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
3571 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
3573 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
3575 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
3577 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
3579 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
3581 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
3583 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
3585 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
3587 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
3589 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
3591 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
3593 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
3595 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
3597 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
3599 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
3601 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
3603 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
3605 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
3607 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
3609 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
3611 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
3613 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
3615 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
3617 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
3619 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
3621 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
3623 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
3625 INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
3627 INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
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)
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
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
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
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
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
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
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
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
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
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
3727 /*C194*/SET SCHEMA B
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
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
3745 /*C198*/SET SCHEMA B
3746 DROP SCHEMA B CASCADE
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
3773 /*C200*/SET SCHEMA B
3775 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
3777 INSERT INTO "Lieu" VALUES(1,'Gentioux')
3779 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
3781 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
3783 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
3785 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
3787 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
3789 INSERT INTO "Lieu" VALUES(7,'Tarnac')
3791 INSERT INTO "Lieu" VALUES(8,'Felletin')
3793 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
3795 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
3797 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
3799 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
3801 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
3803 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
3805 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
3807 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
3809 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
3811 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
3813 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
3815 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
3817 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
3819 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
3821 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
3823 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
3825 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
3827 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
3829 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
3831 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
3833 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
3835 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
3837 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
3839 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
3841 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
3843 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
3845 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
3847 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
3849 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
3851 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
3853 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
3855 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
3857 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
3859 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
3861 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
3863 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
3865 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
3867 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
3869 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
3871 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
3873 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
3875 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
3877 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
3879 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
3881 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
3883 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
3885 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
3887 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
3889 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
3891 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
3893 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
3895 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
3897 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
3899 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
3901 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
3903 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
3905 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
3907 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
3909 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
3911 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
3913 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
3915 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
3917 INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
3919 INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
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)
3941 /*C196*/SET SCHEMA B
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
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
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
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
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
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
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
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
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
3997 /*C202*/SET SCHEMA B
3999 /*C212*/SET SCHEMA B
4000 DROP SCHEMA B CASCADE
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
4027 /*C214*/SET SCHEMA B
4029 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
4031 INSERT INTO "Lieu" VALUES(1,'Gentioux')
4033 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
4035 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
4037 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
4039 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
4041 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
4043 INSERT INTO "Lieu" VALUES(7,'Tarnac')
4045 INSERT INTO "Lieu" VALUES(8,'Felletin')
4047 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
4049 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
4051 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
4053 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
4055 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
4057 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
4059 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
4061 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
4063 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
4065 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
4067 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
4069 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
4071 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
4073 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
4075 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
4077 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
4079 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
4081 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
4083 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
4085 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
4087 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
4089 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
4091 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
4093 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
4095 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
4097 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
4100 /*C215*/SET SCHEMA B
4101 DROP SCHEMA B CASCADE
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
4128 /*C217*/SET SCHEMA B
4130 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
4132 INSERT INTO "Lieu" VALUES(1,'Gentioux')
4134 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
4136 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
4138 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
4140 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
4142 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
4144 INSERT INTO "Lieu" VALUES(7,'Tarnac')
4146 INSERT INTO "Lieu" VALUES(8,'Felletin')
4148 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
4150 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
4152 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
4154 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
4156 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
4158 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
4160 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
4162 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
4164 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
4166 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
4168 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
4170 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
4172 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
4174 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
4176 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
4178 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
4180 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
4182 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
4184 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
4186 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
4188 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
4191 /*C218*/SET SCHEMA B
4192 DROP SCHEMA B CASCADE
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
4219 /*C220*/SET SCHEMA B
4221 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
4223 INSERT INTO "Lieu" VALUES(1,'Gentioux')
4225 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
4227 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
4229 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
4231 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
4233 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
4235 INSERT INTO "Lieu" VALUES(7,'Tarnac')
4237 INSERT INTO "Lieu" VALUES(8,'Felletin')
4239 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
4241 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
4243 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
4245 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
4247 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
4249 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
4251 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
4253 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
4255 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
4257 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
4259 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
4261 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
4263 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
4265 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
4267 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
4269 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
4271 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
4273 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
4275 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
4277 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
4279 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
4281 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
4283 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
4285 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
4287 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
4289 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
4291 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
4293 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
4295 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
4297 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
4299 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
4301 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
4303 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
4306 /*C221*/SET SCHEMA B
4307 DROP SCHEMA B CASCADE
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
4334 /*C223*/SET SCHEMA B
4336 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
4338 INSERT INTO "Lieu" VALUES(1,'Gentioux')
4340 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
4342 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
4344 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
4346 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
4348 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
4350 INSERT INTO "Lieu" VALUES(7,'Tarnac')
4352 INSERT INTO "Lieu" VALUES(8,'Felletin')
4354 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
4356 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
4358 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
4360 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
4362 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
4364 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
4366 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
4368 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
4370 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
4372 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
4374 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
4376 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
4378 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
4380 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
4382 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
4384 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
4386 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
4388 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
4390 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
4392 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
4394 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
4396 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
4398 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
4400 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
4402 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
4404 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
4406 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
4408 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
4410 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
4412 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
4414 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
4416 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
4418 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
4420 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
4422 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
4424 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
4426 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
4428 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
4430 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
4432 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
4435 /*C224*/SET SCHEMA B
4436 DROP SCHEMA B CASCADE
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
4463 /*C226*/SET SCHEMA B
4465 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
4467 INSERT INTO "Lieu" VALUES(1,'Gentioux')
4469 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
4471 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
4473 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
4475 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
4477 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
4479 INSERT INTO "Lieu" VALUES(7,'Tarnac')
4481 INSERT INTO "Lieu" VALUES(8,'Felletin')
4483 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
4485 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
4487 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
4489 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
4491 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
4493 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
4495 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
4497 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
4499 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
4501 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
4503 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
4505 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
4507 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
4509 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
4511 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
4513 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
4515 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
4517 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
4519 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
4521 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
4523 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
4525 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
4527 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
4529 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
4531 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
4533 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
4536 /*C227*/SET SCHEMA B
4537 DROP SCHEMA B CASCADE
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
4564 /*C229*/SET SCHEMA B
4566 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
4568 INSERT INTO "Lieu" VALUES(1,'Gentioux')
4570 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
4572 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
4574 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
4576 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
4578 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
4580 INSERT INTO "Lieu" VALUES(7,'Tarnac')
4582 INSERT INTO "Lieu" VALUES(8,'Felletin')
4584 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
4586 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
4588 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
4590 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
4592 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
4594 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
4596 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
4598 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
4600 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
4602 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
4604 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
4606 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
4608 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
4610 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
4612 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
4614 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
4616 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
4618 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
4620 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
4622 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
4624 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
4626 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
4628 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
4630 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
4632 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
4634 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
4636 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
4638 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
4640 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
4642 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
4644 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
4646 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
4648 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
4650 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
4652 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
4654 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
4656 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
4658 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
4660 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
4662 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
4664 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
4666 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
4668 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
4670 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
4672 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
4674 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
4676 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
4678 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
4680 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
4682 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
4684 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
4686 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
4688 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
4690 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
4692 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
4694 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
4696 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
4698 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
4700 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
4702 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
4704 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
4706 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
4708 INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
4710 INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
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)
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
4738 /*C232*/SET SCHEMA B
4739 DELETE FROM "Vente" WHERE ID=6
4740 INSERT INTO "Vente" VALUES(6,15,1.000,3)
4742 /*C233*/SET SCHEMA B
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
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
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)
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
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
5551 /*C336*/SET SCHEMA B
5552 DROP SCHEMA B CASCADE
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
5579 /*C338*/SET SCHEMA B
5581 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
5583 INSERT INTO "Lieu" VALUES(1,'Gentioux')
5585 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
5587 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
5589 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
5591 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
5593 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
5595 INSERT INTO "Lieu" VALUES(7,'Tarnac')
5597 INSERT INTO "Lieu" VALUES(8,'Felletin')
5599 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
5601 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
5603 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
5605 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
5607 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
5609 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
5611 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
5613 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
5615 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
5617 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
5619 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
5621 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
5623 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
5625 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
5627 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
5629 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
5631 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
5633 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
5635 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
5637 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
5639 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
5641 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
5643 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
5645 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
5647 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
5649 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
5651 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
5653 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
5655 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
5657 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
5659 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
5661 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
5663 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
5665 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
5667 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
5669 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
5671 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
5673 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
5675 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
5677 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
5679 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
5681 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
5683 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
5685 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
5687 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
5689 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
5691 INSERT INTO "Client" VALUES(1,'Julien',0,'','')
5693 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
5695 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
5697 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
5699 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
5701 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
5703 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
5705 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
5707 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
5709 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
5711 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
5713 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
5715 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
5717 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
5719 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
5721 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
5723 INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
5725 INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
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)
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)
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)
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)
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
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
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
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
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
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
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
5830 /*C347*/SET SCHEMA B
5831 DROP SCHEMA B CASCADE
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 )
5843 /*C349*/SET SCHEMA B
5844 DROP SCHEMA B CASCADE
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 )
5856 /*C351*/SET SCHEMA B
5857 DROP SCHEMA B CASCADE
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 )
5869 /*C353*/SET SCHEMA B
5870 DROP SCHEMA B CASCADE
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
5896 /*C355*/SET SCHEMA B
5898 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
5900 INSERT INTO "Lieu" VALUES(1,'Gentioux')
5902 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
5904 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
5906 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
5908 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
5910 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
5912 INSERT INTO "Lieu" VALUES(7,'Tarnac')
5914 INSERT INTO "Lieu" VALUES(8,'Felletin')
5916 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
5918 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
5920 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
5922 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
5924 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
5926 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
5928 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
5930 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
5932 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
5934 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
5936 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
5938 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
5940 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
5942 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
5944 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
5946 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
5948 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
5950 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
5952 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
5954 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
5956 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
5958 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
5960 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
5962 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
5964 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
5966 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
5968 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
5970 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
5972 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
5974 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
5976 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
5978 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
5980 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
5982 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
5984 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
5986 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
5988 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
5990 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
5992 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
5994 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
5996 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
5998 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
6000 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
6002 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
6004 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
6007 /*C356*/SET SCHEMA B
6008 DROP SCHEMA B CASCADE
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
6034 /*C358*/SET SCHEMA B
6036 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
6038 INSERT INTO "Lieu" VALUES(1,'Gentioux')
6040 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
6042 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
6044 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
6046 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
6048 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
6050 INSERT INTO "Lieu" VALUES(7,'Tarnac')
6052 INSERT INTO "Lieu" VALUES(8,'Felletin')
6054 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
6056 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
6058 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
6060 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
6062 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
6064 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
6066 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
6068 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
6070 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
6072 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
6074 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
6076 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
6078 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
6080 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
6082 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
6084 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
6086 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
6088 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
6090 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
6092 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
6094 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
6096 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
6098 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
6100 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
6102 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
6104 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
6106 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
6108 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
6110 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
6112 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
6114 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
6116 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
6118 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
6120 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
6122 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
6124 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
6126 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
6128 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
6130 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
6132 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
6134 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
6136 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
6138 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
6140 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
6142 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
6144 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
6146 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
6148 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
6150 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
6152 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
6154 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
6156 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
6158 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
6160 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
6162 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
6164 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
6166 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
6168 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
6170 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
6172 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
6174 INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
6176 INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
6178 INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
6180 INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
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)
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)
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)
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)
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
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
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
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
6252 /*C364*/SET SCHEMA B
6253 DROP SCHEMA B CASCADE
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
6279 /*C366*/SET SCHEMA B
6281 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
6283 INSERT INTO "Lieu" VALUES(1,'Gentioux')
6285 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
6287 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
6289 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
6291 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
6293 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
6295 INSERT INTO "Lieu" VALUES(7,'Tarnac')
6297 INSERT INTO "Lieu" VALUES(8,'Felletin')
6299 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
6301 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
6303 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
6305 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
6307 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
6309 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
6311 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
6313 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
6315 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
6317 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
6319 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
6321 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
6323 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
6325 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
6327 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
6329 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
6331 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
6333 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
6335 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
6337 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
6339 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
6341 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
6343 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
6345 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
6347 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
6349 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
6351 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
6353 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
6355 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
6357 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
6359 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
6361 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
6363 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
6365 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
6367 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
6369 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
6371 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
6373 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
6375 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
6377 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
6379 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
6381 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
6383 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
6385 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
6387 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
6389 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
6391 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
6393 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
6395 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
6397 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
6399 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
6401 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
6403 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
6405 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
6407 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
6409 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
6411 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
6413 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
6415 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
6417 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
6419 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
6421 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
6423 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
6425 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
6427 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
6429 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
6431 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
6434 /*C367*/SET SCHEMA B
6435 DROP SCHEMA B CASCADE
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
6461 /*C369*/SET SCHEMA B
6463 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
6465 INSERT INTO "Lieu" VALUES(1,'Gentioux')
6467 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
6469 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
6471 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
6473 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
6475 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
6477 INSERT INTO "Lieu" VALUES(7,'Tarnac')
6479 INSERT INTO "Lieu" VALUES(8,'Felletin')
6481 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
6483 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
6485 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
6487 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
6489 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
6491 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
6493 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
6495 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
6497 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
6499 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
6501 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
6503 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
6505 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
6507 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
6509 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
6511 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
6513 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
6515 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
6517 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
6519 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
6521 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
6523 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
6525 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
6527 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
6529 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
6531 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
6533 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
6535 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
6537 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
6539 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
6541 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
6543 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
6545 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
6547 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
6549 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
6551 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
6553 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
6555 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
6557 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
6559 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
6561 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
6563 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
6565 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
6567 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
6569 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
6571 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
6573 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
6575 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
6577 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
6579 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
6581 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
6583 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
6585 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
6587 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
6589 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
6591 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
6593 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
6595 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
6597 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
6599 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
6601 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
6603 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
6605 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
6607 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
6609 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
6611 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
6613 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
6615 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
6617 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
6619 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
6621 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
6623 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
6625 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
6627 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
6629 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
6631 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
6633 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
6635 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
6637 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
6639 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
6641 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
6643 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
6645 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
6647 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
6649 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
6651 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
6653 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
6655 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
6657 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
6659 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
6661 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
6663 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
6665 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
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)
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)
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)
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)
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
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
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
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
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
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
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
6766 /*C377*/SET SCHEMA B
6767 DROP SCHEMA B CASCADE
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
6793 /*C379*/SET SCHEMA B
6795 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
6797 INSERT INTO "Lieu" VALUES(1,'Gentioux')
6799 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
6801 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
6803 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
6805 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
6807 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
6809 INSERT INTO "Lieu" VALUES(7,'Tarnac')
6811 INSERT INTO "Lieu" VALUES(8,'Felletin')
6813 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
6815 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
6817 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
6819 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
6821 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
6823 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
6825 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
6827 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
6829 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
6831 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
6833 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
6835 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
6837 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
6839 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
6841 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
6843 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
6845 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
6847 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
6849 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
6851 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
6853 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
6855 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
6857 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
6859 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
6861 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
6863 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
6865 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
6867 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
6869 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
6871 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
6873 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
6875 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
6877 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
6879 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
6881 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
6883 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
6885 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
6887 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
6889 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
6891 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
6893 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
6895 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
6897 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
6899 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
6901 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
6903 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
6905 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
6907 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
6909 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
6911 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
6913 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
6915 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
6917 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
6919 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
6921 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
6923 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
6925 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
6927 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
6929 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
6931 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
6933 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
6935 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
6937 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
6939 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
6941 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
6943 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
6945 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
6947 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
6949 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
6951 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
6953 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
6955 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
6957 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
6959 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
6961 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
6963 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
6965 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
6967 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
6969 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
6971 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
6973 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
6975 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
6977 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
6979 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
6981 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
6983 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
6985 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
6987 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
6989 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
6991 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
6993 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
6995 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
6997 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
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)
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)
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)
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)
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
7039 /*C381*/SET SCHEMA B
7040 DROP SCHEMA B CASCADE
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
7066 /*C383*/SET SCHEMA B
7068 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
7070 INSERT INTO "Lieu" VALUES(1,'Gentioux')
7072 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
7074 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
7076 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
7078 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
7080 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
7082 INSERT INTO "Lieu" VALUES(7,'Tarnac')
7084 INSERT INTO "Lieu" VALUES(8,'Felletin')
7086 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
7088 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
7090 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
7092 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
7094 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
7096 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
7098 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
7100 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
7102 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
7104 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
7106 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
7108 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
7110 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
7112 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
7114 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
7116 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
7118 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
7120 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
7122 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
7124 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
7126 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
7128 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
7130 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
7132 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
7134 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
7136 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
7138 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
7140 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
7142 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
7144 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
7146 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
7148 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
7150 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
7152 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
7154 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
7156 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
7158 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
7160 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
7162 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
7164 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
7166 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
7168 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
7170 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
7172 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
7174 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
7176 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
7178 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
7180 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
7182 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
7184 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
7186 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
7188 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
7190 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
7192 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
7194 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
7196 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
7198 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
7200 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
7202 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
7204 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
7206 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
7208 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
7210 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
7212 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
7214 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
7216 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
7218 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
7220 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
7222 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
7224 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
7226 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
7228 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
7230 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
7232 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
7234 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
7236 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
7238 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
7240 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
7242 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
7244 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
7246 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
7248 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
7250 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
7252 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
7254 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
7256 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
7258 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
7260 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
7262 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
7264 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
7266 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
7268 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
7270 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
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)
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)
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)
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)
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
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
7322 /*C386*/SET SCHEMA B
7325 /*C387*/SET SCHEMA B
7326 DROP SCHEMA B CASCADE
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
7352 /*C389*/SET SCHEMA B
7354 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
7356 INSERT INTO "Lieu" VALUES(1,'Gentioux')
7358 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
7360 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
7362 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
7364 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
7366 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
7368 INSERT INTO "Lieu" VALUES(7,'Tarnac')
7370 INSERT INTO "Lieu" VALUES(8,'Felletin')
7372 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
7374 INSERT INTO "Facture" VALUES(0,'2025-04-29')
7376 INSERT INTO "Facture" VALUES(1,'2025-04-29')
7378 INSERT INTO "Facture" VALUES(2,'2025-04-29')
7380 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
7382 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
7384 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
7386 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
7388 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
7390 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
7392 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
7394 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
7396 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
7398 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
7400 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
7402 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
7404 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
7406 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
7408 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
7410 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
7412 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
7414 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
7416 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
7418 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
7420 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
7422 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
7424 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
7426 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
7428 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
7430 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
7432 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
7434 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
7436 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
7438 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
7440 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
7442 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
7444 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
7446 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
7448 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
7450 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
7452 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
7454 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
7456 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
7458 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
7460 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
7462 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
7464 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
7466 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
7468 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
7470 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
7472 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
7474 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
7476 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
7478 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
7480 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
7482 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
7484 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
7486 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
7488 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
7490 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
7492 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
7494 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
7496 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
7498 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
7500 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
7502 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
7504 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
7506 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
7508 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
7510 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
7512 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
7514 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
7516 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
7518 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
7520 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
7522 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
7524 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
7526 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
7528 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
7530 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
7532 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
7534 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
7536 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
7538 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
7540 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
7542 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
7544 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
7546 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
7548 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
7550 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
7552 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
7554 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
7556 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
7558 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
7560 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
7562 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
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)
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)
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)
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)
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
7604 /*C391*/SET SCHEMA B
7605 DROP SCHEMA B CASCADE
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
7631 /*C393*/SET SCHEMA B
7633 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
7635 INSERT INTO "Lieu" VALUES(1,'Gentioux')
7637 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
7639 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
7641 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
7643 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
7645 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
7647 INSERT INTO "Lieu" VALUES(7,'Tarnac')
7649 INSERT INTO "Lieu" VALUES(8,'Felletin')
7651 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
7653 INSERT INTO "Facture" VALUES(0,'2025-04-29')
7655 INSERT INTO "Facture" VALUES(1,'2025-04-29')
7657 INSERT INTO "Facture" VALUES(2,'2025-04-29')
7659 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
7661 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
7663 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
7665 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
7667 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
7669 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
7671 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
7673 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
7675 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
7677 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
7679 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
7681 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
7683 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
7685 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
7687 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
7689 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
7691 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
7693 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
7695 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
7697 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
7699 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
7701 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
7703 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
7705 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
7707 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
7709 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
7711 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
7713 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
7715 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
7717 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
7719 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
7721 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
7723 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
7725 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
7727 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
7729 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
7731 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
7733 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
7735 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
7737 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
7739 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
7741 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
7743 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
7745 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
7747 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
7749 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
7751 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
7753 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
7755 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
7757 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
7759 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
7761 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
7763 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
7765 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
7767 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
7769 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
7771 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
7773 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
7775 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
7777 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
7779 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
7781 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
7783 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
7785 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
7787 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
7789 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
7791 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
7793 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
7795 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
7797 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
7799 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
7801 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
7803 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
7805 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
7807 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
7809 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
7811 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
7813 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
7815 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
7817 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
7819 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
7821 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
7823 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
7825 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
7827 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
7829 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
7831 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
7833 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
7835 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
7837 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
7839 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
7841 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
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)
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)
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)
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)
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
7883 /*C395*/SET SCHEMA B
7884 DROP SCHEMA B CASCADE
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
7910 /*C397*/SET SCHEMA B
7912 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
7914 INSERT INTO "Lieu" VALUES(1,'Gentioux')
7916 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
7918 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
7920 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
7922 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
7924 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
7926 INSERT INTO "Lieu" VALUES(7,'Tarnac')
7928 INSERT INTO "Lieu" VALUES(8,'Felletin')
7930 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
7932 INSERT INTO "Facture" VALUES(0,'2025-04-29')
7934 INSERT INTO "Facture" VALUES(1,'2025-04-29')
7936 INSERT INTO "Facture" VALUES(2,'2025-04-29')
7938 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
7940 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
7942 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
7944 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
7946 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
7948 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
7950 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
7952 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
7954 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
7956 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
7958 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
7960 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
7962 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
7964 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
7966 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
7968 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
7970 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
7972 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
7974 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
7976 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
7978 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
7980 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
7982 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
7984 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
7986 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
7988 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
7990 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
7992 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
7994 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
7996 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
7998 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
8000 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
8002 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
8004 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
8006 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
8008 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
8010 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
8012 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
8014 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
8016 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
8018 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
8020 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
8022 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
8024 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
8026 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
8028 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
8030 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
8032 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
8034 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
8036 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
8038 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
8040 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
8042 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
8044 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
8046 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
8048 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
8050 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
8052 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
8054 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
8056 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
8058 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
8060 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
8062 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
8064 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
8066 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
8068 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
8070 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
8072 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
8074 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
8076 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
8078 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
8080 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
8082 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
8084 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
8086 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
8088 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
8090 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
8092 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
8094 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
8096 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
8098 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
8100 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
8102 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
8104 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
8106 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
8108 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
8110 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
8112 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
8114 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
8116 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
8118 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
8120 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
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)
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)
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)
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)
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
8162 /*C399*/SET SCHEMA B
8163 DROP SCHEMA B CASCADE
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
8189 /*C401*/SET SCHEMA B
8191 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
8193 INSERT INTO "Lieu" VALUES(1,'Gentioux')
8195 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
8197 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
8199 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
8201 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
8203 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
8205 INSERT INTO "Lieu" VALUES(7,'Tarnac')
8207 INSERT INTO "Lieu" VALUES(8,'Felletin')
8209 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
8211 INSERT INTO "Facture" VALUES(0,'2025-04-29')
8213 INSERT INTO "Facture" VALUES(1,'2025-04-29')
8215 INSERT INTO "Facture" VALUES(2,'2025-04-29')
8218 /*C402*/SET SCHEMA B
8219 DROP SCHEMA B CASCADE
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
8245 /*C404*/SET SCHEMA B
8247 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
8249 INSERT INTO "Lieu" VALUES(1,'Gentioux')
8251 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
8253 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
8255 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
8257 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
8259 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
8261 INSERT INTO "Lieu" VALUES(7,'Tarnac')
8263 INSERT INTO "Lieu" VALUES(8,'Felletin')
8265 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
8267 INSERT INTO "Facture" VALUES(0,'2025-04-29')
8269 INSERT INTO "Facture" VALUES(1,'2025-04-29')
8271 INSERT INTO "Facture" VALUES(2,'2025-04-29')
8273 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
8275 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
8277 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
8279 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
8281 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
8283 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
8285 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
8287 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
8289 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
8291 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
8293 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
8295 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
8297 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
8299 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
8301 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
8303 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
8305 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
8307 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
8309 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
8311 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
8313 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
8315 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
8317 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
8319 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
8321 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
8323 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
8325 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
8327 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
8329 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
8331 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
8333 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
8335 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
8337 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
8339 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
8341 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
8343 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
8345 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
8347 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
8349 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
8351 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
8353 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
8355 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
8357 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
8359 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
8361 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
8363 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
8365 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
8367 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
8369 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
8371 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
8373 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
8375 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
8377 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
8379 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
8381 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
8383 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
8385 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
8387 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
8389 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
8391 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
8393 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
8395 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
8397 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
8399 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
8401 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
8403 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
8405 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
8407 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
8409 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
8411 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
8413 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
8415 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
8417 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
8419 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
8421 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
8423 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
8425 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
8427 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
8429 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
8431 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
8433 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
8435 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
8437 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
8439 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
8441 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
8443 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
8445 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
8447 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
8449 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
8451 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
8453 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
8455 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
8457 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
8459 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
8461 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
8463 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
8465 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
8467 INSERT INTO "Vente" VALUES(0,10,1.000,0)
8469 INSERT INTO "Vente" VALUES(1,14,2.000,1)
8471 INSERT INTO "Vente" VALUES(2,11,3.000,0)
8473 INSERT INTO "Vente" VALUES(3,16,4.000,2)
8475 INSERT INTO "Vente" VALUES(4,10,1.000,3)
8477 INSERT INTO "Vente" VALUES(5,14,2.000,4)
8479 INSERT INTO "Vente" VALUES(6,11,1.000,3)
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
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
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
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
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
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
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
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
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
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
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
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
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
8610 /*C418*/SET SCHEMA B
8612 /*C419*/SET SCHEMA B
8614 /*C420*/SET SCHEMA B
8616 /*C421*/SET SCHEMA B
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
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;
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
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
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
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;
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
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
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
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
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;
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
9052 /*C466*/SET SCHEMA B
9055 /*C467*/SET SCHEMA B
9056 DROP SCHEMA B CASCADE
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
9082 /*C469*/SET SCHEMA B
9084 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
9086 INSERT INTO "Lieu" VALUES(1,'Gentioux')
9088 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
9090 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
9092 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
9094 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
9096 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
9098 INSERT INTO "Lieu" VALUES(7,'Tarnac')
9100 INSERT INTO "Lieu" VALUES(8,'Felletin')
9102 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
9104 INSERT INTO "Facture" VALUES(0,'2025-04-29')
9106 INSERT INTO "Facture" VALUES(1,'2025-04-29')
9108 INSERT INTO "Facture" VALUES(2,'2025-04-29')
9110 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
9112 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
9114 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
9116 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
9118 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
9120 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
9122 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
9124 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
9126 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
9128 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
9130 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
9132 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
9134 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
9136 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
9138 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
9140 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
9142 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
9144 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
9146 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
9148 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
9150 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
9152 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
9154 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
9156 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
9158 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
9160 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
9162 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
9164 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
9166 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
9168 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
9170 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
9172 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
9174 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
9176 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
9178 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
9180 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
9182 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
9184 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
9186 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
9188 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
9190 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
9192 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
9194 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
9196 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
9198 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
9200 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
9202 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
9204 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
9206 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
9208 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
9210 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
9212 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
9214 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
9216 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
9218 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
9220 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
9222 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
9224 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
9226 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
9228 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
9230 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
9232 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
9234 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
9236 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
9238 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
9240 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
9242 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
9244 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
9246 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
9248 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
9250 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
9252 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
9254 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
9256 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
9258 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
9260 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
9262 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
9264 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
9266 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
9268 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
9270 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
9272 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
9274 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
9276 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
9278 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
9280 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
9282 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
9284 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
9286 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
9288 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
9290 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
9292 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
9294 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
9296 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
9298 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
9300 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
9302 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
9304 INSERT INTO "Vente" VALUES(0,10,1.000,0)
9306 INSERT INTO "Vente" VALUES(1,14,2.000,1)
9308 INSERT INTO "Vente" VALUES(2,11,3.000,0)
9310 INSERT INTO "Vente" VALUES(3,16,4.000,2)
9312 INSERT INTO "Vente" VALUES(4,10,1.000,3)
9314 INSERT INTO "Vente" VALUES(5,14,2.000,4)
9316 INSERT INTO "Vente" VALUES(6,11,1.000,3)
9319 /*C361*/SET SCHEMA B
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
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
9341 /*C470*/SET SCHEMA B
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
9353 /*C473*/SET SCHEMA B
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
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
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
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
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
9399 /*C481*/SET SCHEMA B
9400 DROP SCHEMA B CASCADE
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
9426 /*C483*/SET SCHEMA B
9428 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
9430 INSERT INTO "Lieu" VALUES(1,'Gentioux')
9432 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
9434 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
9436 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
9438 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
9440 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
9442 INSERT INTO "Lieu" VALUES(7,'Tarnac')
9444 INSERT INTO "Lieu" VALUES(8,'Felletin')
9446 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
9448 INSERT INTO "Facture" VALUES(0,'2025-04-29')
9450 INSERT INTO "Facture" VALUES(1,'2025-04-29')
9452 INSERT INTO "Facture" VALUES(2,'2025-04-29')
9454 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
9456 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
9458 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
9460 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
9462 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
9464 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
9466 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
9468 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
9470 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
9472 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
9474 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
9476 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
9478 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
9480 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
9482 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
9484 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
9486 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
9488 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
9490 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
9492 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
9494 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
9496 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
9498 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
9500 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
9502 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
9504 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
9506 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
9508 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
9510 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
9512 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
9514 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
9516 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
9518 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
9520 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
9522 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
9524 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
9526 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
9528 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
9530 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
9532 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
9534 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
9536 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
9538 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
9540 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
9542 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
9544 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
9546 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
9548 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
9550 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
9552 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
9554 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
9556 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
9558 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
9560 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
9562 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
9564 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
9566 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
9568 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
9570 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
9572 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
9574 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
9576 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
9578 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
9580 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
9582 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
9584 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
9586 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
9588 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
9590 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
9592 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
9594 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
9596 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
9598 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
9600 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
9602 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
9604 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
9606 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
9608 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
9610 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
9612 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
9614 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
9616 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
9618 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
9620 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
9622 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
9624 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
9626 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
9628 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
9630 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
9632 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
9634 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
9636 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
9638 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
9640 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
9642 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
9644 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
9646 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
9648 INSERT INTO "Vente" VALUES(0,10,1.000,0)
9650 INSERT INTO "Vente" VALUES(1,14,2.000,1)
9652 INSERT INTO "Vente" VALUES(2,11,3.000,0)
9654 INSERT INTO "Vente" VALUES(3,16,4.000,2)
9656 INSERT INTO "Vente" VALUES(4,10,1.000,3)
9658 INSERT INTO "Vente" VALUES(5,14,2.000,4)
9660 INSERT INTO "Vente" VALUES(6,11,1.000,3)
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
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
9683 /*C486*/SET SCHEMA B
9684 DROP SCHEMA B CASCADE
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
9710 /*C488*/SET SCHEMA B
9712 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
9714 INSERT INTO "Lieu" VALUES(1,'Gentioux')
9716 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
9718 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
9720 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
9722 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
9724 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
9726 INSERT INTO "Lieu" VALUES(7,'Tarnac')
9728 INSERT INTO "Lieu" VALUES(8,'Felletin')
9730 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
9732 INSERT INTO "Facture" VALUES(0,'2025-04-29')
9734 INSERT INTO "Facture" VALUES(1,'2025-04-29')
9736 INSERT INTO "Facture" VALUES(2,'2025-04-29')
9738 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
9740 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
9742 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
9744 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
9746 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
9748 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
9750 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
9752 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
9754 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
9756 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
9758 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
9760 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
9762 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
9764 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
9766 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
9768 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
9770 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
9772 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
9774 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
9776 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
9778 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
9780 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
9782 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
9784 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
9786 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
9788 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
9790 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
9792 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
9794 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
9796 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
9798 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
9800 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
9802 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
9804 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
9806 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
9808 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
9810 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
9812 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
9814 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
9816 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
9818 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
9820 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
9822 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
9824 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
9826 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
9828 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
9830 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
9832 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
9834 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
9836 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
9838 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
9840 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
9842 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
9844 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
9846 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
9848 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
9850 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
9852 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
9854 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
9856 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
9858 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
9860 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
9862 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
9864 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
9866 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
9868 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
9870 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
9872 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
9874 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
9876 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
9878 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
9880 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
9882 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
9884 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
9886 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
9888 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
9890 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
9892 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
9894 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
9896 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
9898 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
9900 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
9902 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
9904 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
9906 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
9908 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
9910 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
9912 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
9914 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
9916 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
9918 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
9920 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
9922 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
9924 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
9926 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
9928 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
9930 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
9932 INSERT INTO "Vente" VALUES(0,10,1.000,0)
9934 INSERT INTO "Vente" VALUES(1,14,2.000,1)
9936 INSERT INTO "Vente" VALUES(2,11,3.000,0)
9938 INSERT INTO "Vente" VALUES(3,16,4.000,2)
9940 INSERT INTO "Vente" VALUES(4,10,1.000,3)
9942 INSERT INTO "Vente" VALUES(5,14,2.000,4)
9944 INSERT INTO "Vente" VALUES(6,11,1.000,3)
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
9957 /*C490*/SET SCHEMA B
9958 DROP SCHEMA B CASCADE
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
9984 /*C492*/SET SCHEMA B
9986 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
9988 INSERT INTO "Lieu" VALUES(1,'Gentioux')
9990 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
9992 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
9994 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
9996 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
9998 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
10000 INSERT INTO "Lieu" VALUES(7,'Tarnac')
10002 INSERT INTO "Lieu" VALUES(8,'Felletin')
10004 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
10006 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
10008 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
10010 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
10012 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
10014 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
10016 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
10018 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
10020 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
10022 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
10024 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
10026 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
10028 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
10030 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
10032 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
10034 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
10036 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
10038 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
10040 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
10042 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
10044 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
10046 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
10048 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
10050 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
10052 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
10054 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
10056 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
10058 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
10060 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
10062 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
10064 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
10066 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
10068 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
10070 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
10072 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
10074 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
10076 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
10078 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
10080 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
10082 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
10084 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
10086 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
10088 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
10090 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
10092 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
10094 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
10096 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
10098 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
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
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
10121 /*C495*/SET SCHEMA B
10122 DROP SCHEMA B CASCADE
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
10148 /*C497*/SET SCHEMA B
10150 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
10152 INSERT INTO "Lieu" VALUES(1,'Gentioux')
10154 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
10156 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
10158 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
10160 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
10162 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
10164 INSERT INTO "Lieu" VALUES(7,'Tarnac')
10166 INSERT INTO "Lieu" VALUES(8,'Felletin')
10168 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
10170 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
10172 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
10174 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
10176 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
10178 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
10180 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
10182 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
10184 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
10186 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
10188 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
10190 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
10192 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
10194 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
10196 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
10198 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
10200 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
10202 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
10204 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
10206 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
10208 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
10210 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
10212 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
10214 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
10216 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
10218 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
10220 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
10222 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
10224 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
10226 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
10228 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
10230 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
10232 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
10234 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
10236 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
10238 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
10240 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
10242 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
10244 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
10246 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
10248 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
10250 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
10252 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
10254 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
10256 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
10258 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
10260 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
10262 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
10264 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
10266 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
10268 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
10270 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
10272 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
10274 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
10276 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
10278 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
10280 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
10282 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
10284 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
10286 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
10288 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
10290 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
10292 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
10294 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
10296 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
10298 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
10300 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
10302 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
10304 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
10306 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
10308 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
10310 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
10312 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
10314 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
10316 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
10318 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
10320 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
10322 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
10324 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
10326 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
10328 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
10330 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
10332 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
10334 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
10336 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
10338 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
10340 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
10342 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
10344 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
10346 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
10348 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
10350 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
10352 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
10354 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
10356 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
10358 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
10360 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
10362 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
10364 INSERT INTO "Vente" VALUES(0,10,1.000,0)
10366 INSERT INTO "Vente" VALUES(1,14,2.000,1)
10368 INSERT INTO "Vente" VALUES(2,11,3.000,0)
10370 INSERT INTO "Vente" VALUES(3,16,4.000,2)
10372 INSERT INTO "Vente" VALUES(4,10,1.000,3)
10374 INSERT INTO "Vente" VALUES(5,14,2.000,4)
10376 INSERT INTO "Vente" VALUES(6,11,1.000,3)
10379 /*C498*/SET SCHEMA B
10380 DROP SCHEMA B CASCADE
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
10406 /*C500*/SET SCHEMA B
10408 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
10410 INSERT INTO "Lieu" VALUES(1,'Gentioux')
10412 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
10414 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
10416 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
10418 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
10420 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
10422 INSERT INTO "Lieu" VALUES(7,'Tarnac')
10424 INSERT INTO "Lieu" VALUES(8,'Felletin')
10426 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
10428 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
10430 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
10432 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
10434 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
10436 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
10438 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
10440 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
10442 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
10444 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
10446 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
10448 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
10450 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
10452 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
10454 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
10456 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
10458 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
10460 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
10462 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
10464 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
10466 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
10468 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
10470 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
10472 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
10474 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
10476 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
10478 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
10480 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
10482 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
10484 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
10486 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
10488 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
10490 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
10492 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
10494 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
10496 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
10498 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
10500 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
10502 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
10504 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
10506 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
10508 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
10510 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
10512 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
10514 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
10516 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
10518 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
10520 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
10522 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
10524 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
10526 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
10528 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
10530 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
10532 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
10534 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
10536 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
10538 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
10540 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
10542 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
10544 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
10546 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
10548 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
10550 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
10552 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
10554 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
10556 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
10558 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
10560 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
10562 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
10564 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
10566 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
10568 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
10570 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
10572 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
10574 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
10576 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
10578 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
10580 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
10582 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
10584 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
10586 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
10588 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
10590 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
10592 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
10594 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
10596 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
10598 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
10600 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
10602 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
10604 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
10606 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
10608 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
10610 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
10612 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
10614 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
10616 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
10618 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
10620 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
10622 INSERT INTO "Vente" VALUES(0,10,1.000,0)
10624 INSERT INTO "Vente" VALUES(1,14,2.000,1)
10626 INSERT INTO "Vente" VALUES(2,11,3.000,0)
10628 INSERT INTO "Vente" VALUES(3,16,4.000,2)
10630 INSERT INTO "Vente" VALUES(4,10,1.000,3)
10632 INSERT INTO "Vente" VALUES(5,14,2.000,4)
10634 INSERT INTO "Vente" VALUES(6,11,1.000,3)
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)
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)
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)
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
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
10673 /*C503*/SET SCHEMA B
10674 DROP SCHEMA B CASCADE
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
10700 /*C505*/SET SCHEMA B
10702 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
10704 INSERT INTO "Lieu" VALUES(1,'Gentioux')
10706 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
10708 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
10710 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
10712 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
10714 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
10716 INSERT INTO "Lieu" VALUES(7,'Tarnac')
10718 INSERT INTO "Lieu" VALUES(8,'Felletin')
10720 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
10722 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
10724 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
10726 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
10728 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
10730 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
10732 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
10734 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
10736 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
10738 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
10740 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
10742 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
10744 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
10746 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
10748 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
10750 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
10752 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
10754 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
10756 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
10758 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
10760 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
10762 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
10764 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
10766 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
10768 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
10770 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
10772 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
10774 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
10776 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
10778 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
10780 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
10782 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
10784 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
10786 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
10788 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
10790 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
10792 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
10794 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
10796 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
10798 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
10800 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
10802 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
10804 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
10806 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
10808 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
10810 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
10812 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
10814 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
10816 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
10818 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
10820 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
10822 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
10824 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
10826 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
10828 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
10830 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
10832 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
10834 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
10836 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
10838 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
10840 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
10842 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
10844 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
10846 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
10848 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
10850 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
10852 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
10854 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
10856 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
10858 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
10860 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
10862 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
10864 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
10866 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
10868 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
10870 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
10872 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
10874 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
10876 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
10878 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
10880 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
10882 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
10884 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
10886 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
10888 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
10890 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
10892 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
10894 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
10896 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
10898 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
10900 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
10902 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
10904 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
10906 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
10908 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
10910 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
10912 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
10914 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
10916 INSERT INTO "Vente" VALUES(0,10,1.000,0)
10918 INSERT INTO "Vente" VALUES(1,14,2.000,1)
10920 INSERT INTO "Vente" VALUES(2,11,3.000,0)
10922 INSERT INTO "Vente" VALUES(3,16,4.000,2)
10924 INSERT INTO "Vente" VALUES(4,10,1.000,3)
10926 INSERT INTO "Vente" VALUES(5,14,2.000,4)
10928 INSERT INTO "Vente" VALUES(6,11,1.000,3)
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
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)
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)
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)
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
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
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
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
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
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
11017 /*C513*/SET SCHEMA B
11019 /*C514*/SET SCHEMA B
11021 /*C515*/SET SCHEMA B
11023 /*C516*/SET SCHEMA B
11025 /*C517*/SET SCHEMA B
11027 /*C518*/SET SCHEMA B
11029 /*C519*/SET SCHEMA B
11031 /*C520*/SET SCHEMA B
11033 /*C521*/SET SCHEMA B
11034 DROP SCHEMA B CASCADE
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
11060 /*C523*/SET SCHEMA B
11062 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
11064 INSERT INTO "Lieu" VALUES(1,'Gentioux')
11066 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
11068 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
11070 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
11072 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
11074 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
11076 INSERT INTO "Lieu" VALUES(7,'Tarnac')
11078 INSERT INTO "Lieu" VALUES(8,'Felletin')
11080 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
11082 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
11084 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
11086 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
11088 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
11090 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
11092 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
11094 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
11096 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
11098 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
11100 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
11102 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
11104 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
11106 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
11108 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
11110 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
11112 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
11114 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
11116 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
11118 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
11120 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
11122 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
11124 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
11126 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
11128 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
11130 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
11132 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
11134 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
11136 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
11138 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
11140 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
11142 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
11144 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
11146 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
11148 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
11150 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
11152 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
11154 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
11156 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
11158 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
11160 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
11162 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
11164 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
11166 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
11168 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
11170 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
11172 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
11174 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
11176 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
11178 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
11180 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
11182 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
11184 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
11186 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
11188 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
11190 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
11192 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
11194 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
11196 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
11198 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
11200 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
11202 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
11204 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
11206 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
11208 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
11210 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
11212 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
11214 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
11216 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
11218 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
11220 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
11222 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
11224 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
11226 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
11228 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
11230 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
11232 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
11234 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
11236 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
11238 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
11240 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
11242 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
11244 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
11246 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
11248 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
11250 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
11252 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
11254 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
11256 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
11258 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
11260 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
11262 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
11264 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
11266 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
11268 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
11270 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
11272 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
11274 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
11276 INSERT INTO "Vente" VALUES(0,10,1.000,0)
11278 INSERT INTO "Vente" VALUES(1,14,2.000,1)
11280 INSERT INTO "Vente" VALUES(2,11,3.000,0)
11282 INSERT INTO "Vente" VALUES(3,16,4.000,2)
11284 INSERT INTO "Vente" VALUES(4,10,1.000,3)
11286 INSERT INTO "Vente" VALUES(5,14,2.000,4)
11288 INSERT INTO "Vente" VALUES(6,11,1.000,3)
11291 /*C524*/SET SCHEMA B
11293 /*C525*/SET SCHEMA B
11294 DROP SCHEMA B CASCADE
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
11320 /*C527*/SET SCHEMA B
11322 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
11324 INSERT INTO "Lieu" VALUES(1,'Gentioux')
11326 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
11328 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
11330 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
11332 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
11334 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
11336 INSERT INTO "Lieu" VALUES(7,'Tarnac')
11338 INSERT INTO "Lieu" VALUES(8,'Felletin')
11340 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
11342 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
11344 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
11346 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
11348 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
11350 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
11352 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
11354 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
11356 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
11358 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
11360 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
11362 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
11364 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
11366 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
11368 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
11370 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
11372 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
11374 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
11376 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
11378 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
11380 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
11382 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
11384 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
11386 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
11388 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
11390 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
11392 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
11394 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
11396 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
11398 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
11400 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
11402 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
11404 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
11406 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
11408 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
11410 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
11412 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
11414 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
11416 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
11418 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
11420 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
11422 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
11424 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
11426 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
11428 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
11430 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
11432 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
11434 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
11436 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,NULL)
11438 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,NULL)
11440 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,NULL)
11442 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,NULL)
11444 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
11446 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
11448 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
11450 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
11452 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
11454 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
11456 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
11458 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
11460 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
11462 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
11464 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
11466 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
11468 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
11470 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
11472 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
11474 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
11476 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
11478 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
11480 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
11482 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
11484 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
11486 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
11488 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
11490 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
11492 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
11494 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
11496 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
11498 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
11500 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
11502 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
11504 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
11506 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
11508 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
11510 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
11512 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
11514 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
11516 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
11518 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
11520 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
11522 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
11524 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
11526 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
11528 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
11530 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
11532 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
11534 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
11536 INSERT INTO "Vente" VALUES(0,10,1.000,0)
11538 INSERT INTO "Vente" VALUES(1,14,2.000,1)
11540 INSERT INTO "Vente" VALUES(2,11,3.000,0)
11542 INSERT INTO "Vente" VALUES(3,16,4.000,2)
11544 INSERT INTO "Vente" VALUES(4,10,1.000,3)
11546 INSERT INTO "Vente" VALUES(5,14,2.000,4)
11548 INSERT INTO "Vente" VALUES(6,11,1.000,3)
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)
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)
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)
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
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
11587 /*C530*/SET SCHEMA B
11588 DROP SCHEMA B CASCADE
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
11614 /*C532*/SET SCHEMA B
11616 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
11618 INSERT INTO "Lieu" VALUES(1,'Gentioux')
11620 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
11622 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
11624 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
11626 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
11628 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
11630 INSERT INTO "Lieu" VALUES(7,'Tarnac')
11632 INSERT INTO "Lieu" VALUES(8,'Felletin')
11634 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
11636 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
11638 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
11640 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
11642 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
11644 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
11646 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
11648 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
11650 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
11652 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
11654 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
11656 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
11658 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
11660 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
11662 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
11664 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
11666 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
11668 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
11670 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
11672 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
11674 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
11676 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
11678 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
11680 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
11682 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
11684 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
11686 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
11688 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
11690 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
11692 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
11694 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
11696 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
11698 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
11700 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
11702 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
11704 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
11706 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
11708 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
11710 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
11712 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
11714 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
11716 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
11718 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
11720 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
11722 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
11724 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
11726 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
11728 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
11730 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,NULL)
11732 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,NULL)
11734 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,NULL)
11736 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,NULL)
11738 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
11740 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
11742 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
11744 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
11746 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
11748 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
11750 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
11752 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
11754 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
11756 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
11758 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
11760 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
11762 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
11764 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
11766 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
11768 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
11770 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
11772 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
11774 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
11776 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
11778 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
11780 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
11782 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
11784 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
11786 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
11788 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
11790 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
11792 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
11794 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
11796 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
11798 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
11800 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
11802 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
11804 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
11806 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
11808 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
11810 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
11812 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
11814 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
11816 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
11818 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
11820 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
11822 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
11824 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
11826 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
11828 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
11830 INSERT INTO "Vente" VALUES(0,10,1.000,0)
11832 INSERT INTO "Vente" VALUES(1,14,2.000,1)
11834 INSERT INTO "Vente" VALUES(2,11,3.000,0)
11836 INSERT INTO "Vente" VALUES(3,16,4.000,2)
11838 INSERT INTO "Vente" VALUES(4,10,1.000,3)
11840 INSERT INTO "Vente" VALUES(5,14,2.000,4)
11842 INSERT INTO "Vente" VALUES(6,11,1.000,3)
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)
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)
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)
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
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
11881 /*C535*/SET SCHEMA B
11882 DROP SCHEMA B CASCADE
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
11908 /*C537*/SET SCHEMA B
11910 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
11912 INSERT INTO "Lieu" VALUES(1,'Gentioux')
11914 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
11916 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
11918 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
11920 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
11922 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
11924 INSERT INTO "Lieu" VALUES(7,'Tarnac')
11926 INSERT INTO "Lieu" VALUES(8,'Felletin')
11928 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
11930 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
11932 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
11934 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
11936 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
11938 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
11940 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
11942 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
11944 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
11946 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
11948 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
11950 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
11952 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
11954 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
11956 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
11958 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
11960 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
11962 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
11964 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
11966 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
11968 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
11970 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
11972 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
11974 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
11976 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
11978 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
11980 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
11982 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
11984 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
11986 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
11988 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
11990 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
11992 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
11994 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
11996 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
11998 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
12000 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
12002 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
12004 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
12006 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
12008 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
12010 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
12012 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
12014 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
12016 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
12018 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
12020 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
12022 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
12024 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,NULL)
12026 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,NULL)
12028 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,NULL)
12030 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,NULL)
12032 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
12034 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
12036 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
12038 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
12040 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
12042 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
12044 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
12046 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
12048 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
12050 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
12052 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
12054 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
12056 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
12058 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
12060 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
12062 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
12064 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
12066 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
12068 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
12070 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
12072 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
12074 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
12076 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
12078 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
12080 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
12082 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
12084 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
12086 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
12088 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
12090 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
12092 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
12094 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
12096 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
12098 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
12100 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
12102 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
12104 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
12106 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
12108 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
12110 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
12112 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
12114 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
12116 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
12118 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
12120 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
12122 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
12124 INSERT INTO "Vente" VALUES(0,10,1.000,0)
12126 INSERT INTO "Vente" VALUES(1,14,2.000,1)
12128 INSERT INTO "Vente" VALUES(2,11,3.000,0)
12130 INSERT INTO "Vente" VALUES(3,16,4.000,2)
12132 INSERT INTO "Vente" VALUES(4,10,1.000,3)
12134 INSERT INTO "Vente" VALUES(5,14,2.000,4)
12136 INSERT INTO "Vente" VALUES(6,11,1.000,3)
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)
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)
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)
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
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
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
12185 /*C541*/SET SCHEMA B
12186 DROP SCHEMA B CASCADE
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
12212 /*C543*/SET SCHEMA B
12214 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
12216 INSERT INTO "Lieu" VALUES(1,'Gentioux')
12218 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
12220 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
12222 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
12224 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
12226 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
12228 INSERT INTO "Lieu" VALUES(7,'Tarnac')
12230 INSERT INTO "Lieu" VALUES(8,'Felletin')
12232 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
12234 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
12236 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
12238 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
12240 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
12242 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
12244 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
12246 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
12248 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
12250 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
12252 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
12254 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
12256 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
12258 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
12260 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
12262 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
12264 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
12266 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
12268 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
12270 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
12272 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
12274 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
12276 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
12278 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
12280 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
12282 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
12284 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
12286 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
12288 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
12290 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
12292 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
12294 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
12296 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
12298 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
12300 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
12302 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
12304 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
12306 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
12308 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
12310 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
12312 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
12314 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
12316 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
12318 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
12320 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
12322 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
12324 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
12326 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
12328 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,FALSE,NULL)
12330 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,FALSE,NULL)
12332 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,FALSE,NULL)
12334 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,FALSE,NULL)
12336 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,FALSE,NULL)
12338 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
12340 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
12342 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
12344 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
12346 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
12348 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
12350 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
12352 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
12354 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
12356 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
12358 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
12360 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
12362 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
12364 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
12366 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
12368 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
12370 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
12372 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
12374 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
12376 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
12378 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
12380 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
12382 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
12384 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
12386 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
12388 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
12390 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
12392 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
12394 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
12396 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
12398 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
12400 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
12402 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
12404 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
12406 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
12408 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
12410 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
12412 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
12414 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
12416 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
12418 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
12420 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
12422 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
12424 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
12426 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
12428 INSERT INTO "Vente" VALUES(0,10,1.000,0)
12430 INSERT INTO "Vente" VALUES(1,14,2.000,1)
12432 INSERT INTO "Vente" VALUES(2,11,3.000,0)
12434 INSERT INTO "Vente" VALUES(3,16,4.000,2)
12436 INSERT INTO "Vente" VALUES(4,10,1.000,3)
12438 INSERT INTO "Vente" VALUES(5,14,2.000,4)
12440 INSERT INTO "Vente" VALUES(6,11,1.000,3)
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
12453 /*C545*/SET SCHEMA B
12454 DROP SCHEMA B CASCADE
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
12480 /*C547*/SET SCHEMA B
12482 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
12484 INSERT INTO "Lieu" VALUES(1,'Gentioux')
12486 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
12488 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
12490 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
12492 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
12494 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
12496 INSERT INTO "Lieu" VALUES(7,'Tarnac')
12498 INSERT INTO "Lieu" VALUES(8,'Felletin')
12500 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
12502 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
12504 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
12506 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
12508 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
12510 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
12512 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
12514 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
12516 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
12518 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
12520 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
12522 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
12524 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
12526 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
12528 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
12530 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
12532 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
12534 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
12536 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
12538 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
12540 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
12542 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
12544 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
12546 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
12548 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
12550 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
12552 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
12554 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
12556 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
12558 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
12560 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
12562 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
12564 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
12566 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
12568 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
12570 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
12572 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
12574 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
12576 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
12578 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
12580 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
12582 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
12584 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
12586 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
12588 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
12590 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
12592 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
12594 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
12597 /*C548*/SET SCHEMA B
12598 DROP SCHEMA B CASCADE
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
12624 /*C550*/SET SCHEMA B
12626 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
12628 INSERT INTO "Lieu" VALUES(1,'Gentioux')
12630 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
12632 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
12634 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
12636 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
12638 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
12640 INSERT INTO "Lieu" VALUES(7,'Tarnac')
12642 INSERT INTO "Lieu" VALUES(8,'Felletin')
12644 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
12646 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
12648 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
12650 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
12652 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
12654 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
12656 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
12658 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
12660 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
12662 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
12664 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
12666 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
12668 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
12670 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
12672 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
12674 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
12676 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
12678 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
12680 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
12682 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
12684 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
12686 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
12688 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
12690 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
12692 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
12694 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
12696 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
12698 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
12700 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
12702 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
12704 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
12706 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
12708 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
12710 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
12712 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
12714 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
12716 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
12718 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
12720 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
12722 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
12724 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
12726 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
12728 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
12730 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
12732 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
12734 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
12736 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
12738 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
12740 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
12742 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
12744 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
12746 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
12748 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
12750 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
12752 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
12754 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
12756 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
12758 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
12760 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
12762 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
12764 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
12766 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
12768 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
12770 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
12772 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
12774 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
12776 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
12778 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
12780 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
12782 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
12784 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
12786 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
12788 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
12790 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
12792 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
12794 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
12796 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
12798 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
12800 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
12802 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
12804 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
12806 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
12808 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
12810 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
12812 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
12814 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
12816 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
12818 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
12820 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
12822 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
12824 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
12826 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
12828 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
12831 /*C551*/SET SCHEMA B
12832 DROP SCHEMA B CASCADE
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
12858 /*C553*/SET SCHEMA B
12860 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
12862 INSERT INTO "Lieu" VALUES(1,'Gentioux')
12864 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
12866 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
12868 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
12870 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
12872 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
12874 INSERT INTO "Lieu" VALUES(7,'Tarnac')
12876 INSERT INTO "Lieu" VALUES(8,'Felletin')
12878 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
12880 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
12882 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
12884 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
12886 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
12888 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
12890 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
12892 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
12894 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
12896 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
12898 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
12900 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
12902 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
12904 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
12906 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
12908 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
12910 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
12912 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
12914 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
12916 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
12918 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
12920 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
12922 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
12924 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
12926 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
12928 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
12930 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
12932 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
12934 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
12936 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
12938 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
12940 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
12942 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
12944 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
12946 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
12948 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
12950 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
12952 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
12954 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
12956 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
12958 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
12960 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
12962 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
12964 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
12966 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
12968 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
12970 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
12972 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
12974 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,FALSE,NULL)
12976 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,FALSE,NULL)
12978 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,FALSE,NULL)
12980 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,FALSE,NULL)
12982 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,FALSE,NULL)
12984 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
12986 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
12988 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
12990 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
12992 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
12994 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
12996 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
12998 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
13000 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
13002 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
13004 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
13006 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
13008 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
13010 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
13012 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
13014 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
13016 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
13018 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
13020 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
13022 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
13024 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
13026 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
13028 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
13030 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
13032 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
13034 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
13036 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
13038 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
13040 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
13042 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
13044 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
13046 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
13048 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
13050 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
13052 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
13054 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
13056 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
13058 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
13060 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
13062 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
13064 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
13066 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
13068 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
13070 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
13072 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
13074 INSERT INTO "Vente" VALUES(0,10,1.000,0)
13076 INSERT INTO "Vente" VALUES(1,14,2.000,1)
13078 INSERT INTO "Vente" VALUES(2,11,3.000,0)
13080 INSERT INTO "Vente" VALUES(3,16,4.000,2)
13082 INSERT INTO "Vente" VALUES(4,10,1.000,3)
13084 INSERT INTO "Vente" VALUES(5,14,2.000,4)
13086 INSERT INTO "Vente" VALUES(6,11,1.000,3)
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
13099 /*C555*/SET SCHEMA B
13100 DROP SCHEMA B CASCADE
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
13126 /*C557*/SET SCHEMA B
13128 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
13130 INSERT INTO "Lieu" VALUES(1,'Gentioux')
13132 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
13134 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
13136 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
13138 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
13140 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
13142 INSERT INTO "Lieu" VALUES(7,'Tarnac')
13144 INSERT INTO "Lieu" VALUES(8,'Felletin')
13146 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
13148 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
13150 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
13152 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
13154 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
13156 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
13158 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
13160 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
13162 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
13164 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
13166 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
13168 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
13170 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
13172 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
13174 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
13176 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
13178 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
13180 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
13182 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
13184 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
13186 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
13188 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
13190 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
13192 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
13194 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
13196 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
13198 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
13200 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
13202 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
13204 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
13206 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
13208 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
13210 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
13212 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
13214 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
13216 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
13218 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
13220 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
13222 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
13224 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
13226 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
13228 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
13230 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
13232 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
13234 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
13236 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
13238 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
13240 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
13242 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,FALSE,NULL)
13244 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,FALSE,NULL)
13246 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,FALSE,NULL)
13248 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,FALSE,NULL)
13250 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
13252 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
13254 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
13256 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
13258 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
13260 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
13262 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
13264 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
13266 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
13268 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
13270 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
13272 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
13274 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
13276 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
13278 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
13280 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
13282 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
13284 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
13286 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
13288 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
13290 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
13292 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
13294 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
13296 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
13298 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
13300 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
13302 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
13304 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
13306 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
13308 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
13310 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
13312 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
13314 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
13316 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
13318 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
13320 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
13322 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
13324 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
13326 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
13328 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
13330 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
13332 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
13334 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
13336 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
13338 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
13340 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
13342 INSERT INTO "Vente" VALUES(0,10,1.000,0)
13344 INSERT INTO "Vente" VALUES(1,14,2.000,1)
13346 INSERT INTO "Vente" VALUES(2,11,3.000,0)
13348 INSERT INTO "Vente" VALUES(3,16,4.000,2)
13350 INSERT INTO "Vente" VALUES(4,10,1.000,3)
13352 INSERT INTO "Vente" VALUES(5,14,2.000,4)
13354 INSERT INTO "Vente" VALUES(6,11,1.000,3)
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)
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
13373 /*C559*/SET SCHEMA B
13375 /*C560*/SET SCHEMA B
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
13387 /*C562*/SET SCHEMA B
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
13400 /*C564*/SET SCHEMA B
13401 DROP SCHEMA B CASCADE
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
13427 /*C566*/SET SCHEMA B
13429 INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
13431 INSERT INTO "Lieu" VALUES(1,'Gentioux')
13433 INSERT INTO "Lieu" VALUES(2,'Pigerolles')
13435 INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
13437 INSERT INTO "Lieu" VALUES(4,'LaNouaille')
13439 INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
13441 INSERT INTO "Lieu" VALUES(6,'St Yrieix')
13443 INSERT INTO "Lieu" VALUES(7,'Tarnac')
13445 INSERT INTO "Lieu" VALUES(8,'Felletin')
13447 INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
13449 INSERT INTO "Facture" VALUES(0,'2025-04-30')
13451 INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
13453 INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
13455 INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
13457 INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
13459 INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
13461 INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
13463 INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
13465 INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
13467 INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
13469 INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
13471 INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
13473 INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
13475 INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
13477 INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
13479 INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
13481 INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
13483 INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
13485 INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
13487 INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
13489 INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
13491 INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
13493 INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
13495 INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
13497 INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
13499 INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
13501 INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
13503 INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
13505 INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
13507 INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
13509 INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
13511 INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
13513 INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
13515 INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
13517 INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
13519 INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
13521 INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
13523 INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
13525 INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
13527 INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
13529 INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
13531 INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
13533 INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
13535 INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
13537 INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
13539 INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
13541 INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
13543 INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
13545 INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,NULL)
13547 INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,NULL)
13549 INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,NULL)
13551 INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,NULL)
13553 INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
13555 INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
13557 INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
13559 INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
13561 INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
13563 INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
13565 INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
13567 INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
13569 INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
13571 INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
13573 INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
13575 INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
13577 INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
13579 INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
13581 INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
13583 INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
13585 INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
13587 INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
13589 INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
13591 INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
13593 INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
13595 INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
13597 INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
13599 INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
13601 INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
13603 INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
13605 INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
13607 INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
13609 INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
13611 INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
13613 INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
13615 INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
13617 INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
13619 INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
13621 INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
13623 INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
13625 INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
13627 INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
13629 INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
13631 INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
13633 INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
13635 INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
13637 INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
13639 INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
13641 INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
13643 INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
13645 INSERT INTO "Vente" VALUES(0,10,1.000,0)
13647 INSERT INTO "Vente" VALUES(1,14,2.000,1)
13649 INSERT INTO "Vente" VALUES(2,11,3.000,0)
13651 INSERT INTO "Vente" VALUES(3,16,4.000,2)
13653 INSERT INTO "Vente" VALUES(4,10,1.000,3)
13655 INSERT INTO "Vente" VALUES(5,14,2.000,4)
13657 INSERT INTO "Vente" VALUES(6,11,1.000,3)
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)
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)
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)
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
13686 /*C568*/SET SCHEMA B
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
14759 /*C475*/SET SCHEMA B
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