# TimeTrack Pro - Schema Base de Donnees ## Vue d'ensemble ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ tbl_Clients │ │ tbl_Projets │ │ tbl_Temps │ ├─────────────────┤ ├─────────────────┤ ├─────────────────┤ │ ClientID (PK) │──┐ │ ProjetID (PK) │──┐ │ TempsID (PK) │ │ Nom │ │ │ ClientID (FK) │◄─┘ │ ProjetID (FK) │◄─┘ │ Email │ │ │ Nom │ │ Date │ │ Telephone │ └───►│ Description │ │ Duree │ │ Notes │ │ TauxHoraire │ │ Description │ │ DateCreation │ │ Actif │ │ DateCreation │ └─────────────────┘ │ DateCreation │ └─────────────────┘ └─────────────────┘ ``` --- ## Table: tbl_Clients Stocke les informations des clients. | Champ | Type | Taille | Requis | Description | |-------|------|--------|--------|-------------| | ClientID | AutoNumber | Long | PK | Identifiant unique | | Nom | Text | 100 | Oui | Nom du client | | Email | Text | 100 | Non | Adresse email | | Telephone | Text | 20 | Non | Numero de telephone | | Notes | Memo | - | Non | Notes diverses | | DateCreation | DateTime | - | Oui | Date de creation (auto) | ### SQL Creation ```sql CREATE TABLE tbl_Clients ( ClientID AUTOINCREMENT PRIMARY KEY, Nom TEXT(100) NOT NULL, Email TEXT(100), Telephone TEXT(20), Notes MEMO, DateCreation DATETIME DEFAULT Now() ); ``` --- ## Table: tbl_Projets Stocke les projets lies aux clients. | Champ | Type | Taille | Requis | Description | |-------|------|--------|--------|-------------| | ProjetID | AutoNumber | Long | PK | Identifiant unique | | ClientID | Long | - | FK | Reference vers tbl_Clients | | Nom | Text | 100 | Oui | Nom du projet | | Description | Memo | - | Non | Description du projet | | TauxHoraire | Currency | - | Non | Taux horaire en euros | | Actif | Yes/No | - | Oui | Projet actif ou archive | | DateCreation | DateTime | - | Oui | Date de creation (auto) | ### SQL Creation ```sql CREATE TABLE tbl_Projets ( ProjetID AUTOINCREMENT PRIMARY KEY, ClientID LONG NOT NULL, Nom TEXT(100) NOT NULL, Description MEMO, TauxHoraire CURRENCY DEFAULT 0, Actif YESNO DEFAULT True, DateCreation DATETIME DEFAULT Now(), CONSTRAINT FK_Projets_Clients FOREIGN KEY (ClientID) REFERENCES tbl_Clients(ClientID) ); ``` --- ## Table: tbl_Temps Stocke les entrees de temps. | Champ | Type | Taille | Requis | Description | |-------|------|--------|--------|-------------| | TempsID | AutoNumber | Long | PK | Identifiant unique | | ProjetID | Long | - | FK | Reference vers tbl_Projets | | Date | DateTime | - | Oui | Date de l'entree | | Duree | Double | - | Oui | Duree en heures (decimales) | | Description | Memo | - | Non | Description du travail | | DateCreation | DateTime | - | Oui | Date de creation (auto) | ### SQL Creation ```sql CREATE TABLE tbl_Temps ( TempsID AUTOINCREMENT PRIMARY KEY, ProjetID LONG NOT NULL, Date DATETIME NOT NULL, Duree DOUBLE NOT NULL, Description MEMO, DateCreation DATETIME DEFAULT Now(), CONSTRAINT FK_Temps_Projets FOREIGN KEY (ProjetID) REFERENCES tbl_Projets(ProjetID) ); ``` --- ## Requetes Sauvegardees ### qry_TempsByProjet Total des heures par projet. ```sql SELECT p.Nom AS Projet, c.Nom AS Client, SUM(t.Duree) AS TotalHeures, SUM(t.Duree * p.TauxHoraire) AS Montant FROM (tbl_Clients c INNER JOIN tbl_Projets p ON c.ClientID = p.ClientID) INNER JOIN tbl_Temps t ON p.ProjetID = t.ProjetID GROUP BY p.Nom, c.Nom ORDER BY c.Nom, p.Nom; ``` ### qry_TempsByClient Total des heures par client. ```sql SELECT c.Nom AS Client, COUNT(DISTINCT p.ProjetID) AS NbProjets, SUM(t.Duree) AS TotalHeures, SUM(t.Duree * p.TauxHoraire) AS Montant FROM (tbl_Clients c INNER JOIN tbl_Projets p ON c.ClientID = p.ClientID) INNER JOIN tbl_Temps t ON p.ProjetID = t.ProjetID GROUP BY c.Nom ORDER BY c.Nom; ``` ### qry_TempsPeriode Entrees de temps sur une periode (parametree). ```sql SELECT t.Date, c.Nom AS Client, p.Nom AS Projet, t.Duree, t.Description, t.Duree * p.TauxHoraire AS Montant FROM (tbl_Clients c INNER JOIN tbl_Projets p ON c.ClientID = p.ClientID) INNER JOIN tbl_Temps t ON p.ProjetID = t.ProjetID WHERE t.Date BETWEEN [DateDebut] AND [DateFin] ORDER BY t.Date DESC; ``` ### qry_ProjetsActifs Liste des projets actifs avec client. ```sql SELECT p.ProjetID, p.Nom AS Projet, c.Nom AS Client, p.TauxHoraire, p.DateCreation FROM tbl_Clients c INNER JOIN tbl_Projets p ON c.ClientID = p.ClientID WHERE p.Actif = True ORDER BY c.Nom, p.Nom; ``` ### qry_StatsGlobales Statistiques globales pour tableau de bord. ```sql SELECT (SELECT COUNT(*) FROM tbl_Clients) AS NbClients, (SELECT COUNT(*) FROM tbl_Projets WHERE Actif = True) AS NbProjetsActifs, (SELECT SUM(Duree) FROM tbl_Temps WHERE Date >= DateSerial(Year(Date()), Month(Date()), 1)) AS HeuresMoisCourant, (SELECT SUM(Duree) FROM tbl_Temps) AS TotalHeures; ``` --- ## Index Recommandes ```sql -- Index sur les cles etrangeres CREATE INDEX idx_Projets_ClientID ON tbl_Projets (ClientID); CREATE INDEX idx_Temps_ProjetID ON tbl_Temps (ProjetID); -- Index sur les champs de recherche frequents CREATE INDEX idx_Temps_Date ON tbl_Temps (Date); CREATE INDEX idx_Projets_Actif ON tbl_Projets (Actif); ``` --- ## Donnees de Test ```sql -- Clients INSERT INTO tbl_Clients (Nom, Email) VALUES ('Acme Corp', 'contact@acme.com'); INSERT INTO tbl_Clients (Nom, Email) VALUES ('Tech Solutions', 'info@techsol.fr'); INSERT INTO tbl_Clients (Nom, Email) VALUES ('Freelance Direct', 'hello@freelance.io'); -- Projets INSERT INTO tbl_Projets (ClientID, Nom, TauxHoraire, Actif) VALUES (1, 'Site Web', 75, True); INSERT INTO tbl_Projets (ClientID, Nom, TauxHoraire, Actif) VALUES (1, 'Maintenance', 60, True); INSERT INTO tbl_Projets (ClientID, Nom, TauxHoraire, Actif) VALUES (2, 'API Backend', 85, True); INSERT INTO tbl_Projets (ClientID, Nom, TauxHoraire, Actif) VALUES (3, 'Consulting', 100, True); -- Temps INSERT INTO tbl_Temps (ProjetID, Date, Duree, Description) VALUES (1, #2025-01-02#, 3.5, 'Design maquettes'); INSERT INTO tbl_Temps (ProjetID, Date, Duree, Description) VALUES (1, #2025-01-03#, 4.0, 'Integration HTML/CSS'); INSERT INTO tbl_Temps (ProjetID, Date, Duree, Description) VALUES (3, #2025-01-02#, 6.0, 'Developpement endpoints'); INSERT INTO tbl_Temps (ProjetID, Date, Duree, Description) VALUES (4, #2025-01-03#, 2.0, 'Reunion strategie'); ``` --- **Version:** 1.0 **Date:** 2025-12-30