timetrack-pro/DATABASE.md
StillHammer fe30e811a3 Initial commit - TimeTrack Pro
- 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>
2025-12-30 10:53:11 +07:00

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