From 5cdf802bba8f522961abc88ebb3f424db7118acc Mon Sep 17 00:00:00 2001 From: medina5 Date: Sun, 2 Nov 2025 16:21:22 +0100 Subject: [PATCH] account --- banque.correction.md | 30 ++++++++++++++++++++ banque.md | 19 +++++++++---- postgresql-entrypoint-initdb.d/01_initdb.sql | 15 ++++++++-- postgresql-entrypoint-initdb.d/02_seed.sql | 2 ++ 4 files changed, 58 insertions(+), 8 deletions(-) diff --git a/banque.correction.md b/banque.correction.md index 4975b3b..b47ca7f 100644 --- a/banque.correction.md +++ b/banque.correction.md @@ -63,6 +63,7 @@ insert into company(id, name, registration_number, created_at) ### Vérification ```sql +create view list_holders as select h.id, h.type, h.created_at, p.firstname || ' ' || p.lastname as person, c.name as company @@ -112,3 +113,32 @@ create trigger trg_check_person_age before insert or update on person for each row execute procedure check_person_age(); ``` + +### 2. Les comptes + +```sql +create table account ( + id bigint primary key generated always as identity, + number text unique not null, + opened_at date not null default current_date, + closed_at date, + balance numeric(18,6) not null default 0 check (balance >= 0) +); +``` + +Chaque compte a un numéro unique. +La contrainte check (balance >= 0) empêche les soldes négatifs. + +```sql +create table account_holder ( + account_id int not null references account(id) on delete cascade, + holder_id int not null references holder(id) on delete cascade, + share numeric(4,3) check (share > 0 and share <= 1), + primary key (account_id, holder_id) +); +``` + +Cette table établit la relation n–n entre account et holder. +La contrainte share assure que les parts sont comprises entre 0 et 1. + +Un compte joint correspond donc à plusieurs lignes dans cette table. diff --git a/banque.md b/banque.md index 4864dfa..eff1973 100644 --- a/banque.md +++ b/banque.md @@ -50,9 +50,9 @@ Supprimer un titulaire, vérifier que cela supprime l'individu ou la société c ### 1.5 Réflexion -- 1. Pourquoi séparer `person` et `company` ? -- 2. Pourquoi ne pas tout mettre dans une seule table holder ? -- 3. Quelle contrainte empêche d’insérer une person sans holder ? +1. Pourquoi séparer `person` et `company` ? +2. Pourquoi ne pas tout mettre dans une seule table holder ? +3. Quelle contrainte empêche d’insérer une person sans holder ? ### 1.6 Pour aller plus loin @@ -60,5 +60,14 @@ La banque souhaite désormais que toute personne titulaire d’un compte ait au ## 2. Les comptes -- Un compte bancaire appartient à un ou plusieurs titulaires (_holders_). -- Chaque compte dispose d’un numéro de compte (_account number_) unique et d’un solde. +- Chaque titulaire peut détenir un ou plusieurs compte. +- Un compte bancaire doit pouvoir appartenir à un ou plusieurs titulaires (compte individuel / compte joint). +- Chaque compte dispose d’un numéro de compte (_account number_) unique, d’un solde, d'une date d'ouverture et une date de clôture. +- Le solde des comptes ne peuvent être négatifs. +- Dans le cas d'un compte joint, les parts de propriété d'un compte doivent pouvoir être précisées. + +### 2.1 Exemple de données + +- Créez un compte individuel pour Françoise Zanetti. +- Ajouter un nouveau titulaire : Justin Hébrard né le 11/03/1993. +- Créez un compte joint pour Françoise et Justin. diff --git a/postgresql-entrypoint-initdb.d/01_initdb.sql b/postgresql-entrypoint-initdb.d/01_initdb.sql index 7f4c8a7..aab2478 100644 --- a/postgresql-entrypoint-initdb.d/01_initdb.sql +++ b/postgresql-entrypoint-initdb.d/01_initdb.sql @@ -348,6 +348,7 @@ create schema bank; -- Générateur de numéro aléatoire -- ---------------------------------------------------------------------- +/* CREATE OR REPLACE FUNCTION bank.rand_account(n integer) RETURNS text AS $$ DECLARE @@ -369,9 +370,10 @@ BEGIN RETURN out; END; $$ LANGUAGE plpgsql; - +*/ -- Devises (Currencies) -- ---------------------------------------------------------------------- +/* create table bank.currency ( code text not null, num4217 integer default null, @@ -416,9 +418,11 @@ alter table only pays_devises alter table only pays_devises add foreign key (devise_code) references bank.currency (code); +*/ -- Taux de change () -- ---------------------------------------------------------------------- +/* CREATE TABLE bank.exchange_rate ( from_currency CHAR(3) references bank.currency(code), to_currency CHAR(3) references bank.currency(code), @@ -467,11 +471,13 @@ BEGIN END $$; DROP table exchange; +*/ -- ---------------------------------------------------------------------- -- Titulaires (Holders) -- ---------------------------------------------------------------------- +/* CREATE TABLE bank.holder ( id bigint primary key generated always as identity, type_titulaire TEXT CHECK (type_titulaire IN ('individu', 'société')) NOT NULL, @@ -515,11 +521,13 @@ CREATE TRIGGER trg_auto_titulaire_morale BEFORE INSERT ON societe FOR EACH ROW EXECUTE FUNCTION auto_titulaire_morale(); +*/ -- ---------------------------------------------------------------------- -- Comptes (Accounts) -- ---------------------------------------------------------------------- +/* create table bank.account ( id bigint primary key generated always as identity, account_number text unique not null, @@ -576,10 +584,11 @@ BEGIN END LOOP; END; $$ LANGUAGE plpgsql; +*/ -- Transactions -- ---------------------------------------------------------------------- - +/* CREATE TABLE bank."transaction" ( id UUID PRIMARY KEY DEFAULT uuidv7(), reference TEXT, @@ -705,7 +714,7 @@ CREATE TRIGGER tr_notify_transaction AFTER INSERT ON bank.transaction FOR EACH ROW EXECUTE FUNCTION notify_transaction(); - +*/ -- ---------------------------------------------------------------------- -- Business Intelligence -- ---------------------------------------------------------------------- diff --git a/postgresql-entrypoint-initdb.d/02_seed.sql b/postgresql-entrypoint-initdb.d/02_seed.sql index e4274cf..e631b04 100644 --- a/postgresql-entrypoint-initdb.d/02_seed.sql +++ b/postgresql-entrypoint-initdb.d/02_seed.sql @@ -16,6 +16,7 @@ truncate table fournisseur; \COPY fournisseur FROM '/tmp/fournisseur.csv' (FORMAT CSV, header, ENCODING 'UTF8'); \COPY produit FROM '/tmp/produits/cereales_petitdejeuner.csv' (FORMAT CSV, header, ENCODING 'UTF8'); +/* \COPY personne(prenom, nom, telephone, ville) FROM '/tmp/personne1.csv' (FORMAT CSV, header, ENCODING 'UTF8'); \COPY societe(societe) FROM '/tmp/societe1.csv' (FORMAT CSV, header, ENCODING 'UTF8'); @@ -25,3 +26,4 @@ SELECT bank.insert_account_random(ARRAY[3]); SELECT bank.insert_account_random(ARRAY[4]); SELECT bank.insert_account_random(ARRAY[5],'USD'); SELECT bank.insert_account_random(ARRAY[6,11]); +*/