- Structure projet complete - Schema BDD (3 tables: Clients, Projets, Temps) - 6 modules VBA documentes - Scripts SQL de creation - Plan d'implementation pour agent - Base Access avec tables creees (Phase 1 complete) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
236 lines
7.0 KiB
Markdown
236 lines
7.0 KiB
Markdown
# 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
|