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

7.0 KiB

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

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

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

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.

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.

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).

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.

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.

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

-- 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

-- 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