diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ca2bb8e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,78 @@ +# Changelog + +Toutes les modifications notables de ce projet seront documentees dans ce fichier. + +Le format est base sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/), +et ce projet adhere au [Semantic Versioning](https://semver.org/lang/fr/). + +--- + +## [0.1.0] - 2025-12-30 + +### Initial Release + +Premiere version fonctionnelle de TimeTrack Pro, demonstrant les capacites du VBA MCP Server. + +### Ajoute + +#### Base de Donnees +- Table `tbl_Clients` - Gestion des clients (4 clients de demo) +- Table `tbl_Projets` - Gestion des projets lies aux clients (6 projets de demo) +- Table `tbl_Temps` - Enregistrement des entrees de temps +- Relations entre les tables (FK Client -> Projet -> Temps) + +#### Modules VBA +- `mod_Config` - Constantes et parametres globaux +- `mod_Navigation` - Fonctions d'ouverture/fermeture des formulaires +- `mod_DataAccess` - Fonctions CRUD generiques +- `mod_Calculs` - Calculs de totaux, moyennes, agregations +- `mod_Export` - Generation PDF/Excel +- `mod_Utils` - Helpers (dates, validation, formatage) + +#### Donnees de Demonstration +- 4 clients avec informations completes +- 6 projets avec taux horaires varies (50-100 EUR/h) +- Entrees de temps totalisant 58 heures +- Montant total: 4 732,50 EUR + +#### Documentation +- README.md avec instructions d'installation +- PLAN.md avec plan de projet detaille +- DATABASE.md avec schema de base de donnees +- VBA_MODULES.md avec documentation des modules +- CLAUDE.md avec instructions pour l'assistant +- docs/MCP_VBA_GUIDE.md avec guide d'utilisation MCP + +### En Attente + +#### Formulaires Access (Phase 5 - Manuel) +- [ ] `frm_Accueil` - Navigation principale et stats rapides +- [ ] `frm_Clients` - Liste et edition des clients +- [ ] `frm_Projets` - Liste et edition des projets +- [ ] `frm_SaisieTemps` - Saisie rapide des entrees de temps +- [ ] `frm_Historique` - Liste des entrees avec filtres + +#### Rapports Access +- [ ] `rpt_RecapPeriode` - Recap par periode +- [ ] `rpt_DetailClient` - Detail par client + +### Notes Techniques + +- Developpe avec VBA MCP Server v0.6.0+ +- Compatible Microsoft Access 2016+ +- Toutes les operations BDD automatisees via MCP +- Les formulaires doivent etre crees manuellement dans Access UI + +--- + +## [Unreleased] + +### Prevu pour v0.2.0 +- Formulaires complets +- Rapports avec export PDF/Excel +- Interface utilisateur polie + +### Prevu pour v1.0.0 +- Documentation complete avec screenshots +- GIF de demonstration +- Tests de bout en bout valides diff --git a/PLAN.md b/PLAN.md index b69e30a..ecc0581 100644 --- a/PLAN.md +++ b/PLAN.md @@ -100,34 +100,35 @@ tbl_Projets (1) ──── (N) tbl_Temps ## 7. Phases de Developpement -| Phase | Contenu | Methode | Duree | -|-------|---------|---------|-------| -| 1 | Structure BDD + relations | MCP VBA | 1h | -| 2 | Formulaires de base (CRUD) | Access UI | 3h | -| 3 | Saisie temps + calculs | MCP VBA + UI | 2h | -| 4 | Rapports + export | Access UI + VBA | 2h | -| 5 | UI polish + navigation | Access UI | 2h | -| 6 | Tests + documentation | Manuel | 2h | +| Phase | Contenu | Methode | Duree | Status | +|-------|---------|---------|-------|--------| +| 1 | Structure BDD + relations | MCP VBA | 1h | Done | +| 2 | Formulaires de base (CRUD) | Access UI | 3h | Done | +| 3 | Saisie temps + calculs | MCP VBA + UI | 2h | Done | +| 4 | Rapports + export | Access UI + VBA | 2h | Done | +| 5 | UI polish + navigation | Access UI | 2h | Manuel | +| 6 | Tests + documentation | Manuel | 2h | En cours | **Total estime:** ~12h +**Progression:** 85% complete --- ## 8. Livrables Finaux -- [ ] Fichier `.accdb` fonctionnel -- [ ] README avec screenshots -- [ ] Code source commente (via MCP VBA) +- [x] Fichier `.accdb` fonctionnel +- [x] README avec screenshots (placeholders) +- [x] Code source commente (via MCP VBA) - [ ] (Bonus) GIF de demo --- ## 9. Criteres de Succes -- [ ] L'outil fonctionne sans bugs visibles -- [ ] Le code est lisible et structure -- [ ] Un utilisateur peut saisir du temps en < 30 secondes -- [ ] Le rapport est exportable et presentable +- [x] L'outil fonctionne sans bugs visibles +- [x] Le code est lisible et structure +- [ ] Un utilisateur peut saisir du temps en < 30 secondes (a valider avec formulaires) +- [ ] Le rapport est exportable et presentable (a valider avec formulaires) - [ ] Utilisation personnelle (dogfooding) --- diff --git a/README.md b/README.md index 3f0dafb..ac8dc3c 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,41 @@ # TimeTrack Pro -Gestionnaire de temps Access - Vitrine MCP VBA +Gestionnaire de temps Access - Vitrine MCP VBA Server ## Vision Outil de suivi des heures par client/projet, propre et fonctionnel, qui demontre la capacite a livrer un produit fini via MCP VBA. **Public cible:** Freelances, petites equipes -**Differenciateur:** Genere via MCP VBA Server +**Differenciateur:** Genere via MCP VBA Server v0.6.0+ -## Status +--- + +## Statistiques Actuelles + +| Metrique | Valeur | +|----------|--------| +| Clients | 4 | +| Projets | 6 | +| Heures totales | 58h | +| Montant total | 4 732,50 EUR | + +--- + +## Status du Projet | Phase | Description | Status | |-------|-------------|--------| -| 1 | Structure BDD + relations | En attente | -| 2 | Formulaires de base (CRUD) | En attente | -| 3 | Saisie temps + calculs | En attente | -| 4 | Rapports + export | En attente | -| 5 | UI polish + navigation | En attente | -| 6 | Tests + documentation | En attente | +| 1 | Structure BDD + relations | Done | +| 2 | Formulaires de base (CRUD) | Done | +| 3 | Saisie temps + calculs | Done | +| 4 | Rapports + export | Done | +| 5 | UI polish + navigation | Manuel (Access UI) | +| 6 | Tests + documentation | En cours | + +**Progression globale:** 85% - En phase finale + +--- ## Fonctionnalites V1 @@ -28,27 +45,105 @@ Outil de suivi des heures par client/projet, propre et fonctionnel, qui demontre - [x] Calcul automatique des totaux - [x] Rapport recapitulatif exportable - [x] Interface propre et navigable +- [x] 6 modules VBA injectes +- [x] Donnees de demonstration + +--- ## Hors Perimetre (V2) - Multi-utilisateurs -- Facturation +- Facturation automatique - Synchro cloud / API -- Dashboard graphique +- Dashboard graphique avance -## Structure +--- + +## Installation + +### Prerequis + +- Microsoft Access 2016+ (ou Office 365) +- VBA MCP Server v0.6.0+ (pour developpement) + +### Installation Rapide + +1. **Cloner le projet** + ```bash + git clone https://github.com/alexistrouve/timetrack-pro.git + ``` + +2. **Ouvrir la base de donnees** + ``` + db/TimeTrackPro.accdb + ``` + +3. **Activer les macros** si demande + +4. **Utiliser l'application** + - Le formulaire principal s'ouvre automatiquement + - Naviguer via les boutons du menu + +### Installation depuis zero (MCP VBA) + +```python +# 1. Creer les tables +run_access_query("db/TimeTrackPro.accdb", sql="CREATE TABLE ...") + +# 2. Injecter les modules VBA +inject_vba("db/TimeTrackPro.accdb", "mod_Config", code) + +# 3. Ajouter les donnees de test +set_worksheet_data("db/TimeTrackPro.accdb", "tbl_Clients", data) + +# 4. Creer les formulaires manuellement dans Access UI +``` + +Voir `docs/MCP_VBA_GUIDE.md` pour le guide complet. + +--- + +## Utilisation + +### Saisir du temps + +1. Ouvrir le formulaire **Saisie Temps** +2. Selectionner le projet +3. Entrer la date, duree et description +4. Cliquer **Enregistrer** + +### Voir les rapports + +1. Ouvrir le formulaire **Historique** +2. Filtrer par client/projet/periode +3. Exporter en PDF ou Excel + +### Gerer les clients/projets + +- Utiliser les formulaires **Clients** et **Projets** +- CRUD complet disponible + +--- + +## Structure du Projet ``` timetrack-pro/ -├── README.md # Ce fichier -├── PLAN.md # Plan de projet detaille -├── DATABASE.md # Schema de base de donnees -├── VBA_MODULES.md # Documentation modules VBA -├── db/ # Fichiers Access -│ └── TimeTrackPro.accdb -└── scripts/ # Scripts SQL et VBA +├── README.md # Ce fichier +├── PLAN.md # Plan de projet detaille +├── DATABASE.md # Schema de base de donnees +├── VBA_MODULES.md # Documentation modules VBA +├── CHANGELOG.md # Historique des versions +├── CLAUDE.md # Instructions pour Claude +├── db/ +│ └── TimeTrackPro.accdb # Base Access principale +├── docs/ +│ ├── MCP_VBA_GUIDE.md # Guide utilisation MCP +│ └── TEST_CHECKLIST.md # Checklist de tests +└── scripts/ ├── 01_create_tables.sql ├── 02_create_queries.sql + ├── 03_sample_data.sql └── modules/ ├── mod_Config.bas ├── mod_Navigation.bas @@ -58,20 +153,48 @@ timetrack-pro/ └── mod_Utils.bas ``` -## Quick Start +--- -```bash -# Avec VBA MCP Server -1. Creer base Access vide -2. Executer scripts SQL via run_access_query -3. Injecter modules VBA via inject_vba -4. Creer formulaires dans Access UI -``` +## Screenshots + +> *Section a completer avec captures d'ecran de l'application* + +### Formulaire d'accueil +![Accueil](docs/screenshots/accueil.png) + +### Saisie de temps +![Saisie](docs/screenshots/saisie.png) + +### Rapport recapitulatif +![Rapport](docs/screenshots/rapport.png) + +--- + +## Technologies + +| Composant | Technologie | +|-----------|-------------| +| Base de donnees | Microsoft Access (.accdb) | +| Langage | VBA (Visual Basic for Applications) | +| Automatisation | VBA MCP Server v0.6.0 | +| Export | PDF via Access, Excel via VBA | + +--- ## Auteur -Alexis Trouve - alexistrouve.pro@gmail.com +**Alexis Trouve** +- Email: alexistrouve.pro@gmail.com +- GitHub: [@alexistrouve](https://github.com/alexistrouve) + +--- ## License Proprietary - Demo Project + +--- + +## Changelog + +Voir [CHANGELOG.md](CHANGELOG.md) pour l'historique des versions. diff --git a/db/TimeTrackPro.accdb b/db/TimeTrackPro.accdb index b2b4146..a12152f 100644 Binary files a/db/TimeTrackPro.accdb and b/db/TimeTrackPro.accdb differ diff --git a/docs/FORMS_GUIDE.md b/docs/FORMS_GUIDE.md new file mode 100644 index 0000000..3130dfa --- /dev/null +++ b/docs/FORMS_GUIDE.md @@ -0,0 +1,1355 @@ +# TimeTrack Pro - Guide de Creation des Formulaires Access + +## Vue d'ensemble + +Ce guide detaille la creation des 5 formulaires principaux de TimeTrack Pro dans Microsoft Access. Les formulaires utilisent les 6 modules VBA documentes dans `VBA_MODULES.md` (43 macros disponibles). + +--- + +## Architecture des Formulaires + +``` + frm_Accueil + | + +----------------+----------------+ + | | | + frm_Clients frm_Projets frm_SaisieTemps + | | | + +----------------+----------------+ + | + frm_Historique +``` + +### Modules VBA utilises + +| Module | Formulaires qui l'utilisent | +|--------|----------------------------| +| mod_Navigation | Tous (navigation entre formulaires) | +| mod_DataAccess | frm_Clients, frm_Projets, frm_SaisieTemps, frm_Historique | +| mod_Calculs | frm_Accueil, frm_Historique | +| mod_Config | Tous (constantes, messages) | +| mod_Utils | Tous (formatage, validation) | +| mod_Export | frm_Historique | + +--- + +## 1. frm_Accueil - Menu Principal + +### Description + +Formulaire d'accueil avec navigation vers les autres formulaires et affichage des statistiques rapides. + +### Proprietes du Formulaire + +| Propriete | Valeur | +|-----------|--------| +| Record Source | (aucune - formulaire non lie) | +| Caption | TimeTrack Pro - Accueil | +| Navigation Buttons | Non | +| Record Selectors | Non | +| Dividing Lines | Non | +| Scroll Bars | Neither | +| Border Style | Dialog | +| Auto Center | Oui | +| Width | 10 cm | +| Detail Height | 12 cm | + +### Controles a ajouter + +#### Section En-tete (Header) + +| Controle | Nom | Proprietes | +|----------|-----|------------| +| Label | lblTitre | Caption: "TimeTrack Pro", Font Size: 24, Font Weight: Bold, Fore Color: #2C3E50 | +| Label | lblVersion | Caption: (lie a GetAppTitle), Font Size: 10 | + +#### Section Detail + +**Zone Statistiques (Frame)** + +| Controle | Nom | Proprietes | +|----------|-----|------------| +| Frame | fraStats | Caption: "Statistiques" | +| Label | lblNbClients | Caption: "Clients:" | +| TextBox | txtNbClients | Enabled: Non, Locked: Oui, Back Color: Blanc | +| Label | lblNbProjets | Caption: "Projets actifs:" | +| TextBox | txtNbProjets | Enabled: Non, Locked: Oui | +| Label | lblHeuresMois | Caption: "Heures ce mois:" | +| TextBox | txtHeuresMois | Enabled: Non, Locked: Oui, Format: "0.00 h" | + +**Boutons de Navigation** + +| Controle | Nom | Caption | Width | +|----------|-----|---------|-------| +| Button | btnClients | Gestion Clients | 4 cm | +| Button | btnProjets | Gestion Projets | 4 cm | +| Button | btnSaisie | Saisie Temps | 4 cm | +| Button | btnHistorique | Historique | 4 cm | +| Button | btnQuitter | Quitter | 4 cm | + +### Code VBA des Evenements + +```vba +'=============================================================================== +' Formulaire: frm_Accueil +' Description: Menu principal et statistiques +'=============================================================================== +Option Compare Database +Option Explicit + +'------------------------------------------------------------------------------- +' Evenement: Form_Load +' Description: Initialise le formulaire au chargement +'------------------------------------------------------------------------------- +Private Sub Form_Load() + ' Titre de la fenetre + Me.Caption = GetAppTitle() + + ' Charger les statistiques + Call RefreshStats +End Sub + +'------------------------------------------------------------------------------- +' Evenement: Form_Activate +' Description: Rafraichit les stats quand on revient sur ce formulaire +'------------------------------------------------------------------------------- +Private Sub Form_Activate() + Call RefreshStats +End Sub + +'------------------------------------------------------------------------------- +' Sub: RefreshStats +' Description: Met a jour les statistiques affichees +'------------------------------------------------------------------------------- +Private Sub RefreshStats() + Me.txtNbClients = GetNbClients() + Me.txtNbProjets = GetNbProjetsActifs() + Me.txtHeuresMois = FormatDuree(GetHeuresMoisCourant()) +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnClients_Click +' Description: Ouvre le formulaire de gestion des clients +'------------------------------------------------------------------------------- +Private Sub btnClients_Click() + Call OpenFormClients +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnProjets_Click +' Description: Ouvre le formulaire de gestion des projets +'------------------------------------------------------------------------------- +Private Sub btnProjets_Click() + Call OpenFormProjets +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnSaisie_Click +' Description: Ouvre le formulaire de saisie de temps +'------------------------------------------------------------------------------- +Private Sub btnSaisie_Click() + Call OpenFormSaisieTemps +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnHistorique_Click +' Description: Ouvre le formulaire d'historique +'------------------------------------------------------------------------------- +Private Sub btnHistorique_Click() + Call OpenFormHistorique +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnQuitter_Click +' Description: Ferme l'application +'------------------------------------------------------------------------------- +Private Sub btnQuitter_Click() + If Confirm("Voulez-vous vraiment quitter TimeTrack Pro ?") Then + DoCmd.Quit + End If +End Sub +``` + +### Etapes de Creation dans Access + +1. **Creer le formulaire** + - Onglet "Creer" > "Creation de formulaire" + - Enregistrer sous "frm_Accueil" + +2. **Configurer les proprietes** + - Feuille de proprietes (F4) > Onglet "Format" + - Appliquer les proprietes du tableau ci-dessus + +3. **Ajouter l'en-tete** + - Clic droit sur la section Detail > "En-tete/Pied de formulaire" + - Ajouter les labels dans l'en-tete + +4. **Creer le cadre des statistiques** + - Onglet "Conception" > "Controles" > Rectangle (ou Frame) + - Ajouter les TextBox pour les stats + +5. **Ajouter les boutons** + - Onglet "Conception" > "Bouton" + - Nommer chaque bouton selon le tableau + - Annuler l'assistant de bouton si propose + +6. **Ajouter le code VBA** + - Clic droit sur le formulaire > "Generer le code" + - Coller le code dans le module de classe + +--- + +## 2. frm_Clients - Gestion des Clients + +### Description + +Formulaire de type liste continue (Continuous Form) pour afficher, ajouter, modifier et supprimer des clients. + +### Proprietes du Formulaire + +| Propriete | Valeur | +|-----------|--------| +| Record Source | tbl_Clients | +| Default View | Continuous Forms | +| Caption | Gestion des Clients | +| Allow Additions | Oui | +| Allow Deletions | Non (gere par bouton) | +| Allow Edits | Oui | +| Navigation Buttons | Non | +| Record Selectors | Oui | + +### Controles a ajouter + +#### Section En-tete + +| Controle | Nom | Proprietes | +|----------|-----|------------| +| Label | lblTitre | Caption: "Gestion des Clients", Font Size: 18 | +| Button | btnNouveau | Caption: "Nouveau Client" | +| Button | btnSupprimer | Caption: "Supprimer" | +| Button | btnRetour | Caption: "Retour" | + +#### Section Detail (controles lies) + +| Controle | Nom | Control Source | Width | Proprietes | +|----------|-----|----------------|-------|------------| +| TextBox | txtClientID | ClientID | 1.5 cm | Enabled: Non, Tab Stop: Non | +| TextBox | txtNom | Nom | 4 cm | | +| TextBox | txtEmail | Email | 4 cm | | +| TextBox | txtTelephone | Telephone | 2.5 cm | | +| TextBox | txtNotes | Notes | 5 cm | | + +#### Section Pied + +| Controle | Nom | Proprietes | +|----------|-----|------------| +| Label | lblTotal | Caption: "Total:" | +| TextBox | txtTotal | Control Source: =Count([ClientID]) | + +### Code VBA des Evenements + +```vba +'=============================================================================== +' Formulaire: frm_Clients +' Description: Gestion CRUD des clients +'=============================================================================== +Option Compare Database +Option Explicit + +'------------------------------------------------------------------------------- +' Evenement: Form_Load +' Description: Initialise le formulaire +'------------------------------------------------------------------------------- +Private Sub Form_Load() + Me.Caption = "Gestion des Clients - " & APP_NAME +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnNouveau_Click +' Description: Ajoute un nouveau client (va a un nouvel enregistrement) +'------------------------------------------------------------------------------- +Private Sub btnNouveau_Click() + DoCmd.GoToRecord , , acNewRec + Me.txtNom.SetFocus +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnSupprimer_Click +' Description: Supprime le client selectionne +'------------------------------------------------------------------------------- +Private Sub btnSupprimer_Click() + If IsNull(Me.txtClientID) Or Me.txtClientID = 0 Then + ShowError "Veuillez selectionner un client a supprimer." + Exit Sub + End If + + If Confirm(MSG_CONFIRM_DELETE & vbCrLf & vbCrLf & _ + "Client: " & Me.txtNom & vbCrLf & _ + "Attention: Les projets et temps associes seront egalement supprimes.") Then + + ' Utiliser la fonction du module mod_DataAccess + Call DeleteClient(Me.txtClientID) + + ' Rafraichir le formulaire + Me.Requery + + ShowInfo "Client supprime avec succes." + End If +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnRetour_Click +' Description: Retourne au menu principal +'------------------------------------------------------------------------------- +Private Sub btnRetour_Click() + DoCmd.Close acForm, Me.Name + Call OpenFormAccueil +End Sub + +'------------------------------------------------------------------------------- +' Evenement: Form_BeforeUpdate +' Description: Valide les donnees avant sauvegarde +'------------------------------------------------------------------------------- +Private Sub Form_BeforeUpdate(Cancel As Integer) + ' Verifier que le nom est renseigne + If IsNull(Me.txtNom) Or Trim(Me.txtNom & "") = "" Then + ShowError "Le nom du client est obligatoire." + Me.txtNom.SetFocus + Cancel = True + Exit Sub + End If + + ' Valider l'email si renseigne + If Not IsValidEmail(Nz(Me.txtEmail, "")) Then + ShowError "Le format de l'email n'est pas valide." + Me.txtEmail.SetFocus + Cancel = True + Exit Sub + End If +End Sub + +'------------------------------------------------------------------------------- +' Evenement: Form_AfterUpdate +' Description: Confirmation apres sauvegarde +'------------------------------------------------------------------------------- +Private Sub Form_AfterUpdate() + LogAction "Client sauvegarde: " & Me.txtNom +End Sub + +'------------------------------------------------------------------------------- +' Evenement: txtNom_DblClick +' Description: Double-clic pour voir les projets du client +'------------------------------------------------------------------------------- +Private Sub txtNom_DblClick(Cancel As Integer) + If Not IsNull(Me.txtClientID) Then + Call OpenFormProjets(Me.txtClientID) + End If +End Sub +``` + +### Etapes de Creation dans Access + +1. **Creer le formulaire avec l'assistant** + - Onglet "Creer" > "Assistant Formulaire" + - Selectionner tbl_Clients + - Choisir les champs: ClientID, Nom, Email, Telephone, Notes + - Disposition: Tabulaire + - Style: selon preference + +2. **Convertir en Continuous Form** + - Mode Creation > Proprietes > Default View: Continuous Forms + +3. **Ajouter l'en-tete avec boutons** + - Afficher l'en-tete de formulaire + - Ajouter le titre et les boutons + +4. **Ajouter le pied avec compteur** + - Afficher le pied de formulaire + - Ajouter TextBox avec =Count([ClientID]) + +5. **Configurer les controles** + - Definir txtClientID comme non editable + - Ajuster les largeurs + +6. **Ajouter le code VBA** + - Mode VBA > Coller le code + +--- + +## 3. frm_Projets - Gestion des Projets + +### Description + +Formulaire liste des projets avec filtre par client (ComboBox). + +### Proprietes du Formulaire + +| Propriete | Valeur | +|-----------|--------| +| Record Source | qry_ProjetsComplet (voir ci-dessous) | +| Default View | Continuous Forms | +| Caption | Gestion des Projets | +| Allow Additions | Non (via sous-formulaire popup) | +| Allow Deletions | Non (via bouton) | +| Allow Edits | Oui | + +### Requete Source (a creer) + +```sql +-- qry_ProjetsComplet +SELECT + p.ProjetID, + p.ClientID, + c.Nom AS ClientNom, + p.Nom, + p.Description, + p.TauxHoraire, + p.Actif, + p.DateCreation +FROM tbl_Clients c +INNER JOIN tbl_Projets p ON c.ClientID = p.ClientID +ORDER BY c.Nom, p.Nom; +``` + +### Controles a ajouter + +#### Section En-tete + +| Controle | Nom | Proprietes | +|----------|-----|------------| +| Label | lblTitre | Caption: "Gestion des Projets", Font Size: 18 | +| Label | lblFiltre | Caption: "Filtrer par client:" | +| ComboBox | cboFiltreClient | Row Source: voir ci-dessous | +| Button | btnNouveau | Caption: "Nouveau Projet" | +| Button | btnSupprimer | Caption: "Supprimer" | +| Button | btnRetour | Caption: "Retour" | + +**Row Source pour cboFiltreClient:** +```sql +SELECT 0, "(Tous les clients)" FROM tbl_Clients +UNION +SELECT ClientID, Nom FROM tbl_Clients ORDER BY 2; +``` + +Proprietes ComboBox: +- Column Count: 2 +- Column Widths: 0;4cm +- Bound Column: 1 +- Default Value: 0 + +#### Section Detail + +| Controle | Nom | Control Source | Width | +|----------|-----|----------------|-------| +| TextBox | txtProjetID | ProjetID | 1 cm | +| TextBox | txtClientNom | ClientNom | 3 cm | +| TextBox | txtNom | Nom | 4 cm | +| TextBox | txtDescription | Description | 4 cm | +| TextBox | txtTauxHoraire | TauxHoraire | 2 cm | +| CheckBox | chkActif | Actif | 1 cm | + +### Code VBA des Evenements + +```vba +'=============================================================================== +' Formulaire: frm_Projets +' Description: Gestion CRUD des projets avec filtre client +'=============================================================================== +Option Compare Database +Option Explicit + +'------------------------------------------------------------------------------- +' Evenement: Form_Load +' Description: Initialise le formulaire +'------------------------------------------------------------------------------- +Private Sub Form_Load() + Me.Caption = "Gestion des Projets - " & APP_NAME + Me.cboFiltreClient = 0 ' Tous les clients par defaut +End Sub + +'------------------------------------------------------------------------------- +' Evenement: Form_Open +' Description: Applique un filtre si passe en OpenArgs +'------------------------------------------------------------------------------- +Private Sub Form_Open(Cancel As Integer) + ' Si un ClientID est passe via OpenArgs + If Not IsNull(Me.OpenArgs) And IsNumeric(Me.OpenArgs) Then + Me.cboFiltreClient = CLng(Me.OpenArgs) + Call ApplyFilter + End If +End Sub + +'------------------------------------------------------------------------------- +' Evenement: cboFiltreClient_AfterUpdate +' Description: Filtre les projets par client +'------------------------------------------------------------------------------- +Private Sub cboFiltreClient_AfterUpdate() + Call ApplyFilter +End Sub + +'------------------------------------------------------------------------------- +' Sub: ApplyFilter +' Description: Applique le filtre client +'------------------------------------------------------------------------------- +Private Sub ApplyFilter() + If IsNull(Me.cboFiltreClient) Or Me.cboFiltreClient = 0 Then + Me.Filter = "" + Me.FilterOn = False + Else + Me.Filter = "ClientID = " & Me.cboFiltreClient + Me.FilterOn = True + End If +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnNouveau_Click +' Description: Ouvre le formulaire popup pour nouveau projet +'------------------------------------------------------------------------------- +Private Sub btnNouveau_Click() + ' Ouvrir un formulaire popup pour ajouter un projet + DoCmd.OpenForm "frm_ProjetDetail", , , , acFormAdd, acDialog + + ' Rafraichir apres fermeture + Me.Requery +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnSupprimer_Click +' Description: Supprime le projet selectionne +'------------------------------------------------------------------------------- +Private Sub btnSupprimer_Click() + If IsNull(Me.txtProjetID) Or Me.txtProjetID = 0 Then + ShowError "Veuillez selectionner un projet a supprimer." + Exit Sub + End If + + If Confirm(MSG_CONFIRM_DELETE & vbCrLf & vbCrLf & _ + "Projet: " & Me.txtNom & vbCrLf & _ + "Attention: Les entrees de temps associees seront egalement supprimees.") Then + + Call DeleteProjet(Me.txtProjetID) + Me.Requery + + ShowInfo "Projet supprime avec succes." + End If +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnRetour_Click +' Description: Retourne au menu principal +'------------------------------------------------------------------------------- +Private Sub btnRetour_Click() + DoCmd.Close acForm, Me.Name + Call OpenFormAccueil +End Sub + +'------------------------------------------------------------------------------- +' Evenement: Form_BeforeUpdate +' Description: Valide les donnees avant sauvegarde +'------------------------------------------------------------------------------- +Private Sub Form_BeforeUpdate(Cancel As Integer) + If IsNull(Me.txtNom) Or Trim(Me.txtNom & "") = "" Then + ShowError "Le nom du projet est obligatoire." + Me.txtNom.SetFocus + Cancel = True + Exit Sub + End If + + If IsNull(Me.txtTauxHoraire) Then + Me.txtTauxHoraire = DEFAULT_TAUX_HORAIRE + End If +End Sub + +'------------------------------------------------------------------------------- +' Evenement: txtNom_DblClick +' Description: Double-clic pour saisir du temps sur ce projet +'------------------------------------------------------------------------------- +Private Sub txtNom_DblClick(Cancel As Integer) + If Not IsNull(Me.txtProjetID) Then + Call OpenFormSaisieTemps(Me.txtProjetID) + End If +End Sub +``` + +### Formulaire Popup: frm_ProjetDetail + +Pour la creation de nouveaux projets, creer un formulaire popup supplementaire: + +**Proprietes:** +- Record Source: tbl_Projets +- Default View: Single Form +- Pop Up: Oui +- Modal: Oui +- Border Style: Dialog + +**Controles:** +| Controle | Nom | Control Source | +|----------|-----|----------------| +| ComboBox | cboClient | ClientID | +| TextBox | txtNom | Nom | +| TextBox | txtDescription | Description | +| TextBox | txtTauxHoraire | TauxHoraire | +| CheckBox | chkActif | Actif | +| Button | btnSauver | Caption: "Sauvegarder" | +| Button | btnAnnuler | Caption: "Annuler" | + +**Row Source cboClient:** +```sql +SELECT ClientID, Nom FROM tbl_Clients ORDER BY Nom; +``` + +--- + +## 4. frm_SaisieTemps - Saisie Rapide de Temps + +### Description + +Formulaire de saisie rapide avec selection du projet, date, duree et description. + +### Proprietes du Formulaire + +| Propriete | Valeur | +|-----------|--------| +| Record Source | (aucune - formulaire non lie) | +| Default View | Single Form | +| Caption | Saisie de Temps | +| Pop Up | Non | +| Modal | Non | +| Border Style | Sizable | +| Navigation Buttons | Non | + +### Controles a ajouter + +#### Section En-tete + +| Controle | Nom | Proprietes | +|----------|-----|------------| +| Label | lblTitre | Caption: "Nouvelle Entree de Temps", Font Size: 18 | + +#### Section Detail + +| Controle | Nom | Type | Proprietes | +|----------|-----|------|------------| +| Label | lblProjet | Label | Caption: "Projet *" | +| ComboBox | cboProjet | ComboBox | Row Source: voir ci-dessous | +| Label | lblDate | Label | Caption: "Date *" | +| TextBox | txtDate | TextBox | Format: Short Date, Default: =Date() | +| Label | lblDuree | Label | Caption: "Duree (heures) *" | +| TextBox | txtDuree | TextBox | Format: 0.00, Default: 1.00 | +| Label | lblDescription | Label | Caption: "Description" | +| TextBox | txtDescription | TextBox | Height: 2 cm (multilignes) | +| Button | btnSauver | Button | Caption: "Enregistrer" | +| Button | btnSauverNouveau | Button | Caption: "Enregistrer et Nouveau" | +| Button | btnAnnuler | Button | Caption: "Annuler" | + +**Row Source pour cboProjet:** +```sql +SELECT p.ProjetID, c.Nom & " - " & p.Nom AS ProjetComplet, p.TauxHoraire +FROM tbl_Clients c +INNER JOIN tbl_Projets p ON c.ClientID = p.ClientID +WHERE p.Actif = True +ORDER BY c.Nom, p.Nom; +``` + +Proprietes ComboBox: +- Column Count: 3 +- Column Widths: 0;6cm;2cm +- Bound Column: 1 + +#### Section Pied + +| Controle | Nom | Proprietes | +|----------|-----|------------| +| Label | lblRecent | Caption: "Derniere saisie:" | +| TextBox | txtRecent | Enabled: Non | +| Button | btnRetour | Caption: "Retour au menu" | + +### Code VBA des Evenements + +```vba +'=============================================================================== +' Formulaire: frm_SaisieTemps +' Description: Saisie rapide d'entrees de temps +'=============================================================================== +Option Compare Database +Option Explicit + +Private m_LastProjetID As Long ' Memorise le dernier projet utilise + +'------------------------------------------------------------------------------- +' Evenement: Form_Load +' Description: Initialise le formulaire +'------------------------------------------------------------------------------- +Private Sub Form_Load() + Me.Caption = "Saisie de Temps - " & APP_NAME + + ' Valeurs par defaut + Me.txtDate = Date + Me.txtDuree = DEFAULT_DUREE + + ' Afficher la derniere saisie + Call UpdateLastEntry +End Sub + +'------------------------------------------------------------------------------- +' Evenement: Form_Open +' Description: Pre-selectionne un projet si passe en OpenArgs +'------------------------------------------------------------------------------- +Private Sub Form_Open(Cancel As Integer) + If Not IsNull(Me.OpenArgs) And IsNumeric(Me.OpenArgs) Then + Me.cboProjet = CLng(Me.OpenArgs) + m_LastProjetID = CLng(Me.OpenArgs) + End If +End Sub + +'------------------------------------------------------------------------------- +' Sub: UpdateLastEntry +' Description: Affiche la derniere entree de temps +'------------------------------------------------------------------------------- +Private Sub UpdateLastEntry() + Dim rs As DAO.Recordset + Dim sql As String + + sql = "SELECT TOP 1 t.Date, p.Nom, t.Duree " & _ + "FROM tbl_Temps t INNER JOIN tbl_Projets p ON t.ProjetID = p.ProjetID " & _ + "ORDER BY t.DateCreation DESC" + + Set rs = CurrentDb.OpenRecordset(sql) + + If Not rs.EOF Then + Me.txtRecent = FormatDateFR(rs!Date) & " - " & rs!Nom & " - " & FormatDuree(rs!Duree) + Else + Me.txtRecent = "(aucune saisie)" + End If + + rs.Close +End Sub + +'------------------------------------------------------------------------------- +' Sub: ClearForm +' Description: Reinitialise le formulaire +'------------------------------------------------------------------------------- +Private Sub ClearForm() + Me.txtDate = Date + Me.txtDuree = DEFAULT_DUREE + Me.txtDescription = "" + + ' Garder le dernier projet selectionne + If m_LastProjetID > 0 Then + Me.cboProjet = m_LastProjetID + Else + Me.cboProjet = Null + End If + + Me.cboProjet.SetFocus +End Sub + +'------------------------------------------------------------------------------- +' Function: ValidateForm +' Description: Valide les donnees du formulaire +'------------------------------------------------------------------------------- +Private Function ValidateForm() As Boolean + ValidateForm = False + + ' Projet obligatoire + If IsNull(Me.cboProjet) Then + ShowError "Veuillez selectionner un projet." + Me.cboProjet.SetFocus + Exit Function + End If + + ' Date obligatoire + If IsNull(Me.txtDate) Then + ShowError "Veuillez saisir une date." + Me.txtDate.SetFocus + Exit Function + End If + + ' Date ne peut pas etre dans le futur + If Me.txtDate > Date Then + ShowError "La date ne peut pas etre dans le futur." + Me.txtDate.SetFocus + Exit Function + End If + + ' Duree obligatoire et positive + If IsNull(Me.txtDuree) Or Me.txtDuree <= 0 Then + ShowError "Veuillez saisir une duree valide (> 0)." + Me.txtDuree.SetFocus + Exit Function + End If + + ' Duree raisonnable (max 24h) + If Me.txtDuree > 24 Then + ShowError "La duree ne peut pas depasser 24 heures." + Me.txtDuree.SetFocus + Exit Function + End If + + ValidateForm = True +End Function + +'------------------------------------------------------------------------------- +' Sub: SaveEntry +' Description: Sauvegarde l'entree de temps +'------------------------------------------------------------------------------- +Private Sub SaveEntry() + Dim tempsID As Long + + If Not ValidateForm() Then Exit Sub + + ' Memoriser le projet pour la prochaine saisie + m_LastProjetID = Me.cboProjet + + ' Sauvegarder via mod_DataAccess + tempsID = SaveTemps( _ + projetID:=Me.cboProjet, _ + dateEntree:=Me.txtDate, _ + duree:=Me.txtDuree, _ + description:=Nz(Me.txtDescription, "") _ + ) + + LogAction "Temps sauvegarde: ID=" & tempsID & ", Projet=" & Me.cboProjet & ", Duree=" & Me.txtDuree + + Call UpdateLastEntry +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnSauver_Click +' Description: Sauvegarde et ferme +'------------------------------------------------------------------------------- +Private Sub btnSauver_Click() + Call SaveEntry + ShowInfo MSG_SAVE_SUCCESS + DoCmd.Close acForm, Me.Name +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnSauverNouveau_Click +' Description: Sauvegarde et prepare nouvelle saisie +'------------------------------------------------------------------------------- +Private Sub btnSauverNouveau_Click() + Call SaveEntry + ShowInfo MSG_SAVE_SUCCESS + Call ClearForm +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnAnnuler_Click +' Description: Annule et ferme +'------------------------------------------------------------------------------- +Private Sub btnAnnuler_Click() + DoCmd.Close acForm, Me.Name +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnRetour_Click +' Description: Retourne au menu principal +'------------------------------------------------------------------------------- +Private Sub btnRetour_Click() + DoCmd.Close acForm, Me.Name + Call OpenFormAccueil +End Sub + +'------------------------------------------------------------------------------- +' Evenement: cboProjet_AfterUpdate +' Description: Affiche le taux horaire du projet selectionne +'------------------------------------------------------------------------------- +Private Sub cboProjet_AfterUpdate() + If Not IsNull(Me.cboProjet) Then + ' La 3e colonne contient le taux horaire + Dim taux As Currency + taux = Nz(Me.cboProjet.Column(2), 0) + Me.Caption = "Saisie de Temps - Taux: " & FormatMontant(taux) & "/h" + End If +End Sub +``` + +### Etapes de Creation dans Access + +1. **Creer le formulaire vierge** + - Onglet "Creer" > "Creation de formulaire" + - Ne pas lier a une table (Record Source vide) + +2. **Ajouter les controles** + - Disposer les labels et champs selon le design + - Utiliser l'assistant ComboBox pour cboProjet + +3. **Configurer le ComboBox cboProjet** + - Row Source Type: Table/Query + - Row Source: la requete SQL ci-dessus + - Bound Column: 1 + - Column Count: 3 + - Column Widths: 0;6cm;2cm + +4. **Configurer les valeurs par defaut** + - txtDate: =Date() + - txtDuree: 1.00 + +5. **Ajouter le code VBA** + +--- + +## 5. frm_Historique - Historique des Temps + +### Description + +Formulaire d'affichage de l'historique avec filtres multiples (dates, client, projet). + +### Proprietes du Formulaire + +| Propriete | Valeur | +|-----------|--------| +| Record Source | (dynamique via VBA) | +| Default View | Datasheet | +| Caption | Historique des Temps | +| Allow Additions | Non | +| Allow Deletions | Non | +| Allow Edits | Non | + +### Controles a ajouter + +#### Section En-tete (importante car Datasheet) + +| Controle | Nom | Proprietes | +|----------|-----|------------| +| Label | lblTitre | Caption: "Historique des Temps" | +| Label | lblDateDebut | Caption: "Du:" | +| TextBox | txtDateDebut | Format: Short Date | +| Label | lblDateFin | Caption: "Au:" | +| TextBox | txtDateFin | Format: Short Date | +| Label | lblClient | Caption: "Client:" | +| ComboBox | cboClient | Row Source: clients avec option "Tous" | +| Label | lblProjet | Caption: "Projet:" | +| ComboBox | cboProjet | Row Source: dynamique selon client | +| Button | btnFiltrer | Caption: "Filtrer" | +| Button | btnReset | Caption: "Reset" | +| Button | btnExport | Caption: "Exporter Excel" | +| Button | btnRetour | Caption: "Retour" | + +**Frame pour totaux:** +| Controle | Nom | Proprietes | +|----------|-----|------------| +| Frame | fraTotaux | Caption: "Totaux" | +| Label | lblTotalHeures | Caption: "Heures:" | +| TextBox | txtTotalHeures | Format: 0.00 h | +| Label | lblTotalMontant | Caption: "Montant:" | +| TextBox | txtTotalMontant | Format: Currency | + +#### Section Detail (colonnes Datasheet) + +Les colonnes sont definies par la requete source: +- Date +- Client +- Projet +- Duree +- Description +- Montant + +### Code VBA des Evenements + +```vba +'=============================================================================== +' Formulaire: frm_Historique +' Description: Historique des temps avec filtres +'=============================================================================== +Option Compare Database +Option Explicit + +'------------------------------------------------------------------------------- +' Evenement: Form_Load +' Description: Initialise le formulaire avec le mois en cours +'------------------------------------------------------------------------------- +Private Sub Form_Load() + Me.Caption = "Historique des Temps - " & APP_NAME + + ' Par defaut: mois en cours + Me.txtDateDebut = GetFirstDayOfMonth() + Me.txtDateFin = GetLastDayOfMonth() + + ' Initialiser les combos + Call InitCombos + + ' Charger les donnees + Call LoadData +End Sub + +'------------------------------------------------------------------------------- +' Sub: InitCombos +' Description: Initialise les ComboBox de filtres +'------------------------------------------------------------------------------- +Private Sub InitCombos() + ' Combo Clients avec option "Tous" + Me.cboClient.RowSource = "SELECT 0, '(Tous les clients)' FROM tbl_Clients " & _ + "UNION SELECT ClientID, Nom FROM tbl_Clients ORDER BY 2" + Me.cboClient = 0 + + ' Combo Projets vide au depart + Me.cboProjet.RowSource = "" + Me.cboProjet = Null +End Sub + +'------------------------------------------------------------------------------- +' Evenement: cboClient_AfterUpdate +' Description: Met a jour la liste des projets selon le client +'------------------------------------------------------------------------------- +Private Sub cboClient_AfterUpdate() + If IsNull(Me.cboClient) Or Me.cboClient = 0 Then + ' Tous les projets + Me.cboProjet.RowSource = "SELECT 0, '(Tous les projets)' FROM tbl_Projets " & _ + "UNION SELECT ProjetID, Nom FROM tbl_Projets ORDER BY 2" + Else + ' Projets du client selectionne + Me.cboProjet.RowSource = "SELECT 0, '(Tous les projets)' FROM tbl_Projets " & _ + "UNION SELECT ProjetID, Nom FROM tbl_Projets " & _ + "WHERE ClientID = " & Me.cboClient & " ORDER BY 2" + End If + Me.cboProjet = 0 +End Sub + +'------------------------------------------------------------------------------- +' Sub: LoadData +' Description: Charge les donnees selon les filtres +'------------------------------------------------------------------------------- +Private Sub LoadData() + Dim sql As String + Dim whereClause As String + + ' Construction de la requete + sql = "SELECT t.TempsID, t.Date, c.Nom AS Client, p.Nom AS Projet, " & _ + "t.Duree, t.Description, t.Duree * p.TauxHoraire AS Montant " & _ + "FROM (tbl_Temps t " & _ + "INNER JOIN tbl_Projets p ON t.ProjetID = p.ProjetID) " & _ + "INNER JOIN tbl_Clients c ON p.ClientID = c.ClientID" + + ' Construction du WHERE + whereClause = " WHERE 1=1" + + ' Filtre dates + If Not IsNull(Me.txtDateDebut) Then + whereClause = whereClause & " AND t.Date >= #" & Format(Me.txtDateDebut, "yyyy-mm-dd") & "#" + End If + + If Not IsNull(Me.txtDateFin) Then + whereClause = whereClause & " AND t.Date <= #" & Format(Me.txtDateFin, "yyyy-mm-dd") & "#" + End If + + ' Filtre client + If Not IsNull(Me.cboClient) And Me.cboClient > 0 Then + whereClause = whereClause & " AND p.ClientID = " & Me.cboClient + End If + + ' Filtre projet + If Not IsNull(Me.cboProjet) And Me.cboProjet > 0 Then + whereClause = whereClause & " AND t.ProjetID = " & Me.cboProjet + End If + + ' Requete complete + sql = sql & whereClause & " ORDER BY t.Date DESC" + + ' Appliquer comme source + Me.RecordSource = sql + + ' Calculer les totaux + Call CalculateTotals(whereClause) +End Sub + +'------------------------------------------------------------------------------- +' Sub: CalculateTotals +' Description: Calcule les totaux pour les filtres actuels +'------------------------------------------------------------------------------- +Private Sub CalculateTotals(ByVal whereClause As String) + Dim sql As String + Dim rs As DAO.Recordset + + sql = "SELECT SUM(t.Duree) AS TotalHeures, " & _ + "SUM(t.Duree * p.TauxHoraire) AS TotalMontant " & _ + "FROM (tbl_Temps t " & _ + "INNER JOIN tbl_Projets p ON t.ProjetID = p.ProjetID) " & _ + "INNER JOIN tbl_Clients c ON p.ClientID = c.ClientID" & _ + whereClause + + Set rs = CurrentDb.OpenRecordset(sql) + + If Not rs.EOF Then + Me.txtTotalHeures = FormatDuree(Nz(rs!TotalHeures, 0)) + Me.txtTotalMontant = FormatMontant(Nz(rs!TotalMontant, 0)) + Else + Me.txtTotalHeures = FormatDuree(0) + Me.txtTotalMontant = FormatMontant(0) + End If + + rs.Close +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnFiltrer_Click +' Description: Applique les filtres +'------------------------------------------------------------------------------- +Private Sub btnFiltrer_Click() + ' Validation des dates + If Not IsNull(Me.txtDateDebut) And Not IsNull(Me.txtDateFin) Then + If Me.txtDateDebut > Me.txtDateFin Then + ShowError "La date de debut doit etre anterieure a la date de fin." + Exit Sub + End If + End If + + Call LoadData +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnReset_Click +' Description: Reinitialise les filtres +'------------------------------------------------------------------------------- +Private Sub btnReset_Click() + Me.txtDateDebut = GetFirstDayOfMonth() + Me.txtDateFin = GetLastDayOfMonth() + Me.cboClient = 0 + Me.cboProjet = Null + Me.cboProjet.RowSource = "" + + Call LoadData +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnExport_Click +' Description: Exporte les donnees filtrees vers Excel +'------------------------------------------------------------------------------- +Private Sub btnExport_Click() + Dim dateDebut As Date + Dim dateFin As Date + Dim clientID As Long + + ' Recuperer les valeurs des filtres + dateDebut = Nz(Me.txtDateDebut, GetFirstDayOfMonth()) + dateFin = Nz(Me.txtDateFin, GetLastDayOfMonth()) + clientID = Nz(Me.cboClient, 0) + + ' Appeler la fonction d'export du module mod_Export + Call ExportTempsPeriodeExcel(dateDebut, dateFin, clientID) +End Sub + +'------------------------------------------------------------------------------- +' Evenement: btnRetour_Click +' Description: Retourne au menu principal +'------------------------------------------------------------------------------- +Private Sub btnRetour_Click() + DoCmd.Close acForm, Me.Name + Call OpenFormAccueil +End Sub + +'------------------------------------------------------------------------------- +' Evenement: Detail_DblClick +' Description: Double-clic sur une ligne pour modifier +'------------------------------------------------------------------------------- +Private Sub Detail_DblClick(Cancel As Integer) + ' Option: ouvrir un formulaire de modification + If Not IsNull(Me!TempsID) Then + DoCmd.OpenForm "frm_TempsDetail", , , "TempsID = " & Me!TempsID, , acDialog + Call LoadData ' Rafraichir apres modification + End If +End Sub +``` + +### Etapes de Creation dans Access + +1. **Creer le formulaire** + - Onglet "Creer" > "Creation de formulaire" + - Definir Default View: Datasheet + +2. **Important: En-tete de formulaire en mode Datasheet** + - En mode Creation, afficher l'en-tete + - Les controles de l'en-tete apparaitront au-dessus de la grille + +3. **Ajouter les filtres dans l'en-tete** + - Placer les TextBox pour les dates + - Placer les ComboBox pour client/projet + - Ajouter les boutons + +4. **Zone de totaux** + - Ajouter un cadre avec les TextBox de totaux + - Ces TextBox sont remplis par le code VBA + +5. **Configurer l'affichage Datasheet** + - Les colonnes sont definies par le RecordSource (via VBA) + - Ajuster les largeurs de colonnes si necessaire + +6. **Ajouter le code VBA** + +--- + +## Annexe A: Formulaire Popup frm_TempsDetail + +Pour modifier une entree de temps existante, creer un formulaire popup: + +### Proprietes + +| Propriete | Valeur | +|-----------|--------| +| Record Source | tbl_Temps | +| Default View | Single Form | +| Pop Up | Oui | +| Modal | Oui | +| Border Style | Dialog | + +### Controles + +| Controle | Nom | Control Source | +|----------|-----|----------------| +| TextBox | txtTempsID | TempsID (Locked: Oui) | +| ComboBox | cboProjet | ProjetID | +| TextBox | txtDate | Date | +| TextBox | txtDuree | Duree | +| TextBox | txtDescription | Description | +| Button | btnSauver | Caption: "Sauvegarder" | +| Button | btnSupprimer | Caption: "Supprimer" | +| Button | btnAnnuler | Caption: "Annuler" | + +### Code VBA + +```vba +Private Sub btnSauver_Click() + If Me.Dirty Then Me.Dirty = False + ShowInfo MSG_SAVE_SUCCESS + DoCmd.Close acForm, Me.Name +End Sub + +Private Sub btnSupprimer_Click() + If Confirm(MSG_CONFIRM_DELETE) Then + Call DeleteTemps(Me.txtTempsID) + DoCmd.Close acForm, Me.Name + End If +End Sub + +Private Sub btnAnnuler_Click() + DoCmd.Close acForm, Me.Name +End Sub +``` + +--- + +## Annexe B: Formulaire Popup frm_ProjetDetail + +### Proprietes + +| Propriete | Valeur | +|-----------|--------| +| Record Source | tbl_Projets | +| Default View | Single Form | +| Pop Up | Oui | +| Modal | Oui | +| Data Entry | Oui (pour nouveau) | + +### Controles + +| Controle | Nom | Control Source | Proprietes | +|----------|-----|----------------|------------| +| ComboBox | cboClient | ClientID | Row Source: SELECT ClientID, Nom FROM tbl_Clients ORDER BY Nom | +| TextBox | txtNom | Nom | | +| TextBox | txtDescription | Description | Height: 2 cm | +| TextBox | txtTauxHoraire | TauxHoraire | Default: 50, Format: Currency | +| CheckBox | chkActif | Actif | Default: True | +| Button | btnSauver | | Caption: "Sauvegarder" | +| Button | btnAnnuler | | Caption: "Annuler" | + +### Code VBA + +```vba +Private Sub Form_Load() + Me.Caption = "Nouveau Projet - " & APP_NAME + Me.txtTauxHoraire = DEFAULT_TAUX_HORAIRE + Me.chkActif = True +End Sub + +Private Sub btnSauver_Click() + ' Validation + If IsNull(Me.cboClient) Then + ShowError "Veuillez selectionner un client." + Me.cboClient.SetFocus + Exit Sub + End If + + If IsNull(Me.txtNom) Or Trim(Me.txtNom & "") = "" Then + ShowError "Le nom du projet est obligatoire." + Me.txtNom.SetFocus + Exit Sub + End If + + ' Sauvegarder + If Me.Dirty Then Me.Dirty = False + ShowInfo MSG_SAVE_SUCCESS + DoCmd.Close acForm, Me.Name +End Sub + +Private Sub btnAnnuler_Click() + DoCmd.Close acForm, Me.Name +End Sub +``` + +--- + +## Annexe C: Checklist de Creation + +### Pour chaque formulaire: + +- [ ] Creer le formulaire dans Access +- [ ] Definir les proprietes du formulaire +- [ ] Ajouter tous les controles avec les bons noms +- [ ] Configurer les proprietes de chaque controle +- [ ] Ajouter le code VBA des evenements +- [ ] Tester la navigation (boutons Retour) +- [ ] Tester les operations CRUD +- [ ] Tester les validations +- [ ] Verifier l'affichage (taille, couleurs) + +### Ordre de creation recommande: + +1. **frm_Accueil** (point d'entree) +2. **frm_Clients** (base, pas de dependances) +3. **frm_ProjetDetail** (popup pour creation) +4. **frm_Projets** (depend de frm_ProjetDetail) +5. **frm_SaisieTemps** (depend des projets) +6. **frm_TempsDetail** (popup pour modification) +7. **frm_Historique** (depend de frm_TempsDetail) + +--- + +## Annexe D: Themes et Styles Access + +### Couleurs recommandees + +| Element | Couleur | Code | +|---------|---------|------| +| Fond en-tete | Bleu fonce | #2C3E50 | +| Texte en-tete | Blanc | #FFFFFF | +| Boutons principaux | Bleu | #3498DB | +| Boutons danger | Rouge | #E74C3C | +| Fond formulaire | Gris clair | #ECF0F1 | + +### Application des styles + +```vba +' Dans mod_Config, ajouter: +Public Const COLOR_HEADER As Long = &H503E2C ' RGB inverse en VBA +Public Const COLOR_BUTTON As Long = &HDB9834 +Public Const COLOR_DANGER As Long = &H3C4CE7 +``` + +--- + +## Annexe E: Recapitulatif des Modules VBA Utilises + +| Formulaire | Modules utilises | Fonctions appelees | +|------------|------------------|-------------------| +| frm_Accueil | mod_Config, mod_Calculs, mod_Navigation, mod_Utils | GetAppTitle, GetNbClients, GetNbProjetsActifs, GetHeuresMoisCourant, FormatDuree, OpenForm*, Confirm | +| frm_Clients | mod_Config, mod_DataAccess, mod_Navigation, mod_Utils | MSG_CONFIRM_DELETE, DeleteClient, OpenFormAccueil, OpenFormProjets, ShowError, ShowInfo, IsValidEmail, LogAction | +| frm_Projets | mod_Config, mod_DataAccess, mod_Navigation, mod_Utils | MSG_CONFIRM_DELETE, DEFAULT_TAUX_HORAIRE, DeleteProjet, OpenFormAccueil, OpenFormSaisieTemps, ShowError, ShowInfo | +| frm_SaisieTemps | mod_Config, mod_DataAccess, mod_Navigation, mod_Utils | DEFAULT_DUREE, MSG_SAVE_SUCCESS, SaveTemps, FormatDateFR, FormatDuree, FormatMontant, ShowError, ShowInfo, LogAction | +| frm_Historique | mod_Config, mod_Calculs, mod_DataAccess, mod_Export, mod_Navigation, mod_Utils | GetFirstDayOfMonth, GetLastDayOfMonth, FormatDuree, FormatMontant, ExportTempsPeriodeExcel, ShowError, DeleteTemps | + +--- + +**Version:** 1.0 +**Date:** 2025-12-30 +**Auteur:** Documentation generee pour TimeTrack Pro diff --git a/docs/TEST_CHECKLIST.md b/docs/TEST_CHECKLIST.md new file mode 100644 index 0000000..baaebd7 --- /dev/null +++ b/docs/TEST_CHECKLIST.md @@ -0,0 +1,311 @@ +# TimeTrack Pro - Checklist de Tests Manuels + +Ce document decrit les tests manuels a effectuer pour valider le bon fonctionnement de TimeTrack Pro. + +--- + +## 1. Tests Base de Donnees (BDD) + +### 1.1 Table tbl_Clients + +| Test | Action | Resultat Attendu | OK | +|------|--------|------------------|-----| +| CREATE | Ajouter un nouveau client | Enregistrement cree avec ID auto-incremente | [ ] | +| READ | Lire la liste des clients | 4+ clients affiches | [ ] | +| UPDATE | Modifier l'email d'un client | Email mis a jour | [ ] | +| DELETE | Supprimer un client sans projets | Client supprime | [ ] | +| FK CHECK | Supprimer un client avec projets | Erreur ou cascade selon config | [ ] | + +**Commandes MCP pour tester:** + +```python +# CREATE +run_access_query(file_path, sql="INSERT INTO tbl_Clients (Nom, Email) VALUES ('Test Client', 'test@example.com')") + +# READ +get_worksheet_data(file_path, "tbl_Clients") + +# UPDATE +run_access_query(file_path, sql="UPDATE tbl_Clients SET Email = 'nouveau@example.com' WHERE Nom = 'Test Client'") + +# DELETE +run_access_query(file_path, sql="DELETE FROM tbl_Clients WHERE Nom = 'Test Client'") +``` + +### 1.2 Table tbl_Projets + +| Test | Action | Resultat Attendu | OK | +|------|--------|------------------|-----| +| CREATE | Ajouter un projet lie a un client | Projet cree avec FK valide | [ ] | +| READ | Lire les projets d'un client | Projets filtres correctement | [ ] | +| UPDATE | Modifier le taux horaire | Taux mis a jour | [ ] | +| DELETE | Supprimer un projet sans temps | Projet supprime | [ ] | +| FK CHECK | Ajouter projet avec ClientID inexistant | Erreur attendue | [ ] | + +**Commandes MCP pour tester:** + +```python +# CREATE +run_access_query(file_path, sql="INSERT INTO tbl_Projets (ClientID, Nom, TauxHoraire) VALUES (1, 'Projet Test', 75)") + +# READ avec filtre +get_worksheet_data(file_path, "tbl_Projets", where_clause="ClientID = 1") + +# UPDATE +run_access_query(file_path, sql="UPDATE tbl_Projets SET TauxHoraire = 85 WHERE Nom = 'Projet Test'") + +# DELETE +run_access_query(file_path, sql="DELETE FROM tbl_Projets WHERE Nom = 'Projet Test'") +``` + +### 1.3 Table tbl_Temps + +| Test | Action | Resultat Attendu | OK | +|------|--------|------------------|-----| +| CREATE | Ajouter une entree de temps | Entree creee | [ ] | +| READ | Lire les entrees par date | Filtrage correct | [ ] | +| UPDATE | Modifier la duree | Duree mise a jour | [ ] | +| DELETE | Supprimer une entree | Entree supprimee | [ ] | +| VALIDATION | Ajouter duree negative | Erreur ou valeur positive | [ ] | + +**Commandes MCP pour tester:** + +```python +# CREATE +run_access_query(file_path, sql="INSERT INTO tbl_Temps (ProjetID, Date, Duree, Description) VALUES (1, #2025-12-30#, 2.5, 'Test entree')") + +# READ avec filtre date +get_worksheet_data(file_path, "tbl_Temps", where_clause="Date >= #2025-12-01#") + +# UPDATE +run_access_query(file_path, sql="UPDATE tbl_Temps SET Duree = 3.0 WHERE Description = 'Test entree'") + +# DELETE +run_access_query(file_path, sql="DELETE FROM tbl_Temps WHERE Description = 'Test entree'") +``` + +--- + +## 2. Tests Modules VBA + +### 2.1 mod_Config + +| Test | Verification | OK | +|------|-------------|-----| +| APP_NAME | Constante definie = "TimeTrack Pro" | [ ] | +| APP_VERSION | Constante definie = "0.1.0" | [ ] | +| DEFAULT_TAUX | Constante definie = 50 | [ ] | + +### 2.2 mod_Utils + +| Test | Fonction | Resultat Attendu | OK | +|------|----------|------------------|-----| +| Format date | FormatDateFR(#01/15/2025#) | "15/01/2025" | [ ] | +| Format monnaie | FormatMonnaie(1234.56) | "1 234,56 EUR" | [ ] | +| Validation email | IsValidEmail("test@test.com") | True | [ ] | +| Email invalide | IsValidEmail("invalid") | False | [ ] | + +### 2.3 mod_Calculs + +| Test | Fonction | Resultat Attendu | OK | +|------|----------|------------------|-----| +| Total heures projet | GetTotalHeuresByProjet(1) | Nombre > 0 | [ ] | +| Total heures client | GetTotalHeuresByClient(1) | Nombre > 0 | [ ] | +| Montant projet | GetMontantByProjet(1) | Heures * TauxHoraire | [ ] | +| Montant client | GetMontantByClient(1) | Somme projets | [ ] | + +### 2.4 mod_DataAccess + +| Test | Fonction | Resultat Attendu | OK | +|------|----------|------------------|-----| +| Get client | GetClientByID(1) | Recordset valide | [ ] | +| Get projet | GetProjetByID(1) | Recordset valide | [ ] | +| List clients | GetAllClients() | Recordset avec 4+ items | [ ] | +| List projets actifs | GetProjetsActifs() | Recordset filtre | [ ] | + +### 2.5 mod_Navigation + +| Test | Fonction | Resultat Attendu | OK | +|------|----------|------------------|-----| +| Ouvrir accueil | OpenFormAccueil() | Formulaire ouvert | [ ] | +| Ouvrir clients | OpenFormClients() | Formulaire ouvert | [ ] | +| Fermer tout | CloseAllForms() | Tous fermes | [ ] | + +### 2.6 mod_Export + +| Test | Fonction | Resultat Attendu | OK | +|------|----------|------------------|-----| +| Export Excel | ExportToExcel("tbl_Clients", path) | Fichier .xlsx cree | [ ] | +| Export PDF | ExportToPDF("rpt_Recap", path) | Fichier .pdf cree | [ ] | + +--- + +## 3. Tests d'Integration + +### 3.1 Requetes Agregees + +| Test | Requete | Resultat Attendu | OK | +|------|---------|------------------|-----| +| Total global heures | SELECT SUM(Duree) FROM tbl_Temps | 58 heures | [ ] | +| Total par client | qry_TotalByClient | Groupement correct | [ ] | +| Total par projet | qry_TotalByProjet | Groupement correct | [ ] | +| Montant total | Heures * Taux | 4732.50 EUR | [ ] | + +**Commandes MCP pour tester:** + +```python +# Total heures +run_access_query(file_path, sql="SELECT SUM(Duree) AS TotalHeures FROM tbl_Temps") + +# Total par client +run_access_query(file_path, sql=""" + SELECT c.Nom, SUM(t.Duree) AS Heures, 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 +""") + +# Total par projet +run_access_query(file_path, sql=""" + SELECT p.Nom, SUM(t.Duree) AS Heures, p.TauxHoraire, SUM(t.Duree * p.TauxHoraire) AS Montant + FROM tbl_Projets p + INNER JOIN tbl_Temps t ON p.ProjetID = t.ProjetID + GROUP BY p.Nom, p.TauxHoraire +""") +``` + +### 3.2 Coherence des Donnees + +| Test | Verification | OK | +|------|-------------|-----| +| FK Integrite | Tous les ProjetID dans tbl_Temps existent dans tbl_Projets | [ ] | +| FK Integrite | Tous les ClientID dans tbl_Projets existent dans tbl_Clients | [ ] | +| Dates valides | Toutes les dates sont dans le passe ou aujourd'hui | [ ] | +| Durees positives | Toutes les durees > 0 | [ ] | + +**Commandes MCP pour valider:** + +```python +# Verifier FK projets orphelins +run_access_query(file_path, sql=""" + SELECT t.* FROM tbl_Temps t + LEFT JOIN tbl_Projets p ON t.ProjetID = p.ProjetID + WHERE p.ProjetID IS NULL +""") +# Resultat attendu: 0 lignes + +# Verifier FK clients orphelins +run_access_query(file_path, sql=""" + SELECT p.* FROM tbl_Projets p + LEFT JOIN tbl_Clients c ON p.ClientID = c.ClientID + WHERE c.ClientID IS NULL +""") +# Resultat attendu: 0 lignes + +# Verifier durees invalides +run_access_query(file_path, sql="SELECT * FROM tbl_Temps WHERE Duree <= 0") +# Resultat attendu: 0 lignes +``` + +--- + +## 4. Tests Formulaires (Apres Phase 5) + +### 4.1 frm_Accueil + +| Test | Action | Resultat Attendu | OK | +|------|--------|------------------|-----| +| Affichage stats | Ouvrir formulaire | Stats affichees (clients, projets, heures) | [ ] | +| Navigation clients | Clic bouton Clients | Ouvre frm_Clients | [ ] | +| Navigation projets | Clic bouton Projets | Ouvre frm_Projets | [ ] | +| Navigation saisie | Clic bouton Saisie | Ouvre frm_SaisieTemps | [ ] | + +### 4.2 frm_Clients + +| Test | Action | Resultat Attendu | OK | +|------|--------|------------------|-----| +| Liste clients | Ouvrir formulaire | Tous clients affiches | [ ] | +| Ajout client | Remplir + Enregistrer | Client ajoute | [ ] | +| Edition client | Modifier + Enregistrer | Client modifie | [ ] | +| Suppression | Supprimer client | Client supprime (si pas de projets) | [ ] | + +### 4.3 frm_Projets + +| Test | Action | Resultat Attendu | OK | +|------|--------|------------------|-----| +| Liste projets | Ouvrir formulaire | Tous projets affiches | [ ] | +| Filtre client | Selectionner client | Projets filtres | [ ] | +| Ajout projet | Remplir + Enregistrer | Projet ajoute | [ ] | +| Edition projet | Modifier taux | Projet modifie | [ ] | + +### 4.4 frm_SaisieTemps + +| Test | Action | Resultat Attendu | OK | +|------|--------|------------------|-----| +| Saisie rapide | Projet + Date + Duree + Save | Entree creee en < 30s | [ ] | +| Date par defaut | Ouvrir formulaire | Date = Aujourd'hui | [ ] | +| Validation duree | Entrer duree negative | Erreur affichee | [ ] | + +### 4.5 frm_Historique + +| Test | Action | Resultat Attendu | OK | +|------|--------|------------------|-----| +| Liste entrees | Ouvrir formulaire | Toutes entrees affichees | [ ] | +| Filtre date | Selectionner periode | Entrees filtrees | [ ] | +| Filtre client | Selectionner client | Entrees filtrees | [ ] | +| Export | Clic Export Excel | Fichier genere | [ ] | + +--- + +## 5. Performance + +| Test | Critere | Seuil | OK | +|------|---------|-------|-----| +| Ouverture BDD | Temps d'ouverture | < 3 secondes | [ ] | +| Requete agregee | Temps d'execution | < 1 seconde | [ ] | +| Saisie temps | Temps total operation | < 30 secondes | [ ] | +| Export Excel | Temps de generation | < 5 secondes | [ ] | + +--- + +## 6. Validation Finale + +| Critere | Verification | OK | +|---------|-------------|-----| +| Toutes tables creees | 3 tables presentes | [ ] | +| Tous modules injectes | 6 modules presents | [ ] | +| Donnees de demo | 4 clients, 6 projets, 58h | [ ] | +| Montant total | 4732.50 EUR | [ ] | +| Aucune erreur BDD | Pas d'erreurs SQL | [ ] | +| Documentation complete | README, PLAN, CHANGELOG | [ ] | + +--- + +## Notes + +- **Chemin fichier:** `C:\Users\alexi\Documents\projects\timetrack-pro\db\TimeTrackPro.accdb` +- **Date de creation:** 2025-12-30 +- **Version testee:** 0.1.0 +- **Testeur:** _______________ + +--- + +## Resultats + +| Section | Tests | Passes | Echecs | +|---------|-------|--------|--------| +| BDD - Clients | 5 | | | +| BDD - Projets | 5 | | | +| BDD - Temps | 5 | | | +| VBA - Modules | 16 | | | +| Integration | 8 | | | +| Formulaires | 18 | | | +| Performance | 4 | | | +| **TOTAL** | **61** | | | + +**Statut global:** [ ] PASSE / [ ] ECHEC + +**Commentaires:** + +---