+/*C4*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C5*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C6*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C7*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+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
+DISCONNECT
+/*C8*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C9*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION listeProduit IF EXISTS
+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
+DISCONNECT
+/*C10*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION listeDesProduits IF EXISTS
+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
+DISCONNECT
+/*C11*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION listeDesProduits IF EXISTS
+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
+DISCONNECT
+/*C12*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+DISCONNECT
+/*C3*/SET SCHEMA B
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+/*C13*/SET SCHEMA B
+SET SCHEMA B
+DISCONNECT
+/*C14*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C15*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+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 )
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+DISCONNECT
+/*C16*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(1,0,2,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+DISCONNECT
+/*C17*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C18*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+DISCONNECT
+/*C19*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(1,0,2,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+DISCONNECT
+/*C20*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C21*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C22*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C23*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+DISCONNECT
+/*C24*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(1,0,2,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+DISCONNECT
+/*C25*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C26*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C27*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C28*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C29*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+DISCONNECT
+/*C30*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C31*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+DISCONNECT
+/*C32*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C33*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+DISCONNECT
+/*C34*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(1,0,2,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+DISCONNECT
+/*C3*/DISCONNECT
+/*C35*/SET SCHEMA B
+DELETE FROM "Ingr\u00e9dient" WHERE ID=1
+COMMIT
+/*C36*/SET SCHEMA B
+SET SCHEMA B
+DISCONNECT
+/*C37*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C38*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C39*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C40*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C41*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C42*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+DISCONNECT
+/*C43*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+DISCONNECT
+/*C44*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C45*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C46*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C47*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C48*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C49*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C50*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C51*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C52*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C53*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C54*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C55*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C56*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C57*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C58*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C59*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C60*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C61*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C62*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C63*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+DISCONNECT
+/*C64*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C65*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C66*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C67*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C68*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C69*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C70*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C71*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C72*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C73*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C74*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C75*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C76*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C77*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C78*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C79*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+DISCONNECT
+/*C80*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+DISCONNECT
+/*C81*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C82*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C83*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C84*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C85*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C86*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C87*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C88*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C89*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C90*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit2MaxDate IF EXISTS
+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
+DISCONNECT
+/*C91*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit2MaxDate IF EXISTS
+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
+DISCONNECT
+/*C92*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit2MaxDate IF EXISTS
+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
+DISCONNECT
+/*C93*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit2MaxDate IF EXISTS
+DROP FUNCTION produitToMaxDate IF EXISTS
+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
+DISCONNECT
+/*C94*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produitToMaxDate IF EXISTS
+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
+DISCONNECT
+/*C95*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produitToMaxDate IF EXISTS
+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
+DISCONNECT
+/*C96*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produitToMaxDate IF EXISTS
+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
+DISCONNECT
+/*C97*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produitToMaxDate IF EXISTS
+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
+DISCONNECT
+/*C98*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produitToMaxDate IF EXISTS
+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
+DISCONNECT
+/*C99*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produitToMaxDate IF EXISTS
+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
+DISCONNECT
+/*C100*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produitToMaxDate IF EXISTS
+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
+DISCONNECT
+/*C101*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produitToMaxDate IF EXISTS
+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
+DISCONNECT
+/*C102*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produitToMaxDate IF EXISTS
+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
+DISCONNECT
+/*C103*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produitToMaxDate IF EXISTS
+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
+DISCONNECT
+/*C104*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C105*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Prix"\u000a ADD CONSTRAINT "FK_Prix_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C106*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+DISCONNECT
+/*C107*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C108*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+DISCONNECT
+/*C109*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C110*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_facture" FOREIGN KEY(facture) REFERENCES "Facture"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Panier"\u000a ADD CONSTRAINT "FK_Panier_client" FOREIGN KEY(client) REFERENCES "Client"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+DISCONNECT
+/*C111*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+DISCONNECT
+/*C112*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C113*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+ALTER TABLE "Ingr\u00e9dient"\u000a ADD CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation"\u000a CHECK (produit != conso)\u000a
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Ingr\u00e9dient" ADD CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(conso) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+DISCONNECT
+/*C114*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+DISCONNECT
+/*C115*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C116*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(p\u00e9riode) REFERENCES "P\u00e9riode"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Abonnement"\u000a ADD CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+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 )
+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 )
+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 )
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Vente"\u000a ADD CONSTRAINT "FK_Vente_panier" FOREIGN KEY(panier) REFERENCES "Panier"(ID)\u000a ON UPDATE CASCADE
+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 )
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+ALTER TABLE "Stock"\u000a ADD CONSTRAINT "FK_Stock_produit" FOREIGN KEY(produit) REFERENCES "Produit"(ID)\u000a ON UPDATE CASCADE
+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 )
+DISCONNECT
+/*C117*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+DISCONNECT
+/*C118*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DROP FUNCTION produitToMaxDate IF EXISTS
+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
+DISCONNECT
+/*C119*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C120*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DISCONNECT
+/*C121*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+DISCONNECT
+/*C122*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DROP FUNCTION produitToMaxDate IF EXISTS
+DROP FUNCTION produit_MaxDate IF EXISTS
+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
+DISCONNECT
+/*C123*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_MaxDate IF EXISTS
+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
+DISCONNECT
+/*C124*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C125*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+DISCONNECT
+/*C126*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+DISCONNECT
+/*C127*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+DISCONNECT
+/*C128*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+DISCONNECT
+/*C129*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+DISCONNECT
+/*C130*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+DISCONNECT
+/*C131*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+DISCONNECT
+/*C132*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C133*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C134*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C135*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DROP FUNCTION prix IF EXISTS
+DISCONNECT
+/*C136*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C137*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C138*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C139*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C140*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C141*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C142*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C143*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C144*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C145*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C35*/INSERT INTO "Prix" VALUES(9,'2025-04-29',0,23.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
+COMMIT
+/*C146*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C147*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C148*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C149*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C150*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C151*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C152*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C153*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C154*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C155*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C156*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C157*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C158*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C159*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C160*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C161*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C162*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C163*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C164*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C165*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C166*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C167*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C168*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C169*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C170*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C171*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C172*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C173*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C174*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C175*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C176*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C177*/SET SCHEMA B
+SET SCHEMA B
+DISCONNECT
+/*C178*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C179*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DISCONNECT
+/*C180*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-29',0,23.00)
+COMMIT
+DISCONNECT
+/*C181*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C182*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DISCONNECT
+/*C183*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
+COMMIT
+DISCONNECT
+/*C184*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DISCONNECT
+/*C185*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS
+DISCONNECT
+/*C186*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS
+DISCONNECT
+/*C187*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS
+DISCONNECT
+/*C188*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS
+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
+DISCONNECT
+/*C189*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C190*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C191*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C192*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C193*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C35*/DISCONNECT
+/*C194*/SET SCHEMA B
+DISCONNECT
+/*C195*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prixadate IF EXISTS CASCADE
+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
+DISCONNECT
+/*C197*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C198*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C199*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C200*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
+COMMIT
+DISCONNECT
+/*C201*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C196*/SET SCHEMA B
+DISCONNECT
+/*C203*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C204*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C205*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C206*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C207*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C208*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C209*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C210*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C211*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C202*/SET SCHEMA B
+DISCONNECT
+/*C212*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C213*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C214*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+DISCONNECT
+/*C215*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C216*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C217*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+DISCONNECT
+/*C218*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C219*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C220*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+DISCONNECT
+/*C221*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C222*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C223*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+DISCONNECT
+/*C224*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C225*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C226*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+DISCONNECT
+/*C227*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C228*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C229*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
+COMMIT
+DISCONNECT
+/*C230*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C231*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C232*/SET SCHEMA B
+DELETE FROM "Vente" WHERE ID=6
+INSERT INTO "Vente" VALUES(6,15,1.000,3)
+COMMIT
+/*C233*/SET SCHEMA B
+SET SCHEMA B
+DISCONNECT
+/*C234*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Vente" VALUES(7,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C235*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+DISCONNECT
+/*C236*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+DISCONNECT
+/*C237*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+DISCONNECT
+/*C238*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+DISCONNECT
+/*C239*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE insertFactureClient(IN client INTEGER)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a INSERT INTO "Facture"(date)\u000a VALUES (CURRENT_DATE);\u000a END
+DISCONNECT
+/*C240*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C241*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C242*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C243*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C244*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C245*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C246*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C247*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C248*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DISCONNECT
+/*C249*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+DISCONNECT
+/*C250*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+DISCONNECT
+/*C251*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+DISCONNECT
+/*C252*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+DISCONNECT
+/*C253*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C254*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C255*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C256*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
+COMMIT
+DISCONNECT
+/*C257*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C258*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
+COMMIT
+DISCONNECT
+/*C259*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C260*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
+COMMIT
+DISCONNECT
+/*C261*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C262*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C263*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C264*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C265*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C266*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C267*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C268*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C269*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C270*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C271*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C272*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C273*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C274*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C275*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C276*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C277*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C278*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C279*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C280*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C281*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C282*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C283*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C284*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C285*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C286*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C287*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C288*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C289*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C290*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C291*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C292*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C293*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C294*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C295*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C296*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C297*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C298*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C299*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C300*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C301*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C302*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C303*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C304*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C305*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C306*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C307*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C308*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C309*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C310*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C311*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C312*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C313*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C314*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C315*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C316*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C317*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C318*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C319*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C320*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C321*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C322*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C323*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C324*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C325*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C326*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C327*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C328*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C329*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C330*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C331*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C332*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C333*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C334*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C335*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C336*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C337*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+ALTER TABLE "Client"\u000a ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID)\u000a ON UPDATE CASCADE
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C338*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','')
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
+COMMIT
+DISCONNECT
+/*C339*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
+COMMIT
+DISCONNECT
+/*C340*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+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
+DISCONNECT
+/*C341*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C342*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DISCONNECT
+/*C343*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C344*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C345*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C346*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C347*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C348*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+DISCONNECT
+/*C349*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C350*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+DISCONNECT
+/*C351*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C352*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+DISCONNECT
+/*C353*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C354*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C355*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+DISCONNECT
+/*C356*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C357*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C358*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-29',0,23.00)
+COMMIT
+DISCONNECT
+/*C359*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
+COMMIT
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C360*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C232*/DISCONNECT
+/*C362*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C363*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C364*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C365*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C366*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+DISCONNECT
+/*C367*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C368*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C369*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+DISCONNECT
+/*C370*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
+COMMIT
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C371*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C372*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C373*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C374*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C375*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C376*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C377*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C378*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C379*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+DISCONNECT
+/*C380*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
+COMMIT
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C381*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C382*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C383*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+DISCONNECT
+/*C384*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
+COMMIT
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C385*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C386*/SET SCHEMA B
+SET SCHEMA B
+DISCONNECT
+/*C387*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C388*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C389*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+DISCONNECT
+/*C390*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(3,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,3)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,3)
+COMMIT
+INSERT INTO "Facture" VALUES(4,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,4)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,4)
+COMMIT
+INSERT INTO "Facture" VALUES(5,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,5)
+COMMIT
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C391*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C392*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C393*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+DISCONNECT
+/*C394*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+INSERT INTO "Vente" VALUES(2,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(3,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,3)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,3)
+COMMIT
+INSERT INTO "Facture" VALUES(4,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,4)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,4)
+COMMIT
+INSERT INTO "Facture" VALUES(5,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,5)
+COMMIT
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C395*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C396*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C397*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+DISCONNECT
+/*C398*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+INSERT INTO "Vente" VALUES(1,10,1.000,0)
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+INSERT INTO "Vente" VALUES(2,14,2.000,1)
+INSERT INTO "Vente" VALUES(3,11,1.000,0)
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+INSERT INTO "Vente" VALUES(4,16,4.000,2)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+INSERT INTO "Vente" VALUES(5,10,1.000,3)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+INSERT INTO "Vente" VALUES(6,14,2.000,4)
+INSERT INTO "Vente" VALUES(7,11,1.000,3)
+COMMIT
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(3,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,3)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,3)
+COMMIT
+INSERT INTO "Facture" VALUES(4,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,4)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,4)
+COMMIT
+INSERT INTO "Facture" VALUES(5,'2025-04-29')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,5)
+COMMIT
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C399*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C400*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C401*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+COMMIT
+DISCONNECT
+/*C402*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C403*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C404*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C405*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C406*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C407*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C408*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C409*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C410*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C411*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C412*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C413*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C414*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C415*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C416*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C417*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C418*/SET SCHEMA B
+DISCONNECT
+/*C419*/SET SCHEMA B
+DISCONNECT
+/*C420*/SET SCHEMA B
+DISCONNECT
+/*C421*/SET SCHEMA B
+DISCONNECT
+/*C422*/SET SCHEMA B
+DECLARE x DECIMAL ARRAY DEFAULT NULL;
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C423*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DECLARE x DECIMAL ARRAY DEFAULT NULL;
+DISCONNECT
+/*C424*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C425*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C426*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C427*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DECLARE x DECIMAL ARRAY DEFAULT NULL;
+DISCONNECT
+/*C428*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C429*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C430*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C431*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DROP TYPE DECIMAL_ARRAY IF EXISTS CASCADE
+CREATE TYPE DECIMAL_ARRAY AS DECIMAL ARRAY
+DISCONNECT
+/*C432*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DROP TYPE DECIMAL_ARRAY IF EXISTS CASCADE
+CREATE TYPE DECIMAL_ARRAY AS DECIMAL ARRAY
+DECLARE x DECIMAL_ARRAY DEFAULT NULL;
+DISCONNECT
+/*C433*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C434*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C435*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C436*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C437*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C438*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C439*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C440*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C441*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C442*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C443*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C444*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C445*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C446*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C447*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C448*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C449*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C450*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C451*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C452*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C453*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C454*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C455*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C456*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C457*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+DISCONNECT
+/*C458*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C459*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C460*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C461*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C462*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C463*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW Factures IF EXISTS
+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
+DISCONNECT
+/*C464*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+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
+DISCONNECT
+/*C465*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+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
+DISCONNECT
+/*C466*/SET SCHEMA B
+SET SCHEMA B
+DISCONNECT
+/*C467*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C468*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C469*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C361*/SET SCHEMA B
+DISCONNECT
+/*C471*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+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
+DISCONNECT
+/*C472*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\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
+DISCONNECT
+/*C470*/SET SCHEMA B
+DISCONNECT
+/*C474*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C473*/SET SCHEMA B
+DISCONNECT
+/*C476*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+DISCONNECT
+/*C477*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+DISCONNECT
+/*C478*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C479*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C480*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C481*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C482*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C483*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C484*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C485*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C486*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C487*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C488*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Facture" VALUES(0,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-29')
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-29')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C489*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C490*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C491*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C492*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+DISCONNECT
+/*C493*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C494*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C495*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C496*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C497*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C498*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C499*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C500*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C501*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(0,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
+COMMIT
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C502*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C503*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C504*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C505*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C506*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C507*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(0,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,0)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,0)
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,1)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,1)
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,2)
+COMMIT
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C508*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C509*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C510*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C511*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C512*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , IN venteProduit INTEGER\u000a , IN venteQuantit\u00e9 DECIMAL\u000a )\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a DECLARE panierID INTEGER DEFAULT NULL;\u000a DECLARE venteID INTEGER DEFAULT NULL;\u000a\u000a -- CorrectnessNote: seule la date et le client\u000a -- font partie des crit\u00e8res pour d\u00e9cider\u000a -- si le panier existe d\u00e9j\u00e0 o\u00f9 non.\u000a SET panierID = SELECT ID FROM "Panier"\u000a WHERE "Panier".date = venteDate\u000a AND "Panier".client = venteClient;\u000a IF panierID IS NULL\u000a THEN\u000a INSERT INTO "Panier"(date, client)\u000a VALUES (venteDate, venteClient);\u000a SET panierID = IDENTITY();\u000a END IF;\u000a\u000a -- CorrectnessNote: la quantit\u00e9 ne fait pas partie des crit\u00e8res\u000a -- pour d\u00e9cider si la vente existe d\u00e9j\u00e0 ou non.\u000a SET venteID = SELECT ID FROM "Vente"\u000a WHERE "Vente".panier = panierID\u000a AND "Vente".produit = venteProduit;\u000a IF venteID IS NULL\u000a THEN\u000a INSERT INTO "Vente"(panier, produit, quantit\u00e9)\u000a VALUES (panierID, venteProduit, venteQuantit\u00e9);\u000a END IF;\u000a END
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C513*/SET SCHEMA B
+DISCONNECT
+/*C514*/SET SCHEMA B
+DISCONNECT
+/*C515*/SET SCHEMA B
+DISCONNECT
+/*C516*/SET SCHEMA B
+DISCONNECT
+/*C517*/SET SCHEMA B
+DISCONNECT
+/*C518*/SET SCHEMA B
+DISCONNECT
+/*C519*/SET SCHEMA B
+DISCONNECT
+/*C520*/SET SCHEMA B
+DISCONNECT
+/*C521*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C522*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C523*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C524*/SET SCHEMA B
+DISCONNECT
+/*C525*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C526*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C527*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C528*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(0,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,0)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,0)
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,1)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,1)
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,2)
+COMMIT
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C529*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C530*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C531*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C532*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C533*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(0,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,0)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,0)
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,1)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,1)
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,2)
+COMMIT
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C534*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C535*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C536*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C537*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C538*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(0,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,0)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,0)
+COMMIT
+INSERT INTO "Facture" VALUES(1,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,1)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,1)
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,2)
+COMMIT
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C539*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C540*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C541*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C542*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C543*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,FALSE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,FALSE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,FALSE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,FALSE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,FALSE,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C544*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C545*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C546*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C547*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+DISCONNECT
+/*C548*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C549*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C550*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+DISCONNECT
+/*C551*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C552*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C553*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,FALSE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,FALSE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,FALSE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,FALSE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,FALSE,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C554*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C555*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C556*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C557*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,FALSE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,FALSE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,FALSE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,FALSE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C558*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(0,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,FALSE,0)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,0)
+COMMIT
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C559*/SET SCHEMA B
+DISCONNECT
+/*C560*/SET SCHEMA B
+DISCONNECT
+/*C561*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C562*/SET SCHEMA B
+SET SCHEMA B
+DISCONNECT
+/*C563*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C564*/SET SCHEMA B
+DROP SCHEMA B CASCADE
+DISCONNECT
+/*C565*/SET SCHEMA B
+SET DATABASE COLLATION "French"
+SET DATABASE DEFAULT TABLE TYPE CACHED
+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 )
+DROP FUNCTION choisirUnProduit IF EXISTS CASCADE
+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
+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 )
+CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso"\u000a ON "Ingr\u00e9dient"(produit,conso)
+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 )
+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 )
+DROP FUNCTION choisirUnClient IF EXISTS CASCADE
+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
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+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 )
+DROP FUNCTION produit_maxdate IF EXISTS CASCADE
+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
+DROP FUNCTION prix_\u00e0_date IF EXISTS CASCADE
+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
+DISCONNECT
+/*C566*/SET SCHEMA B
+SET SCHEMA B
+INSERT INTO "Lieu" VALUES(0,'LaL\u00e9zioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(1,'Gentioux')
+COMMIT
+INSERT INTO "Lieu" VALUES(2,'Pigerolles')
+COMMIT
+INSERT INTO "Lieu" VALUES(3,'F\u00e9nier')
+COMMIT
+INSERT INTO "Lieu" VALUES(4,'LaNouaille')
+COMMIT
+INSERT INTO "Lieu" VALUES(5,'Valli\u00e8re')
+COMMIT
+INSERT INTO "Lieu" VALUES(6,'St Yrieix')
+COMMIT
+INSERT INTO "Lieu" VALUES(7,'Tarnac')
+COMMIT
+INSERT INTO "Lieu" VALUES(8,'Felletin')
+COMMIT
+INSERT INTO "Lieu" VALUES(9,'Roy\u00e8res')
+COMMIT
+INSERT INTO "Facture" VALUES(0,'2025-04-30')
+COMMIT
+INSERT INTO "Produit" VALUES(0,'Farine de bl\u00e9 nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(1,'Farine de bl\u00e9 s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(2,'Farine de bl\u00e9 lin tournesol','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(3,'Farine de bl\u00e9 lin tournesol s\u00e9same','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(4,'Farine de m\u00e9teil nature','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(5,'Farine de m\u00e9teil noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(6,'Farine de m\u00e9teil NFR','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(7,'Engrain','g',1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(8,'Farine de sarasin','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(9,'Pain rouquine',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(10,'Pain de mie',NULL,1.000,NULL)
+COMMIT
+INSERT INTO "Produit" VALUES(11,'Lait','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(12,'Eau','L',1.000,'robinet')
+COMMIT
+INSERT INTO "Produit" VALUES(13,'Levain de bl\u00e9','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(14,'Levain de m\u00e9teil','g',1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(15,'Noix','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(16,'Sel','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(17,'Sucre','g',1.000,'sacs')
+COMMIT
+INSERT INTO "Produit" VALUES(18,'\u0152uf',NULL,1.000,'bo\u00eete')
+COMMIT
+INSERT INTO "Produit" VALUES(19,'Huile','L',1.000,'bouteille')
+COMMIT
+INSERT INTO "Produit" VALUES(20,'Pain burger','g',100.000,'burger')
+COMMIT
+INSERT INTO "Produit" VALUES(21,'Pain panini','g',100.000,'panini')
+COMMIT
+INSERT INTO "Produit" VALUES(22,'Beurre','g',1.000,'sac')
+COMMIT
+INSERT INTO "Produit" VALUES(23,'Pain de bl\u00e9','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(24,'Pain de bl\u00e9','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(25,'Pain de bl\u00e9','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(26,'Pain de bl\u00e9','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(27,'Pain de s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(28,'Pain de s\u00e9same','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(29,'Pain de bl\u00e9, lin et tournesol','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(30,'Pain de bl\u00e9, lin et tournesol','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(31,'Pain de bl\u00e9, lin, tournesol et s\u00e9same','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(32,'Pain de m\u00e9teil','g',500.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(33,'Pain de m\u00e9teil','g',1000.000,'boule')
+COMMIT
+INSERT INTO "Produit" VALUES(34,'Pain de m\u00e9teil','g',500.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(35,'Pain de m\u00e9teil','g',1000.000,'moul\u00e9')
+COMMIT
+INSERT INTO "Produit" VALUES(36,'Pain de m\u00e9teil avec noix','g',500.000,'boule')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(1,'Sunday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(2,'Monday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(3,'Tuesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(4,'Wednesday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(5,'Thursday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(6,'Friday')
+COMMIT
+INSERT INTO "P\u00e9riode" VALUES(7,'Saturday')
+COMMIT
+INSERT INTO "Client" VALUES(0,'S\u00e9verine',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(1,'Julien',0,'','',TRUE)
+COMMIT
+INSERT INTO "Client" VALUES(2,'Paul',2,NULL,NULL,TRUE)
+COMMIT
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,NULL)
+COMMIT
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,NULL)
+COMMIT
+INSERT INTO "Abonnement" VALUES(0,0,0,2,10,1.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(1,1,1,2,14,2.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(2,2,3,5,16,4.000)
+COMMIT
+INSERT INTO "Abonnement" VALUES(3,0,2,2,11,1.000)
+COMMIT
+INSERT INTO "Ingr\u00e9dient" VALUES(2,31,3,23.000)
+COMMIT
+INSERT INTO "Prix" VALUES(0,'2025-04-01',0,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(1,'2025-04-01',1,2.00)
+COMMIT
+INSERT INTO "Prix" VALUES(2,'2025-04-01',2,4.00)
+COMMIT
+INSERT INTO "Prix" VALUES(3,'2025-04-01',3,89.00)
+COMMIT
+INSERT INTO "Prix" VALUES(4,'2025-04-01',4,8.00)
+COMMIT
+INSERT INTO "Prix" VALUES(5,'2025-04-01',5,7.00)
+COMMIT
+INSERT INTO "Prix" VALUES(6,'2025-04-01',6,39.00)
+COMMIT
+INSERT INTO "Prix" VALUES(7,'2025-04-01',7,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(8,'2025-04-01',8,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(9,'2025-04-01',9,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(10,'2025-04-01',10,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(11,'2025-04-01',11,110.00)
+COMMIT
+INSERT INTO "Prix" VALUES(12,'2025-04-01',12,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(13,'2025-04-01',13,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(14,'2025-04-01',14,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(15,'2025-04-01',15,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(16,'2025-04-01',16,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(17,'2025-04-01',17,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(18,'2025-04-01',18,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(19,'2025-04-01',19,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(20,'2025-04-01',20,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(21,'2025-04-01',21,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(22,'2025-04-01',22,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(23,'2025-04-01',23,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(24,'2025-04-01',24,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(25,'2025-04-01',25,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(26,'2025-04-01',26,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(27,'2025-04-01',27,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(28,'2025-04-01',28,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(29,'2025-04-01',29,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(30,'2025-04-01',30,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(31,'2025-04-01',31,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(32,'2025-04-01',32,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(33,'2025-04-01',33,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(34,'2025-04-01',34,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(35,'2025-04-01',35,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(36,'2025-04-01',36,42.00)
+COMMIT
+INSERT INTO "Prix" VALUES(37,'2025-04-17',0,32.00)
+COMMIT
+INSERT INTO "Prix" VALUES(38,'2025-04-26',2,84.00)
+COMMIT
+INSERT INTO "Prix" VALUES(39,'2025-04-28',0,23.00)
+COMMIT
+INSERT INTO "Vente" VALUES(0,10,1.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(1,14,2.000,1)
+COMMIT
+INSERT INTO "Vente" VALUES(2,11,3.000,0)
+COMMIT
+INSERT INTO "Vente" VALUES(3,16,4.000,2)
+COMMIT
+INSERT INTO "Vente" VALUES(4,10,1.000,3)
+COMMIT
+INSERT INTO "Vente" VALUES(5,14,2.000,4)
+COMMIT
+INSERT INTO "Vente" VALUES(6,11,1.000,3)
+COMMIT
+DISCONNECT
+/*C567*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+INSERT INTO "Facture" VALUES(1,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=0
+DELETE FROM "Panier" WHERE ID=3
+INSERT INTO "Panier" VALUES(0,'2025-04-07',0,TRUE,1)
+INSERT INTO "Panier" VALUES(3,'2025-04-14',0,TRUE,1)
+COMMIT
+INSERT INTO "Facture" VALUES(2,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=1
+DELETE FROM "Panier" WHERE ID=4
+INSERT INTO "Panier" VALUES(1,'2025-04-07',1,TRUE,2)
+INSERT INTO "Panier" VALUES(4,'2025-04-14',1,TRUE,2)
+COMMIT
+INSERT INTO "Facture" VALUES(3,'2025-04-30')
+DELETE FROM "Panier" WHERE ID=2
+INSERT INTO "Panier" VALUES(2,'2025-04-10',2,TRUE,3)
+COMMIT
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C568*/SET SCHEMA B
+SET SCHEMA B
+DISCONNECT
+/*C569*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C570*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C571*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C572*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C573*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C574*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C575*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C576*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C577*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C578*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C579*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C580*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C581*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C582*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C583*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C584*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C585*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C586*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C587*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C588*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C589*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C590*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C591*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C592*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C593*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C594*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C595*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C596*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C597*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C598*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C599*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C600*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C601*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C602*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C603*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C604*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C605*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C606*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C607*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C608*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C609*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C610*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C611*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C612*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C613*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C614*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C615*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C616*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C617*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C618*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C619*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C620*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C621*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C622*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C623*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C624*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C625*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C626*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C627*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C628*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C629*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C630*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C631*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C632*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C633*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C634*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C635*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C636*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C637*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C638*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C639*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C640*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C641*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C642*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C643*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C644*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C645*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C646*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C647*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C648*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C649*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C650*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C651*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C652*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C653*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C654*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C655*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C656*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C657*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C658*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C659*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C660*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C661*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C662*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C663*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C664*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C665*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C666*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C667*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C668*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C669*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C670*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C671*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C672*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C673*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C674*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C675*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT
+/*C475*/SET SCHEMA B
+DISCONNECT
+/*C676*/SET SCHEMA B
+--TRUNCATE TABLE "Vente";\u000a--TRUNCATE TABLE "Panier";\u000aDROP PROCEDURE insertVente IF EXISTS CASCADE
+CREATE PROCEDURE insertVente\u000a ( IN venteDate DATE\u000a , IN venteClient INTEGER\u000a , 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
+DROP PROCEDURE insertVentesParAbonnement IF EXISTS
+CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)\u000a MODIFIES SQL DATA\u000a BEGIN ATOMIC\u000a -- ExplanationNote: g\u00e8re chaque jour l'un apr\u00e8s l'autre.\u000a for_days:\u000a FOR SELECT day\u000a FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))\u000a WITH ORDINALITY as T(day, I)\u000a DO\u000a -- ExplanationNote: pour un jour donn\u00e9,\u000a -- g\u00e8re chaque abonnement l'un apr\u00e8s l'autre.\u000a for_abos:\u000a FOR SELECT ID as aboID\u000a , client as aboClient\u000a , produit as aboProduit\u000a , quantit\u00e9 as aboQuantit\u00e9\u000a , p\u00e9riode as aboP\u000a FROM "Abonnement"\u000a JOIN "P\u00e9riode" ON "P\u00e9riode".ID = "Abonnement".p\u00e9riode\u000a AND "P\u00e9riode".nom = DAYNAME(day)\u000a DO\u000a CALL insertVente(day, aboClient, aboProduit, aboQuantit\u00e9);\u000a END FOR for_abos;\u000a END FOR for_days;\u000a END
+DROP PROCEDURE insertFactureClient IF EXISTS
+CREATE PROCEDURE 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
+DROP VIEW "Factures" IF EXISTS
+CREATE VIEW "Factures" AS\u000a SELECT\u000a "Facture".ID,\u000a --ANY_VALUE\u000a ("Facture".date) as facture_date,\u000a --ANY_VALUE\u000a ("Client".ID) as client,\u000a --ANY_VALUE\u000a ("Panier".ID) as panier,\u000a --ANY_VALUE\u000a ("Panier".date) as panier_date,\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
+DISCONNECT