From: Julien Moutinho Date: Wed, 30 Apr 2025 11:38:11 +0000 (+0200) Subject: dev sql and ott X-Git-Url: https://git.sourcephile.fr/tmp/julm/LesQuatreRoux.git/commitdiff_plain dev sql and ott --- diff --git a/.gitignore b/.gitignore index a2d48ed..beb5fd0 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ hsqldb +*.~lock.* diff --git a/LesQuatreRoux.data b/LesQuatreRoux.data new file mode 100644 index 0000000..1891ec8 Binary files /dev/null and b/LesQuatreRoux.data differ diff --git a/LesQuatreRoux.log b/LesQuatreRoux.log new file mode 100644 index 0000000..cd8e27f --- /dev/null +++ b/LesQuatreRoux.log @@ -0,0 +1,14770 @@ +/*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 diff --git a/LesQuatreRoux.odb b/LesQuatreRoux.odb new file mode 100644 index 0000000..3e81f11 Binary files /dev/null and b/LesQuatreRoux.odb differ diff --git a/LesQuatreRoux.properties b/LesQuatreRoux.properties new file mode 100644 index 0000000..34a8826 --- /dev/null +++ b/LesQuatreRoux.properties @@ -0,0 +1,5 @@ +#HSQL Database Engine 2.7.3 +#Tue Apr 29 00:26:24 CEST 2025 +modified=yes +tx_timestamp=11676 +version=2.7.3 diff --git a/LesQuatreRoux.script b/LesQuatreRoux.script new file mode 100644 index 0000000..1b0b4d1 --- /dev/null +++ b/LesQuatreRoux.script @@ -0,0 +1,81 @@ +SET DATABASE UNIQUE NAME HSQLDB9665464260 +SET DATABASE DEFAULT RESULT MEMORY ROWS 0 +SET DATABASE EVENT LOG LEVEL 0 +SET DATABASE TRANSACTION CONTROL LOCKS +SET DATABASE DEFAULT ISOLATION LEVEL READ COMMITTED +SET DATABASE TRANSACTION ROLLBACK ON CONFLICT TRUE +SET DATABASE TEXT TABLE DEFAULTS '' +SET DATABASE SQL NAMES FALSE +SET DATABASE SQL RESTRICT EXEC FALSE +SET DATABASE SQL REFERENCES FALSE +SET DATABASE SQL SIZE TRUE +SET DATABASE SQL TYPES FALSE +SET DATABASE SQL TDC DELETE TRUE +SET DATABASE SQL TDC UPDATE TRUE +SET DATABASE SQL SYS INDEX NAMES TRUE +SET DATABASE SQL CONCAT NULLS TRUE +SET DATABASE SQL UNIQUE NULLS TRUE +SET DATABASE SQL CONVERT TRUNCATE TRUE +SET DATABASE SQL AVG SCALE 0 +SET DATABASE SQL DOUBLE NAN TRUE +SET FILES WRITE DELAY 500 MILLIS +SET FILES BACKUP INCREMENT TRUE +SET FILES CACHE SIZE 10000 +SET FILES CACHE ROWS 50000 +SET FILES SCALE 32 +SET FILES LOB SCALE 32 +SET FILES DEFRAG 0 +SET FILES NIO TRUE +SET FILES NIO SIZE 256 +SET FILES LOG TRUE +SET FILES LOG SIZE 50 +SET FILES CHECK 11676 +ALTER CATALOG PUBLIC RENAME TO D +SET DATABASE COLLATION "French" PAD SPACE +CREATE USER SA PASSWORD DIGEST 'd41d8cd98f00b204e9800998ecf8427e' +ALTER USER SA SET LOCAL TRUE +CREATE SCHEMA B AUTHORIZATION DBA +CREATE CACHED TABLE B."Produit"(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,NOM VARCHAR(100) NOT NULL,UNIT\u00c9 VARCHAR(100),QUANTIT\u00c9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL,CONDITIONNEMENT VARCHAR(100),CONSTRAINT "PK_Produit" PRIMARY KEY(ID)) +ALTER TABLE B."Produit" ALTER COLUMN ID RESTART WITH 37 +CREATE CACHED TABLE B."Ingr\u00e9dient"(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,PRODUIT INTEGER NOT NULL,CONSO INTEGER NOT NULL,QUANTIT\u00c9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL,CONSTRAINT "PK_Ingr\u00e9dient" PRIMARY KEY(ID),CONSTRAINT "Un produit ne se liste pas lui-m\u00eame comme consommation" CHECK(B."Ingr\u00e9dient".PRODUIT!=B."Ingr\u00e9dient".CONSO),CONSTRAINT "FK_Ingr\u00e9dient_produit" FOREIGN KEY(PRODUIT) REFERENCES B."Produit"(ID) ON UPDATE CASCADE,CONSTRAINT "FK_Ingr\u00e9dient_conso" FOREIGN KEY(CONSO) REFERENCES B."Produit"(ID) ON UPDATE CASCADE) +ALTER TABLE B."Ingr\u00e9dient" ALTER COLUMN ID RESTART WITH 2 +CREATE UNIQUE INDEX "Ingr\u00e9dient_index_produit_et_conso" ON B."Ingr\u00e9dient"(PRODUIT,CONSO) +CREATE CACHED TABLE B."Lieu"(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,NOM VARCHAR(100) NOT NULL,CONSTRAINT "PK_Lieu" PRIMARY KEY(ID)) +ALTER TABLE B."Lieu" ALTER COLUMN ID RESTART WITH 10 +CREATE CACHED TABLE B."Client"(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,NOM VARCHAR(100) NOT NULL,LIEU INTEGER NOT NULL,T\u00c9L VARCHAR(100),M\u00c9L VARCHAR(100),CONSTRAINT "PK_Client" PRIMARY KEY(ID),CONSTRAINT "FK_Client_lieu" FOREIGN KEY(LIEU) REFERENCES B."Lieu"(ID) ON UPDATE CASCADE) +ALTER TABLE B."Client" ALTER COLUMN ID RESTART WITH 3 +CREATE CACHED TABLE B."P\u00e9riode"(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,NOM VARCHAR(100) NOT NULL,CONSTRAINT "PK_P\u00e9riode" PRIMARY KEY(ID)) +ALTER TABLE B."P\u00e9riode" ALTER COLUMN ID RESTART WITH 8 +CREATE CACHED TABLE B."Abonnement"(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,CLIENT INTEGER NOT NULL,LIEU INTEGER,P\u00c9RIODE INTEGER NOT NULL,PRODUIT INTEGER NOT NULL,QUANTIT\u00c9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL,CONSTRAINT "PK_Abonnement" PRIMARY KEY(ID),CONSTRAINT "FK_Abonnement_client" FOREIGN KEY(CLIENT) REFERENCES B."Client"(ID) ON DELETE CASCADE,CONSTRAINT "FK_Abonnement_produit" FOREIGN KEY(PRODUIT) REFERENCES B."Produit"(ID) ON UPDATE CASCADE,CONSTRAINT "FK_Abonnement_p\u00e9riode" FOREIGN KEY(P\u00c9RIODE) REFERENCES B."P\u00e9riode"(ID) ON UPDATE CASCADE,CONSTRAINT "FK_Abonnement_lieu" FOREIGN KEY(LIEU) REFERENCES B."Lieu"(ID) ON UPDATE CASCADE) +ALTER TABLE B."Abonnement" ALTER COLUMN ID RESTART WITH 4 +CREATE CACHED TABLE B."Facture"(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,DATE INTEGER NOT NULL,CONSTRAINT "PK_Facture" PRIMARY KEY(ID)) +ALTER TABLE B."Facture" ALTER COLUMN ID RESTART WITH 0 +CREATE CACHED TABLE B."Panier"(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,DATE DATE NOT NULL,CLIENT INTEGER NOT NULL,FACTURE INTEGER,CONSTRAINT "PK_Panier" PRIMARY KEY(ID),CONSTRAINT "FK_Panier_facture" FOREIGN KEY(FACTURE) REFERENCES B."Facture"(ID) ON UPDATE CASCADE,CONSTRAINT "FK_Panier_client" FOREIGN KEY(CLIENT) REFERENCES B."Client"(ID) ON UPDATE CASCADE) +ALTER TABLE B."Panier" ALTER COLUMN ID RESTART WITH 5 +CREATE CACHED TABLE B."Vente"(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,PRODUIT INTEGER NOT NULL,QUANTIT\u00c9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL,PANIER INTEGER NOT NULL,CONSTRAINT "PK_Vente" PRIMARY KEY(ID),CONSTRAINT "FK_Vente_produit" FOREIGN KEY(PRODUIT) REFERENCES B."Produit"(ID) ON UPDATE CASCADE,CONSTRAINT "FK_Vente_panier" FOREIGN KEY(PANIER) REFERENCES B."Panier"(ID) ON UPDATE CASCADE) +ALTER TABLE B."Vente" ALTER COLUMN ID RESTART WITH 7 +CREATE CACHED TABLE B."Stock"(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,LIEU INTEGER NOT NULL,PRODUIT INTEGER NOT NULL,QUANTIT\u00c9 DECIMAL(100,3) DEFAULT 1.000 NOT NULL,CONSTRAINT "PK_Stock" PRIMARY KEY(ID),CONSTRAINT "FK_Stock_lieu" FOREIGN KEY(LIEU) REFERENCES B."Lieu"(ID) ON UPDATE CASCADE,CONSTRAINT "FK_Stock_produit" FOREIGN KEY(PRODUIT) REFERENCES B."Produit"(ID) ON UPDATE CASCADE) +ALTER TABLE B."Stock" ALTER COLUMN ID RESTART WITH 0 +CREATE CACHED TABLE B."Prix"(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL,DATE DATE NOT NULL,PRODUIT INTEGER NOT NULL,EUROS DECIMAL(100,2) DEFAULT 0.00 NOT NULL,CONSTRAINT "PK_Prix" PRIMARY KEY(ID)) +ALTER TABLE B."Prix" ALTER COLUMN ID RESTART WITH 9 +CREATE PROCEDURE B.INSERTVENTE(IN VENTEDATE DATE,IN VENTECLIENT INTEGER,IN VENTEPRODUIT INTEGER,IN VENTEQUANTIT\u00c9 DECIMAL(128)) SPECIFIC INSERTVENTE_14705 LANGUAGE SQL NOT DETERMINISTIC MODIFIES SQL DATA NEW SAVEPOINT LEVEL BEGIN ATOMIC DECLARE PANIERID INTEGER DEFAULT NULL;DECLARE VENTEID INTEGER DEFAULT NULL;SET PANIERID=SELECT ID FROM B."Panier" WHERE "Panier".DATE=VENTEDATE AND "Panier".CLIENT=VENTECLIENT;IF PANIERID IS NULL THEN INSERT INTO B."Panier"(DATE,CLIENT)VALUES(VENTEDATE,VENTECLIENT);SET PANIERID=IDENTITY();END IF;SET VENTEID=SELECT ID FROM B."Vente" WHERE "Vente".PANIER=PANIERID AND "Vente".PRODUIT=VENTEPRODUIT;IF VENTEID IS NULL THEN INSERT INTO B."Vente"(PANIER,PRODUIT,QUANTIT\u00c9)VALUES(PANIERID,VENTEPRODUIT,VENTEQUANTIT\u00c9);END IF;END +CREATE PROCEDURE B.INSERTVENTESPARABONNEMENT(IN FINALDATE DATE) SPECIFIC INSERTVENTESPARABONNEMENT_14709 LANGUAGE SQL NOT DETERMINISTIC MODIFIES SQL DATA NEW SAVEPOINT LEVEL BEGIN ATOMIC FOR_DAYS:FOR SELECT DAY FROM UNNEST(SEQUENCE_ARRAY(DATE'2025-04-07',FINALDATE,1 DAY))WITH ORDINALITY AS T(DAY,I)DO FOR_ABOS:FOR SELECT ID AS ABOID,CLIENT AS ABOCLIENT,PRODUIT AS ABOPRODUIT,QUANTIT\u00c9 AS ABOQUANTIT\u00c9,P\u00c9RIODE AS ABOP FROM B."Abonnement" JOIN B."P\u00e9riode" ON "P\u00e9riode".ID="Abonnement".P\u00c9RIODE AND "P\u00e9riode".NOM=DAYNAME(DAY)DO CALL INSERTVENTE(DAY,ABOCLIENT,ABOPRODUIT,ABOQUANTIT\u00c9);END FOR FOR_ABOS;END FOR FOR_DAYS;END +ALTER SEQUENCE SYSTEM_LOBS.LOB_ID RESTART WITH 1 +SET DATABASE DEFAULT INITIAL SCHEMA B +SET TABLE B."Produit" INDEX '3977 0 37' +SET TABLE B."Ingr\u00e9dient" INDEX '4077 4077 4077 4077 0 0 0 0 1' +SET TABLE B."Lieu" INDEX '3922 0 10' +SET TABLE B."Client" INDEX '4056 4056 0 0 3' +SET TABLE B."P\u00e9riode" INDEX '4045 0 7' +SET TABLE B."Abonnement" INDEX '4065 4065 4065 4065 4065 0 0 0 0 0 4' +SET TABLE B."Panier" INDEX '4100 4100 4100 0 0 0 5' +SET TABLE B."Vente" INDEX '4112 4106 4112 0 0 0 7' +SET TABLE B."Prix" INDEX '4086 0 9' +GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.CARDINAL_NUMBER TO PUBLIC +GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.YES_OR_NO TO PUBLIC +GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.CHARACTER_DATA TO PUBLIC +GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.SQL_IDENTIFIER TO PUBLIC +GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.TIME_STAMP TO PUBLIC +GRANT DBA TO SA +SET SCHEMA SYSTEM_LOBS +INSERT INTO BLOCKS VALUES(0,2147483647,0) diff --git a/data/Client.csv b/data/Client.csv index b3de77a..21c7eb7 100644 --- a/data/Client.csv +++ b/data/Client.csv @@ -1,4 +1,4 @@ -"ID"|"NOM"|"LIEU"|"TÉL"|"MÉL" -"0"|"Séverine"|"0"|""|"" -"1"|"Julien"|"0"|""|"" -"2"|"Paul"|"2"|[null]|[null] +"ID"|"NOM"|"LIEU"|"TÉL"|"MÉL"|"FACTURABLE" +"0"|"Séverine"|"0"|""|""|"TRUE" +"1"|"Julien"|"0"|""|""|"TRUE" +"2"|"Paul"|"2"|[null]|[null]|"TRUE" diff --git a/data/Facture.csv b/data/Facture.csv index 5a1769f..6cd3763 100644 --- a/data/Facture.csv +++ b/data/Facture.csv @@ -1 +1,5 @@ "ID"|"DATE" +"0"|"2025-04-30 00:00:00" +"1"|"2025-04-30 00:00:00" +"2"|"2025-04-30 00:00:00" +"3"|"2025-04-30 00:00:00" diff --git a/data/Panier.csv b/data/Panier.csv index 266f6ed..0f2fe52 100644 --- a/data/Panier.csv +++ b/data/Panier.csv @@ -1,6 +1,6 @@ -"ID"|"DATE"|"CLIENT"|"FACTURE" -"0"|"2025-04-07 00:00:00"|"0"| -"1"|"2025-04-07 00:00:00"|"1"| -"2"|"2025-04-10 00:00:00"|"2"| -"3"|"2025-04-14 00:00:00"|"0"| -"4"|"2025-04-14 00:00:00"|"1"| +"ID"|"DATE"|"CLIENT"|"FACTURABLE"|"FACTURE" +"0"|"2025-04-07 00:00:00"|"0"|"TRUE"|[null] +"1"|"2025-04-07 00:00:00"|"1"|"TRUE"|[null] +"2"|"2025-04-10 00:00:00"|"2"|"TRUE"|[null] +"3"|"2025-04-14 00:00:00"|"0"|"TRUE"|[null] +"4"|"2025-04-14 00:00:00"|"1"|"TRUE"|[null] diff --git a/data/Prix.csv b/data/Prix.csv index 9979c44..0208f47 100644 --- a/data/Prix.csv +++ b/data/Prix.csv @@ -6,7 +6,36 @@ "4"|"2025-04-01 00:00:00"|"4"|"8.00" "5"|"2025-04-01 00:00:00"|"5"|"7.00" "6"|"2025-04-01 00:00:00"|"6"|"39.00" -"7"|"2025-04-17 00:00:00"|"0"|"32.00" -"8"|"2025-04-26 00:00:00"|"2"|"84.00" -"9"|"2025-04-28 00:00:00"|"0"|"23.00" -"10"|"2025-04-29 00:00:00"|"0"|"23.00" +"7"|"2025-04-01 00:00:00"|"7"|"42.00" +"8"|"2025-04-01 00:00:00"|"8"|"42.00" +"9"|"2025-04-01 00:00:00"|"9"|"42.00" +"10"|"2025-04-01 00:00:00"|"10"|"42.00" +"11"|"2025-04-01 00:00:00"|"11"|"110.00" +"12"|"2025-04-01 00:00:00"|"12"|"42.00" +"13"|"2025-04-01 00:00:00"|"13"|"42.00" +"14"|"2025-04-01 00:00:00"|"14"|"42.00" +"15"|"2025-04-01 00:00:00"|"15"|"42.00" +"16"|"2025-04-01 00:00:00"|"16"|"42.00" +"17"|"2025-04-01 00:00:00"|"17"|"42.00" +"18"|"2025-04-01 00:00:00"|"18"|"42.00" +"19"|"2025-04-01 00:00:00"|"19"|"42.00" +"20"|"2025-04-01 00:00:00"|"20"|"42.00" +"21"|"2025-04-01 00:00:00"|"21"|"42.00" +"22"|"2025-04-01 00:00:00"|"22"|"42.00" +"23"|"2025-04-01 00:00:00"|"23"|"42.00" +"24"|"2025-04-01 00:00:00"|"24"|"42.00" +"25"|"2025-04-01 00:00:00"|"25"|"42.00" +"26"|"2025-04-01 00:00:00"|"26"|"42.00" +"27"|"2025-04-01 00:00:00"|"27"|"42.00" +"28"|"2025-04-01 00:00:00"|"28"|"42.00" +"29"|"2025-04-01 00:00:00"|"29"|"42.00" +"30"|"2025-04-01 00:00:00"|"30"|"42.00" +"31"|"2025-04-01 00:00:00"|"31"|"42.00" +"32"|"2025-04-01 00:00:00"|"32"|"42.00" +"33"|"2025-04-01 00:00:00"|"33"|"42.00" +"34"|"2025-04-01 00:00:00"|"34"|"42.00" +"35"|"2025-04-01 00:00:00"|"35"|"42.00" +"36"|"2025-04-01 00:00:00"|"36"|"42.00" +"37"|"2025-04-17 00:00:00"|"0"|"32.00" +"38"|"2025-04-26 00:00:00"|"2"|"84.00" +"39"|"2025-04-28 00:00:00"|"0"|"23.00" diff --git a/data/Vente.csv b/data/Vente.csv index fe11f44..78252c2 100644 --- a/data/Vente.csv +++ b/data/Vente.csv @@ -1,7 +1,7 @@ "ID"|"PRODUIT"|"QUANTITÉ"|"PANIER" "0"|"10"|"1.000"|"0" "1"|"14"|"2.000"|"1" -"2"|"11"|"1.000"|"0" +"2"|"11"|"3.000"|"0" "3"|"16"|"4.000"|"2" "4"|"10"|"1.000"|"3" "5"|"14"|"2.000"|"4" diff --git "a/mod\303\250les/Clients.ott" "b/mod\303\250les/Clients.ott" new file mode 100644 index 0000000..c3f8dfe Binary files /dev/null and "b/mod\303\250les/Clients.ott" differ diff --git "a/mod\303\250les/Facture.Facture.sql" "b/mod\303\250les/Facture.Facture.sql" new file mode 100644 index 0000000..75fc372 --- /dev/null +++ "b/mod\303\250les/Facture.Facture.sql" @@ -0,0 +1,10 @@ +SELECT + DATE + , "Client".nom as client + , "Lieu".nom as lieu + FROM "Facture" + JOIN "Panier" ON "Panier".facture = "Facture".ID + JOIN "Client" ON "Client".ID = "Panier".ID + JOIN "Lieu" ON "Lieu".ID = "Client".lieu + --WHERE ID = '###FORMFIELD()###' +; diff --git "a/mod\303\250les/Facture.Paniers.sql" "b/mod\303\250les/Facture.Paniers.sql" new file mode 100644 index 0000000..d2cc1cf --- /dev/null +++ "b/mod\303\250les/Facture.Paniers.sql" @@ -0,0 +1,18 @@ +\p modèles/Facture.Paniers.sql +SELECT + panier + , panier_date + , "Prod".nom_complet as produit + , quantité as quantité + , euros as prix_unitaire_ttc + , ROUND(quantité,2) * euros as prix_total_ttc + FROM "Factures" + JOIN TABLE (choisirUnProduit()) AS "Prod" ON "Prod".ID = produit + WHERE ID = '0' +; + --WHERE "ID" = '###FORMFIELD()###' + --JOIN "Produit" ON "Produit".ID = produit + --GROUP BY panier, panier_date, "Prod".nom_complet, + --, "Produit".nom as produit + --, "Produit".quantité as quantité_unitaire + --, coalesce ("Produit".unité, '') as unité diff --git "a/mod\303\250les/Facture.Totaux.sql" "b/mod\303\250les/Facture.Totaux.sql" new file mode 100644 index 0000000..5cab1fa --- /dev/null +++ "b/mod\303\250les/Facture.Totaux.sql" @@ -0,0 +1,15 @@ +\p modèles/Facture.Totaux.sql +SELECT + ID, + SUM(ROUND(quantité,2) * euros) as prix_total + FROM "Factures" + GROUP BY ID +; +select * from "Factures"; +SELECT "Prod".nom_complet + , SUM(ROUND(quantité,2) * euros) as prix_total + FROM "Factures" + JOIN TABLE (choisirUnProduit()) AS "Prod" ON "Prod".ID = produit + WHERE "ID" = '1' + GROUP BY ID, "Prod".nom_complet +; diff --git "a/mod\303\250les/Facture.ott" "b/mod\303\250les/Facture.ott" new file mode 100644 index 0000000..c41eaec Binary files /dev/null and "b/mod\303\250les/Facture.ott" differ diff --git a/sql/dev.sql b/sql/dev.sql index 012acd2..73573f4 100644 --- a/sql/dev.sql +++ b/sql/dev.sql @@ -11,18 +11,24 @@ CREATE PROCEDURE insertVente MODIFIES SQL DATA BEGIN ATOMIC DECLARE panierID INTEGER DEFAULT NULL; + DECLARE venteFacturable BOOLEAN DEFAULT FALSE; DECLARE venteID INTEGER DEFAULT NULL; -- CorrectnessNote: seule la date et le client -- font partie des critères pour décider -- si le panier existe déjà où non. - SET panierID = SELECT ID FROM "Panier" - WHERE "Panier".date = venteDate - AND "Panier".client = venteClient; + SET panierID = + SELECT ID FROM "Panier" + WHERE "Panier".date = venteDate + AND "Panier".client = venteClient; IF panierID IS NULL THEN - INSERT INTO "Panier"(date, client) - VALUES (venteDate, venteClient); + SET venteFacturable = + SELECT facturable + FROM "Client" + WHERE "Client".ID = venteClient; + INSERT INTO "Panier"(date, client, facturable) + VALUES (venteDate, venteClient, venteFacturable); SET panierID = IDENTITY(); END IF; @@ -69,10 +75,88 @@ CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE) CALL insertVentesParAbonnement(DATE '2025-04-07' + 7 DAY); +-- `insertFactureClient(client)` +-- crée une facture pour tous les paniers +-- de `client`. +DROP PROCEDURE insertFactureClient IF EXISTS; +CREATE PROCEDURE insertFactureClient(IN selClient INTEGER) + MODIFIES SQL DATA + BEGIN ATOMIC + DECLARE factureID INTEGER DEFAULT NULL; + -- Si le client a des paniers `facturable`s sans `facture`. + IF CARDINALITY(ARRAY (SELECT ID + FROM "Panier" + WHERE client = selClient + AND facturable + AND facture IS NULL + )) > 0 + THEN + -- Crée une nouvelle facture + -- et référence celle-ci dans tous les paniers + -- non-facturés jusque là. + INSERT INTO "Facture"(date) + VALUES (CURRENT_DATE); + SET factureID = IDENTITY(); + UPDATE "Panier" + SET facture = factureID + WHERE facture IS NULL + AND client = selClient + ; + END IF; + END; +.; + \i sql/show.sql --call prix_à_date(CURRENT_DATE); -select "Prod".nom_complet, date, euros -from table (prix_à_date(CURRENT_DATE)) as PD -join table (choisirUnProduit()) as "Prod" ON "Prod".ID = produit +SELECT "Prod".nom_complet, date, euros +FROM TABLE (prix_à_date(CURRENT_DATE)) AS PD +JOIN TABLE (choisirUnProduit()) AS "Prod" ON "Prod".ID = produit ; + +CALL insertFactureClient(0); +CALL insertFactureClient(1); +CALL insertFactureClient(2); +SELECT * FROM "Panier" ; +SELECT * FROM "Client" ; + +\p . +\p Factures des clients +DROP VIEW "Factures" IF EXISTS; +CREATE VIEW "Factures" AS + SELECT + "Facture".ID, + --ANY_VALUE + ("Facture".date) as facture_date, + --ANY_VALUE + ("Client".ID) as client, + --ANY_VALUE + ("Panier".ID) as panier, + --ANY_VALUE + ("Panier".date) as panier_date, + --ARRAY_AGG + -- ("Vente".ID) as ventes, + --ARRAY_AGG + "Produit".ID as produit, + "Vente".quantité as quantité, + "PrixÁDate".euros as euros + --GROUP_CONCAT + --("PrixÁDate".euros * "Vente".quantité SEPARATOR ', ') as prix_quantifié + FROM "Panier" + JOIN "Facture" ON "Facture".ID = "Panier".facture + JOIN "Client" ON "Client".ID = "Panier".client + JOIN "Vente" ON "Vente".panier = "Panier".ID + JOIN "Produit" ON "Produit".ID = "Vente".produit + JOIN TABLE (prix_à_date("Panier".date)) AS "PrixÁDate" ON "PrixÁDate".produit = "Produit".ID + ORDER BY + "Facture".ID + , "Facture".date + , "Client".ID + , "Panier".ID + , "Panier".date + , "Produit".ID + ; +SELECT * FROM "Factures"; + +\i modèles/Facture.Paniers.sql +\i modèles/Facture.Totaux.sql diff --git a/sql/import.sql b/sql/import.sql index f7a065a..7e335a5 100644 --- a/sql/import.sql +++ b/sql/import.sql @@ -12,10 +12,6 @@ SET SCHEMA B; * *DSV_TARGET_TABLE = "Facture" \mq data/Facture.csv ---\p Importing Panier ---* *DSV_TARGET_TABLE = "Panier" ---\mq data/Panier.csv - \p Importing Produit * *DSV_TARGET_TABLE = "Produit" \mq data/Produit.csv @@ -28,6 +24,10 @@ SET SCHEMA B; * *DSV_TARGET_TABLE = "Client" \mq data/Client.csv +\p Importing Panier +* *DSV_TARGET_TABLE = "Panier" +\mq data/Panier.csv + \p Importing Abonnement * *DSV_TARGET_TABLE = "Abonnement" \mq data/Abonnement.csv @@ -39,3 +39,7 @@ SET SCHEMA B; \p Importing Prix * *DSV_TARGET_TABLE = "Prix" \mq data/Prix.csv + +\p Importing Vente +* *DSV_TARGET_TABLE = "Vente" +\mq data/Vente.csv diff --git a/sql/init/Client.sql b/sql/init/Client.sql index ac15229..3aaffc8 100644 --- a/sql/init/Client.sql +++ b/sql/init/Client.sql @@ -3,13 +3,15 @@ CREATE CACHED TABLE "Client" ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL , nom VARCHAR(100) NOT NULL , lieu INTEGER NOT NULL - , tél VARCHAR(100) - , mél VARCHAR(100) + , tél VARCHAR(100) DEFAULT NULL + , mél VARCHAR(100) DEFAULT NULL + , facturable BOOLEAN DEFAULT TRUE NOT NULL , CONSTRAINT "PK_Client" PRIMARY KEY(ID) + , CONSTRAINT "FK_Client_lieu" + FOREIGN KEY(lieu) + REFERENCES "Lieu"(ID) + ON UPDATE CASCADE ); -ALTER TABLE "Client" - ADD CONSTRAINT "FK_Client_lieu" FOREIGN KEY(lieu) REFERENCES "Lieu"(ID) - ON UPDATE CASCADE; DROP FUNCTION choisirUnClient IF EXISTS CASCADE; CREATE FUNCTION choisirUnClient() diff --git a/sql/init/Panier.sql b/sql/init/Panier.sql index 3d866ab..6160405 100644 --- a/sql/init/Panier.sql +++ b/sql/init/Panier.sql @@ -3,6 +3,7 @@ CREATE CACHED TABLE "Panier" ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL , date DATE DEFAULT CURRENT_DATE NOT NULL , client INTEGER NOT NULL + , facturable BOOLEAN DEFAULT FALSE NOT NULL , facture INTEGER , CONSTRAINT "PK_Panier" PRIMARY KEY(ID) , CONSTRAINT "FK_Panier_facture" diff --git a/sql/init/Vente.sql b/sql/init/Vente.sql index f5dcb32..9edc8f4 100644 --- a/sql/init/Vente.sql +++ b/sql/init/Vente.sql @@ -13,4 +13,6 @@ CREATE CACHED TABLE "Vente" FOREIGN KEY(panier) REFERENCES "Panier"(ID) ON UPDATE CASCADE + , CONSTRAINT "La combinaison (produit, panier) d'une vente doit être unique" + UNIQUE (produit, panier) );