﻿-- Fichier texte encodé en UTF8 with BOM

-- ------------------------------------------------------------------------------------------------------------
-- ------------------------------------------------------------------------------------------------------------
-- MLD : 
-- employes(id, nom, fonction, date_embauche, salaire, commission, id_departement, id_employe_chef(null))
-- departements (id, nom, ville)
-- tache(id, nom_tache, duree_theorique, #id_projet, #id_employe(null))
-- projet(id, nom_projet, date_debut, date_fin)

-- ------------------------------------------------------------------------------------------------------------
-- ------------------------------------------------------------------------------------------------------------
-- Graphe des tables :    

--                 taches
--                 /    \ 
--                /      \ 
--             projets    \ 
--                         0          
--                  r--0> employes       le 0 veut dire que ça peut être null
--             chef |     /   \           
--                  |____/     \        
--                            departements 


-- on a un lien circulaire : on peut multiplier les tables employés   
--                         
--                      employes 
--                      /     \           
--                     /       \        
--        employes-chef        departements 
--             /     \
--            /       \
--  employes-chef     departements-chef


--  les employes qui ne travaille pas dans la même ville que leur chef
--
--                      employes 
--                      /      \           
--                     /        \        
--              employes-chef  departements 
--                   /            \
--                  /            ville
--          departements-chef
--                /
--            ville-chef


-- ------------------------------------------------------------------------------------------------------------
-- ------------------------------------------------------------------------------------------------------------
-- DDL : Création de la BD  : on supprime la database, on la recrée, on l'utilise

-- DDL : create BD
DROP DATABASE if exists BD_employes_departements;
CREATE DATABASE BD_employes_departements;
USE BD_employes_departements;


-- ------------------------------------------------------------------------------------------------------------
-- ------------------------------------------------------------------------------------------------------------
-- DDL : creation des tables

CREATE TABLE employes(
   id integer auto_increment, 
   nom_employe varchar(30) not null,
   fonction varchar(30) not null, 
   date_embauche date not null, -- type date
   salaire integer not null,
   commission integer,
   id_departement integer not null, -- clé étrangère pas obligatoire
   id_employe_chef integer, -- clé étrangère réflexive
   primary key(id)
) engine innodb;

CREATE TABLE departements(
   id integer auto_increment, 
   nom_departement varchar(20) not null,
   ville varchar(20) not null,
   primary key(id)
) engine innodb;

CREATE TABLE projets (
    id integer AUTO_INCREMENT,
    nom_projet varchar(255) NOT NULL,
    date_debut date NOT NULL,
    date_fin date NOT NULL,
    PRIMARY KEY(id)
);

CREATE TABLE taches (
    id integer AUTO_INCREMENT,
    nom_tache varchar(255) NOT NULL,
    duree_theorique integer NOT NULL,  -- Durée théorique en jours
    id_projet integer NOT NULL,  -- clé étrangère pas obligatoire
    id_employe integer, -- clé étrangère
    PRIMARY KEY(id)
);


-- ------------------------------------------------------------------------------------------------------------
-- ------------------------------------------------------------------------------------------------------------
-- DML : insert
INSERT INTO 
employes (id, nom_employe, fonction, date_embauche, salaire, commission, id_departement, id_employe_chef) VALUES
(1, 'KING',   'PRESIDENT', '1981-11-17', 5000, NULL, 10, NULL),
(2, 'BLAKE',  'MANAGER',   '1981-05-1',  2850, NULL, 30, 1),
(3, 'CLARK',  'MANAGER',   '1981-06-9',  2450, NULL, 10, 1),
(4, 'JONES',  'MANAGER',   '1981-04-2',  2975, NULL, 20, 1),
(5, 'ALLEN',  'SALESMAN',  '1981-02-20', 1600,  300, 30, 2),
(6, 'BLAKE',  'SALESMAN',  '1981-02-22', 1250,  500, 30, 2);

-- on fait un insert séparé pour FORD pour pouvoir accéder à son id avec le last_insert_id()
-- et que SMITH ait bien FORD comme chef
INSERT INTO employes VALUES
(NULL, 'FORD',   'ANALYST',   '1981-12-3',  3000, NULL, 20, 4);
INSERT INTO employes VALUES
(NULL, 'SMITH',  'CLERK',     '1980-12-17',  800, NULL, 20, last_insert_id());

INSERT INTO employes VALUES
(NULL, 'JAMES',  'CLERK',     '1981-12-3',   950, NULL, 30, 2),
(NULL, 'MARTIN', 'SALESMAN',  '1981-09-28', 1250, 1400, 30, 2),
(NULL, 'MILLER', 'CLERK',     '1982-01-23', 1300, NULL, 10, 3);

-- on fait un insert séparé pour SCOTT pour pouvoir accéder à son id avec le last_insert_id()
-- et que ADAMS ait bien SCOTT comme chef
INSERT INTO employes VALUES
(NULL, 'SCOTT',  'ANALYST',   '1982-12-09', 3000, NULL, 20, 4);
INSERT INTO employes VALUES
(NULL, 'ADAMS',  'CLERK',     '1983-01-12', 1100, NULL, 20, last_insert_id());

INSERT INTO employes VALUES
(NULL, 'TURNER', 'SALESMAN',  '1981-09-8',  1500,    0, 30, 2);


INSERT INTO 
departements (id, nom_departement, ville) VALUES
(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH',   'DALLAS'),
(30, 'SALES',      'CHICAGO'),
(40, 'OPERATIONS', 'BOSTON');


INSERT INTO 
projets (id, nom_projet, date_debut, date_fin) VALUES
(1, 'Refonte Site Web', '2025-01-01', '2025-06-30'),
(2, 'Développement App Mobile', '2024-01-01', '2024-03-31'),
(3, 'Migration Cloud', '2024-04-01', '2024-12-31');


-- Projet 1 : 'Refonte Site Web' (tâches non affectées pour l'instant)
INSERT INTO taches (nom_tache, duree_theorique, id_projet, id_employe) VALUES
('Analyse des besoins',    15, 1, NULL),  -- Tâche sans employé affecté
('Développement Frontend', 30, 1, NULL),
('Développement Backend',  30, 1, NULL),
('Tests et validation',    10, 1, NULL);

-- Projet 2 : 'Développement App Mobile' 
-- Assignation de tâches à des employés spécifiques
INSERT INTO taches (nom_tache, duree_theorique, id_projet, id_employe) VALUES
('Conception UI/UX',       20, 2, 2),     -- BLAKE (Manager de l'équipe)
('Développement Frontend', 40, 2, 3),     -- CLARK
('Développement Backend',  40, 2, NULL),  -- Tâche sans employé affecté
('Tests et validation',    20, 2, NULL);  

-- Projet 3 : 'Migration Cloud' 
-- Affectation des tâches pour la migration Cloud
INSERT INTO taches (nom_tache, duree_theorique, id_projet, id_employe) VALUES
('Planification et stratégie',  25, 3, 1),  -- KING (PRESIDENT) pour la planification stratégique
('Migration des données',       50, 3, 2),  -- BLAKE
('Migration des services',      50, 3, 3),  -- CLARK
('Vérification post-migration', 15, 3, 4);  -- JONES


-- ------------------------------------------------------------------------------------------------------------
-- ------------------------------------------------------------------------------------------------------------
-- DDL : création des clés étrangères
-- Graphe des tables :    

--                 taches
--                 /    \ 
--                /      \ 
--             projets    \ 
--                         0          
--                  r--0> employes       le 0 veut dire que ça peut être null
--             chef |     /   \           
--                  |____/     \        
--                            departements 

ALTER TABLE taches
ADD FOREIGN KEY (id_projet) 
REFERENCES projets(id);

ALTER TABLE taches
ADD FOREIGN KEY (id_employe) 
REFERENCES employes(id);

ALTER TABLE employes 
ADD FOREIGN KEY (id_departement)
REFERENCES departements(id);

ALTER TABLE employes 
ADD FOREIGN KEY (id_employe_chef)
REFERENCES employes(id);



-- ------------------------------------------------------------------------------------------------------------
-- ------------------------------------------------------------------------------------------------------------
-- DML pour voir : 

-- select * de toutes les tables

SELECT * -- * veut dire toutes les colonnes
FROM employes; -- le FROM c'est toutes les lignes
-- On vérifie que les chefs sont les bons, surtout pour les last_insert_id()

SELECT * 
FROM departements; 

SELECT * 
FROM taches; 

SELECT * 
FROM projets; 


-- count(*)  de toutes les tables
SELECT count(*) as nb_employes
FROM employes; 

SELECT count(*) as nb_departements
FROM departements; 


SELECT count(*) as nb_taches
FROM taches; 

SELECT count(*) as nb_projets
FROM projets; 



-- Une jointure avec left multiples
SELECT 
   t.id id_tache, t.nom_tache, 
   e.id id_e, e.nom_employe, 
   ec.id id_chef, ec.nom_employe nom_employe_chef, 
   dc.id id_departement_chef, dc.nom_departement
FROM taches t
left JOIN employes e ON e.id=t.id_employe
left JOIN employes ec on ec.id = e.id_employe_chef
left JOIN departements dc on dc.id = ec.id_departement;


