From 132804bccecba22e2401fbf03087cf32a4ce56f2 Mon Sep 17 00:00:00 2001 From: medina5 Date: Sun, 9 Nov 2025 10:26:00 +0100 Subject: [PATCH] bank --- banque.md | 5 +- banque/banque.1.tables.sql | 42 +++++++++--- banque/banque.2.proc.sql | 137 ++++++++++++++++++++++++++++++++++++- banque/banque.3.data.sql | 0 banque/groupe1/data.sql | 52 ++++++++++++++ banque/groupe2/data.sql | 50 ++++++++++++++ banque/groupe3/data.sql | 127 ++++++++++++++++++++++++++++++++++ banque/groupe4/data.sql | 50 ++++++++++++++ 8 files changed, 449 insertions(+), 14 deletions(-) create mode 100644 banque/banque.3.data.sql create mode 100644 banque/groupe1/data.sql create mode 100644 banque/groupe2/data.sql create mode 100644 banque/groupe3/data.sql create mode 100644 banque/groupe4/data.sql diff --git a/banque.md b/banque.md index 367efaa..73a2d0b 100644 --- a/banque.md +++ b/banque.md @@ -444,7 +444,7 @@ insert into holder (type) values ('BANK') returning holder; ``` ```sql -insert into bank (name) values ('Banque Regionale'); +insert into bank (id, name) values (10, 'Banque de l''Est'); ``` #### 1.1 Contraintes à respecter @@ -460,6 +460,9 @@ Il existe deux méthodes pour gérer le type. 2. utiliser une énumération `enum`. +```sql +create type holder_type as enum ('BANK', 'PERSON', 'COMPANY'); +``` #### 1.2 Vérifications diff --git a/banque/banque.1.tables.sql b/banque/banque.1.tables.sql index c91e0d4..fd16686 100644 --- a/banque/banque.1.tables.sql +++ b/banque/banque.1.tables.sql @@ -2,28 +2,38 @@ drop schema if exists bank cascade; create schema bank; set search_path TO bank; -/* +/************************************************************************ * Holder : table commune à tous les titulaires - */ + * bigint : entier sur 64 bits + * primary key : clé primaire, identification unique de l'enregistrement + * generated always as identity : numéro incrément automatique 1, 2, 3 ... + * Le type est forcé aux 3 valeurs de l'énumération holder_type + * current_timestamp date et heure courante. Version moderne de now() + ************************************************************************/ create type holder_type as enum ('BANK', 'PERSON', 'COMPANY'); create table holder ( - "id" bigint primary key generated always as identity, -- identifiant unique + "id" bigint primary key generated always as identity, "type" holder_type not null, - "created_at" timestamp not null default current_timestamp -- date et heure de création + "created_at" timestamp not null default current_timestamp ); -/* +/************************************************************************ * Bank - */ + * Liée par références à titulaire (holder) pas d'incrément automatique + * puisque c'est celui de titulaire + ************************************************************************/ create table bank ( - "id" bigint primary key references holder(id), -- identifiant unique + "id" bigint primary key references holder(id), "name" text not null ); -/* +/************************************************************************ * Person - */ + * Liée par références à titulaire (holder) pas d'incrément automatique + * on delete cascade : Lors de la suppression du titualaire, person est + * supprimé aussi. Sans cela la suppression est interdite. + ************************************************************************/ create table person ( "id" bigint primary key references holder(id) on delete cascade, "firstname" text not null, @@ -31,9 +41,10 @@ create table person ( "birthdate" date not null check (birthdate <= current_date - interval '15 years') ); -/* +/************************************************************************ * Company - */ + * + ************************************************************************/ create table company ( "id" bigint primary key references holder(id) on delete cascade, "name" text not null, @@ -41,10 +52,19 @@ create table company ( "created_at" date not null ); +/************************************************************************ + * Company + * + ************************************************************************/ create table currency ( "code" text primary key ); +/************************************************************************ + * Exchange Rate + * La clé primaire est sur les deux colonnes currency_code et date + * Il n'y a qu'un seul taux de change par monnaie ET par jour + ************************************************************************/ create table exchange_rate ( "currency_code" text references currency(code) on delete cascade, "date" date , diff --git a/banque/banque.2.proc.sql b/banque/banque.2.proc.sql index 8413b11..09f089f 100644 --- a/banque/banque.2.proc.sql +++ b/banque/banque.2.proc.sql @@ -1,3 +1,5 @@ +set search_path TO bank; + create or replace procedure add_person ( p_firstname text, p_lastname text, @@ -20,6 +22,60 @@ begin end; $$; +create or replace procedure add_person ( + p_firstname text, + p_lastname text, + p_birthdate date, + p_nb_account int +) +language plpgsql +as $$ +declare + v_holder_id bigint; +begin + + insert into holder(type) values ('PERSON') + returning id into v_holder_id; + + insert into person(id, firstname, lastname, birthdate) + values (v_holder_id, p_firstname, p_lastname, p_birthdate); + + for counter in 1..pb_nb_account loop + call add_account(v_holder_id, 'EUR'); + end loop; + + raise notice 'Titulaire créé : % = % %', + v_holder_id, p_firstname, p_lastname; +end; +$$; + +create or replace procedure add_person ( + p_firstname text, + p_lastname text, + p_birthdate date, + currencies text[] +) +language plpgsql +as $$ +declare + v_holder_id bigint; +begin + + insert into holder(type) values ('PERSON') + returning id into v_holder_id; + + insert into person(id, firstname, lastname, birthdate) + values (v_holder_id, p_firstname, p_lastname, p_birthdate); + + for counter in 1..array_length(currencies, 1) loop + call add_account(v_holder_id, currencies[counter]); + end loop; + + raise notice 'Titulaire créé : % = % %', + v_holder_id, p_firstname, p_lastname; +end; +$$; + create or replace procedure add_bank ( name text ) @@ -33,10 +89,10 @@ begin returning id into v_holder_id; insert into bank(id, name) - values (v_holder_id, p_name); + values (v_holder_id, name); raise notice 'Titulaire créé : % = %', - v_holder_id, p_name; + v_holder_id, name; end; $$; @@ -61,3 +117,80 @@ begin v_holder_id, p_name, p_registration_number; end; $$; + +create or replace procedure add_account( + p_holder_id bigint, + p_currency text +) +language plpgsql +as $$ +declare + v_account_id int; +begin + + insert into account(currency_code) + values (p_currency) + returning id into v_account_id; + + insert into account_holder (account_id, holder_id, share) + values (v_account_id, p_holder_id, 1); + + raise notice 'Compte créé avec succès (ID=%)', + v_account_id; +end; +$$; + + +create or replace procedure add_account( + p_iban text, + p_name text, + p_holders int[], + p_shares numeric[] +) +language plpgsql +as $$ +declare + v_account_id int; + v_sum numeric(6,4) := 0; + v_count int; +begin + -- Vérification des tailles + if array_length(p_holders, 1) is null or array_length(p_shares, 1) is null then + raise exception 'Les tableaux de titulaires et de parts ne peuvent pas être vides.'; + end if; + + if array_length(p_holders, 1) <> array_length(p_shares, 1) then + raise exception 'Les tableaux de titulaires et de parts doivent avoir la même taille.'; + end if; + + -- Calcul de la somme des parts + -- select sum(unnest(p_shares)) into v_sum; + for i in 1..array_length(p_shares, 1) loop + v_sum := v_sum + p_shares[i]; + end loop; + + if abs(v_sum - 1.0) > 0.0001 then + raise exception 'La somme des parts (%.4f) doit être égale à 1.0000', v_sum; + end if; + + -- Vérification des titulaires + select count(*) into v_count from holder where id = any(p_holders); + if v_count <> array_length(p_holders, 1) then + raise exception 'Un ou plusieurs titulaires n''existent pas.'; + end if; + + -- Création du compte + insert into account(iban, name) + values (p_iban, p_name) + returning id into v_account_id; + + -- Association des titulaires + for i in 1..array_length(p_holders, 1) loop + insert into account_holder(account_id, holder_id, share) + values (v_account_id, p_holders[i], p_shares[i]); + end loop; + + raise notice 'Compte créé avec succès (ID=%) avec % titulaires.', + v_account_id, array_length(p_holders, 1); +end; +$$; diff --git a/banque/banque.3.data.sql b/banque/banque.3.data.sql new file mode 100644 index 0000000..e69de29 diff --git a/banque/groupe1/data.sql b/banque/groupe1/data.sql new file mode 100644 index 0000000..abf39e7 --- /dev/null +++ b/banque/groupe1/data.sql @@ -0,0 +1,52 @@ +set search_path TO bank; + +call add_bank('Banque de l''Est'); +insert into currency values ('EUR'),('YEN'),('USD'); + +call add_account(1,'EUR'); +call add_account(1,'YEN'); +call add_account(1,'USD'); + +call add_person('Albane','Trottier', '1990-01-01', array['USD']); +call add_person('Josef','Jakubowski', '1990-01-01',array['EUR', 'EUR']); +call add_person('Ali','Sahim', '1990-01-01', array['EUR']); +call add_person('Émilie','Jolie', '1990-01-01', array['EUR']); +call add_person('Soufiane','Mamoun', '1990-01-01',array['EUR', 'EUR']); +call add_person('Élodie','Bérengier', '1990-01-01',array['EUR', 'EUR']); +call add_person('Eugène','Makiadi', '1990-01-01', array['EUR']); +call add_person('Julie','Thomis', '1990-01-01',array['EUR', 'EUR', 'EUR']); +call add_person('Marc','Aurèle', '1990-01-01',array['USD', 'EUR', 'EUR']); +call add_person('Albert','Unepierre', '1990-01-01', array['EUR']); +call add_person('Lucas','George', '1990-01-01', array['EUR']); +call add_person('Lyna','Khoudri', '1990-01-01',array['EUR', 'USD']); +call add_person('Nour','Zermani', '1990-01-01', array['USD']); +call add_person('Théophile','M''Beko', '1990-01-01',array['EUR', 'USD']); +call add_person('Sébastien','Voltier', '1990-01-01', array['EUR']); +call add_person('Matteo','Giordano', '1990-01-01',array['EUR', 'USD']); +call add_person('Diego','Delavega', '1990-01-01',array['EUR', 'EUR', 'EUR']); +call add_person('Geoffrey','Lebowski', '1990-01-01',array['EUR', 'EUR', 'EUR']); +call add_person('Ælita','Dornburg', '1990-01-01',array['EUR', 'USD']); +call add_person('João','Costa', '1990-01-01',array['EUR']); +call add_person('Maëla','Le Roux', '1990-01-01',array['EUR']); +call add_person('Rose-Lynn','Noël', '1990-01-01',array['EUR']); +call add_person('Jean-Christophe','Prigent', '1990-01-01',array['EUR','USD']); +call add_person('Apolline','de Bazelaire de Lesseux', '1990-01-01',array['EUR']); +call add_person('Aylin','Özkan', '1990-01-01',array['EUR', 'EUR', 'EUR']); +call add_person('Yana','Zhdanova', '1988-02-28',array['EUR', 'EUR']); +call add_person('Nayiri','Zakarian', '1990-01-01',array['EUR', 'EUR']); +call add_person('François','du Bessey de Contenson', '1990-01-01', array['USD', 'EUR', 'EUR']); +call add_person('Martial','Mondésir', '1990-01-01', array['EUR', 'EUR', 'EUR']); +call add_person('Tom','Kishida', '1990-01-01',array['EUR', 'EUR']); +call add_person('Zainap','Bisliev', '1990-01-01',array['EUR']); +call add_person('Maï Ly','Pham Le', '1990-01-01',array['EUR', 'EUR']); +call add_person('Laurent','Ramasawmy', '1990-01-01',array['EUR']); +call add_person('Atika','Mroudjaé', '1990-01-01',array['EUR', 'EUR', 'EUR']); +call add_person('Alice','Inechains', '1987-07-07',array['EUR']); +call add_person('Laureline','Mézières', '1990-01-01',array['EUR', 'USD']); +call add_person('Valerian','Christin', '1990-01-01',array['EUR', 'EUR', 'USD']); +call add_person('Alice','Kingsleigh', '1990-01-01',array['EUR', 'USD', 'EUR']); +call add_person('Amélie','Pond', '1990-01-01',array['EUR', 'EUR', 'EUR']); +call add_person('Eyota','Olmsted', '1990-01-01',array['EUR', 'EUR']); +call add_person('Hapsatou','Sall','1990-01-01'); +call add_person('Arthur','Koblenz','1990-01-01'); +call add_person('Ellen Louise','Ripley','1990-01-01'); diff --git a/banque/groupe2/data.sql b/banque/groupe2/data.sql new file mode 100644 index 0000000..006bbcd --- /dev/null +++ b/banque/groupe2/data.sql @@ -0,0 +1,50 @@ +call add_bank('Banque du Nord'); +insert into currency values ('EUR'),('YEN'),('USD'); + +call add_account(3,'EUR'); +call add_account(3,'YEN'); +call add_account(3,'USD'); + +call add_person('Pauline','Landry','1990-01-01'); +call add_person('Ariane','Adamopoulos','1990-01-01'); +call add_person('Frédérique','Hoschedé','1990-01-01'); +call add_person('Adolphe','Dassler','1990-01-01'); +call add_person('Ousmane','Sy','1990-01-01'); +call add_person('Anton','Kamenberg','1990-01-01'); +call add_person('Hannah','von Schlotterstein','1990-01-01'); +call add_person('Jonas','van Quickenborne','1990-01-01'); +call add_person('Tristan','Gwerz de Bran','1990-01-01'); +call add_person('Shauni','Bax','1990-01-01'); +call add_person('Becky','Meyer','1990-01-01'); +call add_person('Lucien','Maes','1990-01-01'); +call add_person('Charlotte','van Houtte','1990-01-01'); +call add_person('Elisabeth','Seimetz','1990-01-01'); +call add_person('Mariette','Wengler','1990-01-01'); +call add_person('Bernard','Beicht','1990-01-01'); +call add_person('Stéphane','Kesseler','1990-01-01'); +call add_person('Jackson','Lundy','1990-01-01'); +call add_person('Amir','Hamidou','1990-01-01'); +call add_person('Chaka','Ammar','1990-01-01'); +call add_person('Odette','Philippe','1990-01-01'); +call add_person('Gérard','Lambert','1990-01-01'); +call add_person('Farrokh','Bulsara','1990-01-01'); +call add_person('Bruce','Nadjar','1990-01-01'); +call add_person('Steve','Bouchard','1990-01-01'); +call add_person('Stéphanie','Tanner','1990-01-01'); +call add_person('Ali','Taef','1990-01-01'); +call add_person('Jade','Perrin','1990-01-01'); +call add_person('Louise','Mercier','1990-01-01'); +call add_person('Emma','Lefèvre','1990-01-01'); +call add_person('Ambre','Mougeot','1990-01-01'); +call add_person('Romane','Bourgeois','1990-01-01'); +call add_person('Rosemarie','Bernard','1990-01-01'); +call add_person('Anna','Le Roux','1990-01-01'); +call add_person('Romy','Lacroix','1990-01-01'); +call add_person('Lina','Poirot','1990-01-01'); +call add_person('Chloé','Masson','1990-01-01'); +call add_person('Arnaud','Moulin','1990-01-01'); +call add_person('Agathe','Collet','1990-01-01'); +call add_person('Léna','Martin','1990-01-01'); +call add_person('Angela','Sommer-Bodenburg','1990-01-01'); +call add_person('Moojan','Asghari','1990-01-01'); +call add_person('James','Howlett','1990-01-01'); diff --git a/banque/groupe3/data.sql b/banque/groupe3/data.sql new file mode 100644 index 0000000..62b7c50 --- /dev/null +++ b/banque/groupe3/data.sql @@ -0,0 +1,127 @@ +call add_bank('Banque du Sud'); +insert into currency values ('EUR'),('YEN'),('USD'); + +call add_account(3,'EUR'); +call add_account(3,'YEN'); +call add_account(3,'USD'); + +call add_person('Armand','Andreï','1990-01-01'); +call add_person('Pierre','Aronax','1990-01-01'); +call add_person('Christine','Daaé','1990-01-01'); +call add_person('Garance','Dupuis','1990-01-01'); +call add_person('Raoul','de Chagny','1990-01-01'); +call add_person('Érik','Leroux','1990-01-01'); +call add_person('Meg','Giry','1990-01-01'); +call add_person('Tom','Major','1990-01-01'); +call add_person('Ziggy','Stardust','1990-01-01'); +call add_person('Plautine','Lucazeau','1990-01-01'); +call add_person('Tiphaine','Jacob','1990-01-01'); +call add_person('Dorothée','Humbert','1990-01-01'); +call add_person('Morgane','Perez','1990-01-01'); +call add_person('Solenn','Courcoux','1990-01-01'); +call add_person('Fleur','Lemaitre','1990-01-01'); +call add_person('Esteban','Hiro del Sol','1990-01-01'); +call add_person('Théophraste','Longuet','1990-01-01'); +call add_person('Esther','Allary','1990-01-01'); +call add_person('Zia','Esperanza','1990-01-01'); +call add_person('Tao','Mu','1990-01-01'); +call add_person('Meryem','Guclu','1990-01-01'); +call add_person('Kewan','Meyer','1990-01-01'); +call add_person('Süleyman','Keski̇n','1990-01-01'); +call add_person('Aziz','Nazari','1990-01-01'); +call add_person('Juliette','Mwangachuchu','1990-01-01'); +call add_person('Laïla','Mansour','1990-01-01'); +call add_person('Maximilien','Laforêt','1990-01-01'); +call add_person('Cœllyn','Caradowq','1990-01-01'); +call add_person('Hugo','Brabazon','1990-01-01'); +call add_person('Henrietta','Dombrovskaya','1990-01-01'); +call add_person('Wilbur','Whateley','1990-01-01'); +call add_person('Médora','Leigh','1990-01-01'); +call add_person('Benjamin','Breeg','1990-01-01'); +call add_person('Maximilian','Rockatansky','1990-01-01'); +call add_person('Wanda','Gershwitz','1990-01-01'); +call add_person('Reiko','Ikehata','1990-01-01'); +call add_person('Otto','West','1990-01-01'); +call add_person('Ken','Pile','1990-01-01'); +call add_person('Archibald','Leach','1990-01-01'); +call add_person('George','Thomason','1990-01-01'); +call add_person('Wendy','Leach','1990-01-01'); +call add_person('Portia','Leach','1990-01-01'); +call add_person('Zainap','Gashaeva','1990-01-01'); + +call add_account(1,'USD'); +call add_account(2,'EUR'); +call add_account(2,'EUR'); +call add_account(3,'EUR'); +call add_account(4,'EUR'); +call add_account(5,'EUR'); +call add_account(5,'EUR'); +call add_account(6,'EUR'); +call add_account(6,'EUR'); +call add_account(7,'EUR'); +call add_account(8,'EUR'); +call add_account(8,'EUR'); +call add_account(8,'EUR'); +call add_account(9,'USD'); +call add_account(9,'EUR'); +call add_account(9,'EUR'); +call add_account(10,'EUR'); +call add_account(11,'EUR'); +call add_account(12,'EUR'); +call add_account(12,'USD'); +call add_account(13,'USD'); +call add_account(14,'EUR'); +call add_account(14,'USD'); +call add_account(15,'EUR'); +call add_account(16,'EUR'); +call add_account(16,'USD'); +call add_account(17,'EUR'); +call add_account(17,'EUR'); +call add_account(17,'EUR'); +call add_account(18,'EUR'); +call add_account(18,'EUR'); +call add_account(18,'EUR'); +call add_account(19,'EUR'); +call add_account(19,'USD'); +call add_account(20,'EUR'); +call add_account(21,'EUR'); +call add_account(22,'EUR'); +call add_account(23,'EUR'); +call add_account(23,'USD'); +call add_account(24,'EUR'); +call add_account(25,'EUR'); +call add_account(25,'EUR'); +call add_account(25,'EUR'); +call add_account(26,'EUR'); +call add_account(26,'EUR'); +call add_account(27,'EUR'); +call add_account(27,'EUR'); +call add_account(28,'USD'); +call add_account(28,'EUR'); +call add_account(28,'EUR'); +call add_account(29,'EUR'); +call add_account(29,'EUR'); +call add_account(29,'EUR'); +call add_account(30,'EUR'); +call add_account(30,'EUR'); +call add_account(31,'EUR'); +call add_account(32,'EUR'); +call add_account(32,'EUR'); +call add_account(33,'EUR'); +call add_account(34,'EUR'); +call add_account(34,'EUR'); +call add_account(34,'EUR'); +call add_account(35,'EUR'); +call add_account(36,'EUR'); +call add_account(36,'USD'); +call add_account(37,'EUR'); +call add_account(37,'EUR'); +call add_account(37,'USD'); +call add_account(38,'EUR'); +call add_account(38,'USD'); +call add_account(38,'EUR'); +call add_account(39,'EUR'); +call add_account(39,'EUR'); +call add_account(39,'EUR'); +call add_account(40,'EUR'); +call add_account(40,'EUR'); diff --git a/banque/groupe4/data.sql b/banque/groupe4/data.sql new file mode 100644 index 0000000..156ab01 --- /dev/null +++ b/banque/groupe4/data.sql @@ -0,0 +1,50 @@ +call add_bank('Banque de l''Ouest'); +insert into currency values ('EUR'),('YEN'),('USD'); + +call add_account(3,'EUR'); +call add_account(3,'YEN'); +call add_account(3,'USD'); + +call add_person('Martial','Kéclard-Mondésir','1990-01-01'); +call add_person('Joan Marie','Lambert','1990-01-01'); +call add_person('Lucas','Georges','1990-01-01'); +call add_person('Samia','Benahouda','1990-01-01'); +call add_person('Clément','Brenninkmeyer','1990-01-01'); +call add_person('Auguste','Brenninkmeyer','1990-01-01'); +call add_person('Jean-Claude','Dusse','1990-01-01'); +call add_person('Athéna','Adamopoulos','1990-01-01'); +call add_person('Nathalie','Morin','1990-01-01'); +call add_person('Rocco','Marciano','1990-01-01'); +call add_person('Robert','Lespinasse','1990-01-01'); +call add_person('Bernard','Morin','1990-01-01'); +call add_person('Jérôme','Tarayre','1990-01-01'); +call add_person('Gisèle','André','1990-01-01'); +call add_person('André','Bourseault','1990-01-01'); +call add_person('Amara Juliana','Aquilla','1990-01-01'); +call add_person('Miguel','Weissmuller','1990-01-01'); +call add_person('Georges','Pelletier','1990-01-01'); +call add_person('Amélia','Pond','1990-01-01'); +call add_person('Denis Monroe','Parker','1990-01-01'); +call add_person('Samuel Elias','Brett','1990-01-01'); +call add_person('Syphax','Benoukaci','1990-01-01'); +call add_person('Rudolf','Dassler','1990-01-01'); +call add_person('Rebecca','Jorden','1990-01-01'); +call add_person('Jenette','Vasquez','1990-01-01'); +call add_person('Denis','Acquecesse','1990-01-01'); +call add_person('Paige','Nottefound','1990-01-01'); +call add_person('Asenath','Waite','1990-01-01'); +call add_person('Kinnear','Alistair','1990-01-01'); +call add_person('d''Harcourt','Victorine','1990-01-01'); +call add_person('van Meerhaegue','Brigitte','1990-01-01'); +call add_person('Benjamin','Briggs','1990-01-01'); +call add_person('Charlotte','Harlot','1990-01-01'); +call add_person('Lance','Bishop','1990-01-01'); +call add_person('Colette','Ferro','1990-01-01'); +call add_person('Scott','Gorman','1990-01-01'); +call add_person('Alexandre','Apone','1990-01-01'); +call add_person('Timothée','Crowe','1990-01-01'); +call add_person('Daniel','Spunkmeyer','1990-01-01'); +call add_person('Richard','Frost','1990-01-01'); +call add_person('Claudia','Orléans','1990-01-01'); +call add_person('Louis','de Pointe du Lac','1990-01-01'); +call add_person('Paul','Atréides','1990-01-01');