]> Git — Sourcephile - tmp/julm/LesQuatreRoux.git/commitdiff
dev sql and ott main
authorJulien Moutinho <julm+LesQuatreRoux@sourcephile.fr>
Wed, 30 Apr 2025 11:38:11 +0000 (13:38 +0200)
committerJulien Moutinho <julm+LesQuatreRoux@sourcephile.fr>
Wed, 30 Apr 2025 11:39:00 +0000 (13:39 +0200)
21 files changed:
.gitignore
LesQuatreRoux.data [new file with mode: 0644]
LesQuatreRoux.log [new file with mode: 0644]
LesQuatreRoux.odb [new file with mode: 0644]
LesQuatreRoux.properties [new file with mode: 0644]
LesQuatreRoux.script [new file with mode: 0644]
data/Client.csv
data/Facture.csv
data/Panier.csv
data/Prix.csv
data/Vente.csv
modèles/Clients.ott [new file with mode: 0644]
modèles/Facture.Facture.sql [new file with mode: 0644]
modèles/Facture.Paniers.sql [new file with mode: 0644]
modèles/Facture.Totaux.sql [new file with mode: 0644]
modèles/Facture.ott [new file with mode: 0644]
sql/dev.sql
sql/import.sql
sql/init/Client.sql
sql/init/Panier.sql
sql/init/Vente.sql

index a2d48ed52505915577c3b3056d72d2f04898943a..beb5fd07738639f102ebf35d0b43363b60ce614d 100644 (file)
@@ -1 +1,2 @@
 hsqldb
 hsqldb
+*.~lock.*
diff --git a/LesQuatreRoux.data b/LesQuatreRoux.data
new file mode 100644 (file)
index 0000000..1891ec8
Binary files /dev/null and b/LesQuatreRoux.data differ
diff --git a/LesQuatreRoux.log b/LesQuatreRoux.log
new file mode 100644 (file)
index 0000000..cd8e27f
--- /dev/null
@@ -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 (file)
index 0000000..3e81f11
Binary files /dev/null and b/LesQuatreRoux.odb differ
diff --git a/LesQuatreRoux.properties b/LesQuatreRoux.properties
new file mode 100644 (file)
index 0000000..34a8826
--- /dev/null
@@ -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 (file)
index 0000000..1b0b4d1
--- /dev/null
@@ -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)
index b3de77a7e5eb071c0fcc2691d499a4e139ae76da..21c7eb707f332a3143bb579f1e4bb675d1b90cce 100644 (file)
@@ -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"
index 5a1769f38e3146fdf0f32c4dd1060c64b0f0db24..6cd37639803f767853c73c3bc28e82408c512159 100644 (file)
@@ -1 +1,5 @@
 "ID"|"DATE"
 "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"
index 266f6eda3661c6b165d9b874f33a8e5829a536f9..0f2fe52194b41023df2fd432344cc0d6bc86f5e4 100644 (file)
@@ -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]
index 9979c44666b164b1f9374d1e9c76be4174159014..0208f4770eb2205c5b1bf13559bfdf552a723439 100644 (file)
@@ -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"
 "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"
index fe11f442c23737e2c667df0084abccf43ffce130..78252c2786004828d5cb0eec0a27273362324cd1 100644 (file)
@@ -1,7 +1,7 @@
 "ID"|"PRODUIT"|"QUANTITÉ"|"PANIER"
 "0"|"10"|"1.000"|"0"
 "1"|"14"|"2.000"|"1"
 "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"
 "3"|"16"|"4.000"|"2"
 "4"|"10"|"1.000"|"3"
 "5"|"14"|"2.000"|"4"
diff --git a/modèles/Clients.ott b/modèles/Clients.ott
new file mode 100644 (file)
index 0000000..c3f8dfe
Binary files /dev/null and "b/mod\303\250les/Clients.ott" differ
diff --git a/modèles/Facture.Facture.sql b/modèles/Facture.Facture.sql
new file mode 100644 (file)
index 0000000..75fc372
--- /dev/null
@@ -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(<Clients><Factures><FacturesControl><ID>)###'
+;
diff --git a/modèles/Facture.Paniers.sql b/modèles/Facture.Paniers.sql
new file mode 100644 (file)
index 0000000..d2cc1cf
--- /dev/null
@@ -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(<Clients><Factures><FacturesControl><ID>)###'
+  --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èles/Facture.Totaux.sql b/modèles/Facture.Totaux.sql
new file mode 100644 (file)
index 0000000..5cab1fa
--- /dev/null
@@ -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èles/Facture.ott b/modèles/Facture.ott
new file mode 100644 (file)
index 0000000..c41eaec
Binary files /dev/null and "b/mod\303\250les/Facture.ott" differ
index 012acd2d1f5e2c663db6ce51ed479aae2271e4ce..73573f4daec498f4a97828fcdf3d112fada0dd0d 100644 (file)
@@ -11,18 +11,24 @@ CREATE PROCEDURE insertVente
   MODIFIES SQL DATA
   BEGIN ATOMIC
     DECLARE panierID INTEGER DEFAULT NULL;
   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.
     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
     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;
 
       SET panierID = IDENTITY();
     END IF;
 
@@ -69,10 +75,88 @@ CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)
 
 CALL insertVentesParAbonnement(DATE '2025-04-07' + 7 DAY);
 
 
 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);
 \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
index f7a065a9bba5047ae97d4d4442d9d608fe80f82f..7e335a56dd0c43d3d3a0fa4828b22c6e5c087cf4 100644 (file)
@@ -12,10 +12,6 @@ SET SCHEMA B;
 * *DSV_TARGET_TABLE = "Facture"
 \mq data/Facture.csv
 
 * *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
 \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
 
 * *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
 \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 Prix
 * *DSV_TARGET_TABLE = "Prix"
 \mq data/Prix.csv
+
+\p Importing Vente
+* *DSV_TARGET_TABLE = "Vente"
+\mq data/Vente.csv
index ac15229a6fb7ff135a0d82a672a4354b656bca3c..3aaffc837dd61f3d1e97b715de31805a803181b6 100644 (file)
@@ -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
   ( 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 "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()
 
 DROP FUNCTION choisirUnClient IF EXISTS CASCADE;
 CREATE FUNCTION choisirUnClient()
index 3d866ab938f818ad60c03d7a97d9518fb02b0f4c..616040512d282df425214daa2dae56277a304481 100644 (file)
@@ -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
   ( 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"
   , facture INTEGER
   , CONSTRAINT "PK_Panier" PRIMARY KEY(ID)
   , CONSTRAINT "FK_Panier_facture"
index f5dcb324a70956ef20588bbfc7bd3a47e6f03272..9edc8f4e433b99be04e06d84fbce1c391654daaa 100644 (file)
@@ -13,4 +13,6 @@ CREATE CACHED TABLE "Vente"
       FOREIGN KEY(panier)
       REFERENCES "Panier"(ID)
       ON UPDATE CASCADE
       FOREIGN KEY(panier)
       REFERENCES "Panier"(ID)
       ON UPDATE CASCADE
+  , CONSTRAINT "La combinaison (produit, panier) d'une vente doit être unique"
+      UNIQUE (produit, panier)
   );
   );