/*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